Table des matières
Avant-propos
Environnement de développement.
Préparation
Maison interface Web js tutoriel Comment implémenter la fonction de paiement par analyse de code WeChat dans l'environnement nodejs ?

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

Jun 05, 2018 pm 05:18 PM
nodejs 扫码支付

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nodejs est-il un framework backend ? Nodejs est-il un framework backend ? Apr 21, 2024 am 05:09 AM

Node.js peut être utilisé comme framework backend car il offre des fonctionnalités telles que des performances élevées, l'évolutivité, la prise en charge multiplateforme, un écosystème riche et une facilité de développement.

Comment connecter Nodejs à la base de données MySQL Comment connecter Nodejs à la base de données MySQL Apr 21, 2024 am 06:13 AM

Pour vous connecter à une base de données MySQL, vous devez suivre ces étapes : Installez le pilote mysql2. Utilisez mysql2.createConnection() pour créer un objet de connexion contenant l'adresse de l'hôte, le port, le nom d'utilisateur, le mot de passe et le nom de la base de données. Utilisez connection.query() pour effectuer des requêtes. Enfin, utilisez connection.end() pour mettre fin à la connexion.

Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Apr 21, 2024 am 05:18 AM

Il existe deux fichiers liés à npm dans le répertoire d'installation de Node.js : npm et npm.cmd. Les différences sont les suivantes : différentes extensions : npm est un fichier exécutable et npm.cmd est un raccourci de fenêtre de commande. Utilisateurs Windows : npm.cmd peut être utilisé à partir de l'invite de commande, npm ne peut être exécuté qu'à partir de la ligne de commande. Compatibilité : npm.cmd est spécifique aux systèmes Windows, npm est disponible multiplateforme. Recommandations d'utilisation : les utilisateurs Windows utilisent npm.cmd, les autres systèmes d'exploitation utilisent npm.

Quelles sont les variables globales dans nodejs Quelles sont les variables globales dans nodejs Apr 21, 2024 am 04:54 AM

Les variables globales suivantes existent dans Node.js : Objet global : global Module principal : processus, console, nécessiter Variables d'environnement d'exécution : __dirname, __filename, __line, __column Constantes : undefined, null, NaN, Infinity, -Infinity

Y a-t-il une grande différence entre nodejs et java ? Y a-t-il une grande différence entre nodejs et java ? Apr 21, 2024 am 06:12 AM

Les principales différences entre Node.js et Java résident dans la conception et les fonctionnalités : Piloté par les événements ou piloté par les threads : Node.js est piloté par les événements et Java est piloté par les threads. Monothread ou multithread : Node.js utilise une boucle d'événements monothread et Java utilise une architecture multithread. Environnement d'exécution : Node.js s'exécute sur le moteur JavaScript V8, tandis que Java s'exécute sur la JVM. Syntaxe : Node.js utilise la syntaxe JavaScript, tandis que Java utilise la syntaxe Java. Objectif : Node.js convient aux tâches gourmandes en E/S, tandis que Java convient aux applications de grande entreprise.

Nodejs est-il un langage de développement back-end ? Nodejs est-il un langage de développement back-end ? Apr 21, 2024 am 05:09 AM

Oui, Node.js est un langage de développement backend. Il est utilisé pour le développement back-end, notamment la gestion de la logique métier côté serveur, la gestion des connexions à la base de données et la fourniture d'API.

Comment déployer le projet nodejs sur le serveur Comment déployer le projet nodejs sur le serveur Apr 21, 2024 am 04:40 AM

Étapes de déploiement de serveur pour un projet Node.js : Préparez l'environnement de déploiement : obtenez l'accès au serveur, installez Node.js, configurez un référentiel Git. Créez l'application : utilisez npm run build pour générer du code et des dépendances déployables. Téléchargez le code sur le serveur : via Git ou File Transfer Protocol. Installer les dépendances : connectez-vous en SSH au serveur et installez les dépendances de l'application à l'aide de npm install. Démarrez l'application : utilisez une commande telle que node index.js pour démarrer l'application ou utilisez un gestionnaire de processus tel que pm2. Configurer un proxy inverse (facultatif) : utilisez un proxy inverse tel que Nginx ou Apache pour acheminer le trafic vers votre application

Lequel choisir entre nodejs et java ? Lequel choisir entre nodejs et java ? Apr 21, 2024 am 04:40 AM

Node.js et Java ont chacun leurs avantages et leurs inconvénients en matière de développement Web, et le choix dépend des exigences du projet. Node.js excelle dans les applications en temps réel, le développement rapide et l'architecture de microservices, tandis que Java excelle dans la prise en charge, les performances et la sécurité de niveau entreprise.

See all articles