Maison > interface Web > js tutoriel > le corps du texte

Comment implémenter la fonction de paiement par analyse de code WeChat dans l'environnement nodejs ?

亚连
Libérer: 2018-06-05 17:18:48
original
1545 Les gens l'ont consulté

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.

Avant-propos

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

Environnement de développement.

  • nodejs v8.1.0

  • egg v1.1.0

Préparation

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}&notify_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签名方式
Copier après la connexion

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: &#39;POST&#39;,
      content: formData,
      headers: {
        &#39;content-type&#39;: &#39;text/html&#39;,
      },
    });

  // 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 === &#39;object&#39;) {
      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 === &#39;object&#39;) {
            message[key] = formMessage(val);
          } else {
            message[key] = (val || &#39;&#39;).trim();
          }
        } else {
          message[key] = [];
          for (var j = 0, k = item.length; j < k; j++) {
            message[key].push(formMessage(itemp[j]));
          }
        }
      }
    }
    return message;
  }
Copier après la connexion

La méthode de requête egg est utilisée ci-dessus. Le nœud natif peut utiliser request

var request = require(&#39;request&#39;);
  request({
    url: url,
    method: "POST",
    body: formData
  }, function(error, response, body) {
    if (!error && response.statusCode == 200) {
    }
  });
Copier après la connexion

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

  1. L'algorithme de signature doit être écrit correctement, sinon il ne fonctionnera pas. Il réussira, l'épissage doit être correct

  2. 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

  3. 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

  4. 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!

É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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!