Préparation
Compte public WeChat-appid
Compte marchand WeChat-mch_id
Valeur clé (obligatoire pour l'algorithme de signature, en fait un Pour un mot de passe de 32 bits, vous pouvez utiliser md5 pour en générer un) (chemin de configuration des clés : WeChat Merchant Platform (pay.weixin.qq.com)-->Paramètres du compte-->Sécurité de l'API-->Paramètres des clés)
Scannez le code QR pour payer - passez une commande en un seul endroit
Ce qui suit est le mode WeChat 2 car il est plus 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签名方式
Ci-dessus sont quelques 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; }
Utilisez-le ci-dessus Avec la méthode de requête egg, 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 aboutit, un fichier XML finira par être envoyé. être renvoyé, puis nous l'analyserons au format json, qui contiendra A code_url et 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 compléter le paiement
Surveiller si le paiement a réussi
Une fois l'opération ci-dessus terminée, nous devons savoir si l'utilisateur a effectué le paiement, car l'utilisateur restera sur cette page et nous devons informer l'utilisateur que le paiement a réussi une fois que l'utilisateur a terminé 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 requête de temps en temps. À ce moment-là, l'arrière-plan de notre 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. l'arrière-plan, puis l'arrière-plan demandera après l'avoir reçu. L'adresse de l'interface de requête de WeChat est https://api.mch.weixin.qq.com/pay/orderquery Le processus est le même que ci-dessus, sauf que l'interface. L'adresse 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. fermez la minuterie.
Adresse de rappel
Il s'agit d'une partie très importante. La plupart des opérations peuvent effectivement être effectuées dessus, mais il existe des situations particulières, telles que les utilisateurs de l'ordinateur. est déconnecté et ne peut pas envoyer de demandes, mais le téléphone mobile est utilisé pour payer, 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-> ; Scannez le code QR Après avoir payé
, ce que nous devons faire est d'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 ne l'est pas. pris en charge, vous pouvez obtenir des données vides
Il convient également de noter ici que lors de la sauvegarde des informations de paiement de l'utilisateur, il faut d'abord vérifier si la commande a été payée pour éviter des opérations répétées et la possibilité d'insérer plusieurs records
Résumé
Il y a encore quelques pièges dans le paiement par code scan WeChat. Si c'est votre première fois, voici une liste de choses dont vous avez besoin. faites attention à
L'algorithme de signature doit être écrit correctement, sinon il ne réussira pas. Il doit être épissé correctement
WeChat renvoie. données au format XML. Nous devons les convertir en json via un plug-in, ce qui est pratique. Obtenir des données
Le code_url renvoyé est utilisé pour générer un code QR pour le front-end. , puis une minuterie doit être configurée 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 pour nos besoins backend. publier pour recevoir les informations de rappel renvoyées par WeChat, puis enregistrer 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 renvoyées sont au format XML et le backend doit garantir qu'elles peuvent être reçues de la manière normale et des paramètres supplémentaires sont requis.
Recommandations associées :
Mode de paiement par code scan WeChat
Exemple de partage de code php pour mettre en œuvre le paiement par code scan WeChat
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!