Maison > Java > javaDidacticiel > Explication détaillée des exemples de développement de paiements par compte public WeChat (Java)

Explication détaillée des exemples de développement de paiements par compte public WeChat (Java)

零下一度
Libérer: 2017-07-19 13:26:20
original
3955 Les gens l'ont consulté

Dans le passé, le paiement dans le développement du projet de l'entreprise se faisait en utilisant le paiement d'Alibaba, qui était qualifié de simple et informel. Malheureusement, maintenant l'entreprise a développé un compte officiel WeChat, je me suis donc lancé dans le développement du paiement WeChat qui regorge de fonctionnalités. pièges. . .

Processus commercial :

Ce site officiel de WeChat l'explique en détail (portail :).

 

Le processus général est le suivant : l'utilisateur clique sur un bouton de paiement -->Traitement en arrière-plan (en fait, il encapsule les données nécessaires au paiement et obtient prepay_id, et puis le combine avec Certains paramètres requis sont encapsulés et transmis à la réception) --> La réception reçoit les données et appelle le js de WeChat pour traiter les données et appeler le paiement--> saisir un mot de passe, y compris le montant et d'autres informations--> Une fois que l'utilisateur a saisi le mot de passe, une page de paiement réussie apparaîtra en même temps, WeChat rappellera notre interface pour nous en informer. résultat du paiement (cette partie du processus est effectuée par WeChat lui-même, nous n'avons pas à nous en soucier) -->

Étapes de développement :

1. Mettre en place un répertoire de paiement

Ce document officiel est très dégoûtant. J'étais confus et un peu étourdi après l'avoir lu. Même si je ne comprends pas, je trouve que ça a l'air génial ! Portail :

2. Définir le nom de domaine autorisé

Ces 2 étapes Une fois que vous avez terminé, vous pouvez faire une pause car le grand gouffre arrive. . .

3. Le serveur marchand appelle l'interface de commande unifiée pour demander une commande

Qu'est-ce que cela fait ? Quand j’ai commencé à le faire, j’étais confus, mais qui appelle l’équipe de paiement WeChat nb, comment peuvent-ils montrer leur sophistication sans ajouter des choses que vous ne comprenez pas ? . . Si vous ne comprenez pas, suivez simplement le document

Portail : le responsable de WeChat a donné une explication détaillée des paramètres. Après l'avoir longuement regardé, je l'ai résumé en encapsulant quelques paramètres nécessaires puis en accédant à cette interface pour obtenir des données. Voici plusieurs paramètres couramment utilisés. Copiez directement l'introduction d'autres personnes en détail :

appid ==Application ID==Connectez-vous à la configuration backend-development-basic du compte officiel WeChat
mch_id = = ID du marchand de paiement WeChat == Connectez-vous au backend de paiement WeChat et vous verrez
device_info == Numéro de l'appareil == Numéro de l'appareil du terminal (numéro du magasin ou ID de l'appareil du caissier). Remarque : veuillez transmettre « WEB ».
body==Description du produit==Une brève description du produit ou de l'ordre de paiement (il est recommandé de l'envoyer en anglais au début, essayez de ne pas l'envoyer en chinois d'abord, sinon il n'y aura aucun moyen pour vérifier s'il y a un problème avec la signature plus tard)
trade_type==Trade type==Les valeurs sont les suivantes : JSAPI, NATIVE, APP. Le JSAPI que nous utilisons ici. Comme le titre l'indique déjà, il s'agit du paiement par compte officiel WeChat. Pour leurs différences, veuillez vous référer à
ps : JSAPI--paiement par compte officiel, NATIVE--paiement par scan code natif, APP--paiement par application, les paramètres de l'interface de commande unifiée trade_type peuvent être trouvés ici. MICROPAY--Paiement par carte Swipe. Le paiement par carte a une interface de paiement distincte et n'appelle pas l'interface de commande unifiée
nonce_str==random string==chaîne aléatoire, ne dépassant pas 32 bits (algorithme de référence)
notify_url==Adresse de notification==L'adresse de rappel pour recevoir les notifications asynchrones de paiement WeChat. L'URL de notification doit être une URL directement accessible et ne peut pas contenir de paramètres. (Ici, qu'est-ce qu'un bon nom ? Nommez-le avec désinvolture, vous n'en aurez pas besoin avant un moment de toute façon)
out_trade_no==Numéro de commande du marchand==Le numéro de commande dans le système marchand, dans les 32 caractères, peut be Contient des lettres (référence :) (Chaque fois que je lis l'explication officielle sur WeChat, je suis de plus en plus confus. Y en a-t-il ? Ce n'est pas grave, j'en enverrai juste 1.)
total_fee ==Montant total= =Montant total de la commande, L'unité est le centime (attention, je n'y ai pas fait attention au début, ce qui a été passé était de 0,01. Pour le développement, 1 centime est utilisé, et puis c'est devenu une tragédie. Après l'avoir lu plusieurs fois, j'ai découvert que l'unité est en cents. )
openid==user ID==trade_type=JSAPI, ce paramètre doit être transmis, l'identifiant unique de l'utilisateur sous. l'appide du marchand. (Si vous ne savez pas d'où cela vient, ce n'est pas grave. WeChat n'a-t-il pas écrit le document pour nous ?)
Et le plus important, les caractères importants apparaissent toujours à la fin.
attach==Les données de pièce jointe, renvoyées telles quelles dans l'API de requête et la notification de paiement, peuvent être utilisées comme paramètres personnalisés. (Je pense que cela est très utile et peut être utilisé pour stocker des données commerciales, car je traite les données commerciales dans les rappels WeChat. Il est sûr et indolore d'utiliser ce paramètre)
sign==signature==algorithme de signature officiel . . Je ne le comprends pas, je ne le comprends pas très bien. Si vous pensez le comprendre, ce n'est pas grave si vous ne rencontrez pas quelques erreurs de signature, êtes-vous gêné de dire que vous avez effectué un paiement WeChat. développement ? (Je recommande personnellement d'utiliser les outils du SDK officiel lors du développement, ce qui peut économiser de l'argent. C'est très compliqué de télécharger le SDK et d'appeler des exemples correspondant à l'API Java ici. Il contient de nombreux outils)
a dit que ce signe a un paramètre plus important. Paramètres impliqués dans la signature. Quoi qu'il en soit, j'ai mis du temps à le trouver. (L'entreprise a demandé le paiement WeChat. Quand je le lui ai demandé, son expression ressemblait à ceci.)
key==chemin de configuration de la clé : plateforme marchande WeChat (pay.weixin.qq.com) -- >Paramètres du compte-->Sécurité API-->Paramètres des clés (c'est très important, il est utilisé pour les signatures)

Le résumé de cette partie consiste d'abord à encapsuler les données dans une carte puis à les convertir en XML via un outil (l'outil est mentionné ci-dessus, revenez en arrière et lisez-le vous-même), puis demandez l'[Interface de commande unifiée WeChat] via une demande de publication. S'il n'y a pas de problème avec le signe, il renverra un fichier XML contenant beaucoup de données. Ce que nous voulons, c'est prepay_id, qui est ce paramètre. Ensuite, la signature est générée et renvoyée à la réception. OK, cette étape est terminée.

Résumé du problème (problèmes que j'ai rencontrés au cours de ce processus) : 1 (Important) appid et openid doivent correspondre, en d'autres termes, l'openid de l'utilisateur doit être sous le compte officiel actuel des utilisateurs (nous avons plusieurs publics comptes, vous ne rencontrerez peut-être pas ce problème, mais c'est très important, laissez-moi en parler d'abord) 2

<span style="text-decoration: underline; color: #ff0000">第二步,生成签名并返回到前台</span><span style="color: #ff0000">这个过程中一定要注意参数一定要写对了,大小写,是否有空格,我在这上面掉了一个大坑,界面调用支付时一直闪退,注意.<br><br></span>
Copier après la connexion

4. H5 est activé JS intégré de WeChat Pay

Les paramètres renvoyés par l'arrière-plan à la réception doivent inclure les éléments suivants :
appId==Ceci est inchangé==Ne jamais changer
timeStamp==Timestamp ==Règle :. Après l’avoir lu, j’ai toujours l’air confus. Ce n’est pas grave, nous avons la classe d’outils.

nonceStr == Quoi qu'il en soit, j'ai utilisé la même chaîne aléatoire que la signature tout à l'heure. Théoriquement, cela ne devrait pas avoir d'importance si vous ne l'utilisez pas. Les amis diligents peuvent essayer

package==order details extend string==prepay_id valeur du paramètre renvoyée par l'interface de commande unifiée. : prepay_id=** *(Vous l'avez bien deviné. Le prepay_id que nous avons obtenu avec tant d'efforts est utilisé ici)
signType==Signature method==Signature algorithm, prend actuellement en charge MD5
paySign ==Signature== Cette signature doit être régénérée en arrière-plan. Utilisez les 4 paramètres ci-dessus + une clé (ne changez jamais). (L'horodatage lorsque j'ai généré la signature et l'horodatage renvoyé à la réception sont les mêmes timeStamp. Est-ce que ça marche s'ils sont différents ? Il n'y a pas de vérification)
Code pour générer paySign
Remarque : lors de la génération de prepay_id, l'appid est un i minuscule. Lors de la génération de paySign, l'appId est un I majuscule. Ces deux sont différents
Si Si tout se passe bien, cette page apparaîtra
Une fois tout cela terminé, vous pourrez vous détendre
Cinq, traitement des rappels WeChat

Cette partie comporte les 3 petites étapes suivantes

 1) Analyser les informations de flux transmises et vérifier les informations contenues dans le flux en signant à nouveau Exactitude. Il s'agit de déterminer si les informations ont été envoyées par WeChat

2) Si return_code et result_code sont tous deux SUCCÈS, gérez la propre logique métier du commerçant. Il s'agit simplement du statut de paiement de la commande et de quelques autres informations.

3) Dites à WeChat que j'ai reçu votre valeur de retour. Pas besoin de poster à nouveau.

Sans plus attendre, postons simplement le code !

public String return_data(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("微信支付请求回调了");
        String resXml = "";
        Map<String, String> backxml = new HashMap<String, String>();
        InputStream inStream;try {
            inStream = request.getInputStream();
            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inStream.close();
            String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息Map<String, String> map = WXPayUtil.xmlToMap(result);if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {if (WXPayUtil.isSignatureValid(map, PayConfigUtil.API_KEY)) {
                    logger.info("微信支付-签名验证成功");//                    backxml.put("return_code", "SUCCESS");//                    backxml.put("return_msg", "OK");//                    String toXml = WXPayUtil.mapToXml(backxml);//                    response.getWriter().write(toXml);resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";//业务处理开始                   //业务处理结束                }
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }return resXml;
    }
Copier après la connexion

N'oubliez pas, 3. Le serveur marchand appelle l'interface de commande unifiée pour demander un paramètre de commande attacher Eh bien, c'est très pratique d'apporter des données commerciales ici

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal