


Comment implémenter la fonction de paiement par analyse de code WeChat dans l'environnement 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}¬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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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.

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

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.

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.

É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

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.
