Cet article utilise des exemples de code pour expliquer en détail comment utiliser nodejs pour écrire la fonction de paiement par code scan WeChat. Les amis intéressés peuvent s'y référer.
Cet article enregistre principalement les problèmes que j'ai rencontrés lors du processus de paiement par scan code WeChat pour donner à chacun une référence. J'espère qu'il vous sera utile
nodejs v8.1.0
egg v1.1.0
Compte public WeChat-appid
Compte marchand WeChat-mch_id
valeur clé (obligatoire pour l'algorithme de signature, il s'agit en fait d'un mot de passe de 32 bits, vous pouvez utiliser md5 pour en générer un) ( Chemin de configuration de la clé : Plateforme marchande WeChat (pay.weixin.qq.com)-->Paramètres du compte-->Sécurité API-->Paramètres clés)
Scannez le code QR pour payer une commande unifiée
Le mode WeChat 2 est utilisé ci-dessous car il est relativement simple
let MD5 = require('md5'), xml2js = require('xml2js'), url = "https://api.mch.weixin.qq.com/pay/unifiedorder",// 下单请求地址 appid = '公众号id', mch_id = '微信商户号'; notify_url = '回调地址', out_trade_no = '自己设置的订单号',// 微信会有自己订单号、我们自己的系统需要设置自己的订单号 total_fee = '订单金额',// 注意,单位为分 body = '商品简单描述', trade_type = 'NATIVE',// 交易类型,JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付 nonce_str = moment().format('YYYYMMDDHHmmssSSS'),// 随机字符串32位以下 stringA = `appid=${公众号id}&body=${body}&mch_id=${微信商户号}&nonce_str=${nonce_str}¬ify_url=${ notify_url}&out_trade_no=${out_trade_no}&spbill_create_ip=${ctx.request.ip}&total_fee=${total_fee}&trade_type=${trade_type}`, stringSignTemp = stringA + "&key=xxxxxxxxxxxxxxxxx", //注:key为商户平台设置的密钥key sign = MD5(stringSignTemp).toUpperCase(); //注:MD5签名方式
Voici quelques-uns des paramètres dont nous avons besoin
Pour l'algorithme de génération de signature, voir WeChat officiel : https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3
spbill_create_ip est l'adresse IP du terminal
Coupons tous les paramètres en XML
const formData = "<xml>"; formData += "<appid>" + appid + "</appid>"; //appid formData += "<body>" + body + "</body>"; //商品或支付单简要描述 formData += "<mch_id>" + mch_id + "</mch_id>"; //商户号 formData += "<nonce_str>" + nonce_str + "</nonce_str>"; //随机字符串,不长于32位 formData += "<notify_url>" + notify_url + "</notify_url>"; //支付成功后微信服务器通过POST请求通知这个地址 formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>"; //订单号 formData += "<total_fee>" + total_fee + "</total_fee>"; //金额 formData += "<spbill_create_ip>" + ctx.request.ip + "</spbill_create_ip>"; //ip formData += "<trade_type>NATIVE</trade_type>"; //NATIVE会返回code_url ,JSAPI不会返回 formData += "<sign>" + sign + "</sign>"; formData += "</xml>"; // 这里使用了egg里面请求的方式 const resultData = yield ctx.curl(url, { method: 'POST', content: formData, headers: { 'content-type': 'text/html', }, }); // xml转json格式 xml2js.parseString(resultData.data, function (err, json) { if (err) { new Error("解析xml报错") } else { var result = formMessage(json.xml); // 转换成正常的json 数据 console.log(result) //打印出返回的结果 } }) var formMessage = function (result) { var message = {}; if (typeof result === 'object') { var keys = Object.keys(result); for (var i = 0; i < keys.length; i++) { var item = result[keys[i]]; var key = keys[i]; if (!(item instanceof Array) || item.length === 0) { continue; } if (item.length === 1) { var val = item[0]; if (typeof val === 'object') { message[key] = formMessage(val); } else { message[key] = (val || '').trim(); } } else { message[key] = []; for (var j = 0, k = item.length; j < k; j++) { message[key].push(formMessage(itemp[j])); } } } } return message; }
La méthode de requête egg est utilisée ci-dessus. Le nœud natif peut utiliser request
var request = require('request'); request({ url: url, method: "POST", body: formData }, function(error, response, body) { if (!error && response.statusCode == 200) { } });
Si la requête réussit, un XML sera finalement renvoyé, puis nous analyserons. au format json, qui aura un code_url et un out_trade_no, nous devons renvoyer ces deux-là au front-end, puis générer un code QR à afficher à l'utilisateur pour scanner le code pour finaliser le paiement
Surveiller si le paiement a réussi
Ci-dessus Une fois l'opération terminée, nous devons savoir si l'utilisateur a effectué le paiement, car l'utilisateur restera sur cette page et nous devons en informer l'utilisateur que le paiement a réussi une fois que l'utilisateur a effectué le paiement.
Tout d'abord, lorsque l'utilisateur initie le paiement, nous générerons un code QR pour permettre à l'utilisateur de scanner le code pour payer. Ce que nous devons également faire est de configurer une minuterie et d'envoyer une demande à chaque fois. de temps en temps, notre backend de nœud doit écrire une interface pour interroger les commandes. Auparavant, nous obtenions out_trade_no, qui est le numéro de commande dans notre système, nous envoyons ces données à l'interface de requête de commande du backend, puis après l'avoir reçue, le. Le backend demandera une requête WeChat. L'adresse de l'interface https://api.mch.weixin.qq.com/pay/orderquery, le processus est le même que ci-dessus, sauf que l'adresse de l'interface est différente du XML renvoyé par WeChat. les champs renvoyés auront le statut SUCCESS et NOTPAY. Nous pouvons le renvoyer au front-end en jugeant s'il faut payer. Après le succès, il indiquera à l'utilisateur que le paiement a réussi et fermera le minuteur.
Adresse de rappel
Il s'agit d'une partie très importante. La plupart des opérations peuvent en fait être effectuées ci-dessus, mais il existe des circonstances particulières, telles que la déconnexion de l'ordinateur de l'utilisateur du réseau. Internet. La demande ne peut pas être envoyée, mais le paiement mobile est effectué, ce qui nous empêchera d'enregistrer les informations de paiement de l'utilisateur. À l'heure actuelle, l'adresse de rappel est très importante
Définir l'adresse de rappel
WeChat Merchant Center->Product Center->Configuration de développement->Scan QR code à payer
Ce que nous devons faire après cela, c'est utiliser POST sur le backend pour recevoir les informations de rappel asynchrone envoyées par WeChat, qui sont également au format XML. Notez ici que si la réception de XML n'est pas prise en charge, vous. peut obtenir des données vides
Ici. Il convient également de noter que lors de la sauvegarde des informations de paiement de l'utilisateur, nous devons d'abord vérifier si la commande est payée pour éviter des opérations répétées, qui peuvent insérer plusieurs enregistrements
Résumé
Il y a encore des pièges dans le paiement par scan code WeChat. Si c'est votre première fois, voici une liste de choses auxquelles vous devez prêter attention
L'algorithme de signature doit être écrit correctement, sinon il ne fonctionnera pas. Il réussira, l'épissage doit être correct
WeChat renvoie les données au format XML, il faut convertir. dans json via le plug-in, afin qu'il soit pratique d'obtenir les données
Le code_url renvoyé est utilisé pour générer un code QR pour le front-end, puis une minuterie a besoin à configurer pour vérifier si la commande a été payée, et enfin l'utilisateur est informé du résultat
L'adresse de rappel est très importante, notre backend doit poster pour recevoir le rappel informations renvoyées par WeChat, puis enregistrez les informations. Cependant, avant d'enregistrer les informations de paiement de l'utilisateur, nous devons savoir si la commande a été enregistrée pour éviter des ajouts répétés. De plus, les données XML renvoyées doivent être garanties par le backend pour pouvoir les recevoir. Elles ne peuvent pas être reçues de la manière normale et nécessitent des paramètres supplémentaires.
J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.
Articles connexes :
Exemple de regroupement de données de v-for dans Vue
vue2.0 calculé calcule la valeur accumulée après la liste Exemple de boucle
vue.js Exemple de boucle imbriquée, si jugement, suppression dynamique
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!