Maison >Applet WeChat >Développement WeChat >Développement des paiements du compte public Nodejs WeChat

Développement des paiements du compte public Nodejs WeChat

高洛峰
高洛峰original
2017-01-04 16:52:002031parcourir

Développement de la fonction de compte public odeJs WeChat, la page mobile H5 appelle la fonction de paiement de WeChat. Ces derniers jours, les pages node et h5 ont été utilisées pour appeler la fonction de paiement de WeChat en fonction des besoins de l'entreprise afin de répondre aux exigences de paiement. Reprenons maintenant le processus de développement pour aider davantage de développeurs à mener à bien le développement des fonctions de paiement WeChat. (WeChat ne fournit pas encore de fonction de paiement par nœud)

1. Demande de CODE

Le but de la demande de code est d'obtenir l'openid de l'utilisateur (l'identifiant unique de l'utilisateur par rapport au compte officiel actuel) et access_token. API demandée : https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
Cette API doit faire attention à plusieurs paramètres :

1. appid L'appid du compte officiel peut être vu dans le compte officiel
2. redirect_uri Adresse de rappel WeChat personnalisée WeChat passera à l'adresse de redirect_uri que vous avez définie après avoir demandé l'adresse ci-dessus. code, le redirect_url a besoin ici de **url_encode** *php*. Si votre programme est un nœud, vous devez utiliser l'encodage **encodeURLComponent(url)**
response_type=code, il n'y a rien à dire à ce sujet. . Correction de réponse_type=code, pour des instructions détaillées, veuillez vous référer aux instructions sur le site officiel de WeChat
4 scope=snsapi_userinfo, écrivez-le simplement comme ceci, pour des instructions détaillées, veuillez consulter les instructions sur le site officiel de WeChat5. state=STATE, écrivez-le simplement comme ceci, pour des instructions détaillées, vous pouvez consulter les instructions sur le site officiel de WeChat
6. Wechat_redirect peut être écrit comme ceci Pour des instructions détaillées, vous pouvez consulter les instructions sur le. Site officiel de WeChat
ps : Lien du site officiel :

2. Obtenez access_token via le code, openid

La valeur du code a été obtenue dans la première étape, vous devez ensuite obtenir le valeur de access_token et openid via le code. L'API demandée

API https://api.weixin.qq .com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
La description du paramètre du api ici :

1. ID du compte officiel appid WeChat, obtenu à partir de l'arrière-plan du compte officiel WeChat

2. Le secret est la clé du compte officiel WeChat. Obtenez-le à partir de l'arrière-plan du compte officiel WeChat.
3. Code. La première étape consiste à utiliser le code
4. Corrigez simplement grant_type=authorization_code

3. Appelez l'interface

access_token via access_token. pour exécuter les fonctions suivantes. Vous pouvez vous référer à l'exemple officiel :

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&lang=zh_CN

4. Appelez l'API de paiement sur la page web

En voyant cela, vous sentez que c'est presque fini. Tant que la page web appelle la fonction de paiement WeChat, ce sera fini ? Non, même pas fermer

Ouvrez la page Web H5 dans le navigateur WeChat et exécutez JS pour activer le paiement. Le format des données d'entrée et de sortie de l'interface est JSON.
Remarque : les objets intégrés WeixinJSBridge ne sont pas valides dans les autres navigateurs.
L'exemple de code est le suivant :

function onBridgeReady(){
 WeixinJSBridge.invoke(
 'getBrandWCPayRequest', {
  "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
  "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
  "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
  "package" : "prepay_id=u802345jgfjsdfgsdg888", 
  "signType" : "MD5",  //微信签名方式: 
  "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
 },
 function(res){ 
  if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 
 }
 ); 
}
if (typeof WeixinJSBridge == "undefined"){
 if( document.addEventListener ){
 document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
 }else if (document.attachEvent){
 document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
 document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
 }
}else{
 onBridgeReady();
}
En voyant le code ci-dessus, si vous souhaitez appeler la fonction de paiement de WeChat, vous devez transmettre des paramètres,

{
 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
 "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
 "package" : "prepay_id=u802345jgfjsdfgsdg888", 
 "signType" : "MD5",  //微信签名方式: 
 "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
}
Description du paramètre :

1. appId // Nom du compte officiel, transmis par le commerçant

2. timeStamp // Timestamp, le nombre de secondes depuis 1970. Une attention particulière doit être portée ici, elle doit être le format d'horodatage d'une chaîne, ce qui signifie qu'il doit être "" guillemets
3. nonceStr //Chaîne aléatoire 32 bits, et la méthode sera fournie plus tard
4. >5. paySign //Signature WeChat, alors il sera dit
6. **package** //C'est le plus important. Où l'avez-vous obtenu ? Suivant.
ps : Description de l'interface officielle du site Web
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

5. à partir de l'interface de commande unifiée de WeChat, on obtient prepay_id

API officielle :

https://api.mch.weixin.qq.com/pay/unifiedorder


Il existe de nombreux paramètres de requête, mais certains d'entre eux ne sont pas nécessaires. Voici les paramètres requis

L'interface de commande unifiée de WeChat nécessite la transmission de données XML, et les données doivent également être signées, alors signez d'abord les données.
{
 appid : APPID,
 attach : ATTACH,
 body : BODY,
 mch_id : MCH_ID,
 nonce_str: NONCE_STR,
 notify_url : NOTIFY_URL,// 微信付款后的回调地址
 openid : OPENID,
 out_trade_no : OUT_TRADE_NO ,//new Date().getTime(), //订单号
 spbill_create_ip : SPBILL_CREATE_IP , //客户端的 ip
 total_fee : TOTAL_FEE, //商品的价格, 此处需要注意的是这个价格是以分算的, 那么一般是元, 你需要转换为 RMB 的元
 trade_type : 'JSAPI',
}
Pour les règles de signature, vous pouvez vous référer aux règles de signature données par WeChat (la méthode de signature sera donnée plus tard)

Règles de signature officielles de WeChat :
https://pay.weixin.qq.com/wiki /doc/api/ jsapi.php?chapter=4_3

Après avoir généré la signature, vous devez assembler les données au format XML :

L'étape suivante consiste à demander l'API pour obtenir la valeur de prepay_id et convertir le XML obtenu ci-dessus. L'API sous la demande de données est envoyée à WeChat. WeChat remettra la valeur souhaitée après avoir vérifié que les données sont OK.
var body = &#39;<xml> &#39; +
 &#39;<appid>&#39;+config.wxappid+&#39;</appid> &#39; +
 &#39;<attach>&#39;+obj.attach+&#39;</attach> &#39; +
 &#39;<body>&#39;+obj.body+&#39;</body> &#39; +
 &#39;<mch_id>&#39;+config.mch_id+&#39;</mch_id> &#39; +
 &#39;<nonce_str>&#39;+obj.nonce_str+&#39;</nonce_str> &#39; +
 &#39;<notify_url>&#39;+obj.notify_url+&#39;</notify_url>&#39; +
 &#39;<openid>&#39;+obj.openid+&#39;</openid> &#39; +
 &#39;<out_trade_no>&#39;+obj.out_trade_no+&#39;</out_trade_no>&#39;+
 &#39;<spbill_create_ip>&#39;+obj.spbill_create_ip+&#39;</spbill_create_ip> &#39; +
 &#39;<total_fee>&#39;+obj.total_fee+&#39;</total_fee> &#39; +
 &#39;<trade_type>&#39;+obj.trade_type+&#39;</trade_type> &#39; +
 &#39;<sign>&#39;+obj.sign+&#39;</sign> &#39; + // 此处必带签名, 否者微信在验证数据的时候是不通过的
 &#39;</xml>&#39;;
api : https://api.mch.weixin.qq.com/pay/unifiedorder


6 Après avoir obtenu le prepay_id, puis-je appeler directement le paiement WeChat dans la section h5 ? La réponse n'est pas encore.

Après avoir obtenu le prepay_id, les paramètres de h5 appelant la fonction de paiement WeChat sont les suivants :

{
 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
 "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
 "package" : "prepay_id=u802345jgfjsdfgsdg888", 
 "signType" : "MD5",  //微信签名方式:
}

有了这样的参数, 那么你还需要吧所有参与的参数做签名。签名规跟上面的一样,生成了签名后需要吧签名的参数 paySign 赋给h5 呼起微信的支付功能的参数(也就是微信的签名不参与签名的生成) 
最后的参数是这样子的:

{
 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 
 "timeStamp":" 1395712654",  //时间戳,自1970年以来的秒数 
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 
 "package" : "prepay_id=u802345jgfjsdfgsdg888", 
 "signType" : "MD5",  //微信签名方式:
 "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
}

如果你的各个环节都没有问题, 那么得到了这样参数后你就可以正常的调用起微信的支付功能, 跟原生的功能是没有任何的差别的,(估计你现在的心里也特高兴吧, 没有 app 竟然可以使用 app 的功能,就是这么的神奇)。

七.支付完成的回调

微信支付完了后会在 h5 页面的微信支付的回调函数里面放回值, 
res.err_msg == "get_brand_wcpay_request:ok" ,这样就是成功了, 但是不是就完事儿了呢 ? 也不是,为什么呢? 微信真的收到钱了么? 收到的钱是不是你传递给微信的值呢 ?你还需要将支付的结果写数据库什么的,这些都是未知。还记的在统一下单接口中有个必须参数就是 notify_url : NOTIFY_URL,// 微信付款后的回调地址 这个地址是用户传递给微信的, 微信在收到用户的付款后会以 post 的方式请求这个接口,微信会传递用户付款的信息过来, 不过是 xml 格式的。 
类系这样的 xml 格式:

<xml>
 <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
 <attach><![CDATA[支付测试]]></attach>
 <bank_type><![CDATA[CFT]]></bank_type>
 <fee_type><![CDATA[CNY]]></fee_type>
 <is_subscribe><![CDATA[Y]]></is_subscribe>
 <mch_id><![CDATA[10000100]]></mch_id>
 <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
 <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
 <out_trade_no><![CDATA[1409811653]]></out_trade_no>
 <result_code><![CDATA[SUCCESS]]></result_code>
 <return_code><![CDATA[SUCCESS]]></return_code>
 <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
 <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
 <time_end><![CDATA[20140903131540]]></time_end>
 <total_fee>1</total_fee>
 <trade_type><![CDATA[JSAPI]]></trade_type>
 <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>

根据自己的业务逻辑解析这个 xml 格式的数据就好了。 
注意:这里你在获取到数据后微信需要得到你的回应, 如果你一直不回应微信, 微信会请求你好几次, 这样估计你的逻辑会有问题吧,所以你需要给微信返回 xml 的格式的 回应。

<xml>
 <return_code><![CDATA[SUCCESS]]></return_code>
 <return_msg><![CDATA[OK]]></return_msg>
</xml>

小坑:node ,express 框架开发, 如果你在微信的支付成功后的回调中没有获取到任何 xml 的值, 那么你需要安装一组件:body-parser-xml, 你可以使用 npm install body-parser-xml --save 安装, 在 app.js 里面require('body-parser-xml')(bodyParser);,使用中间件的方式

// 解决微信支付通知回调数据
app.use(bodyParser.xml({
 limit: &#39;2MB&#39;, // Reject payload bigger than 1 MB
 xmlParseOptions: {
 normalize: true, // Trim whitespace inside text nodes
 normalizeTags: true, // Transform tags to lowercase
 explicitArray: false // Only put nodes in array if >1
 }
}));

这样你就可以正常的获取到微信的 xml 数据了。

使用方法:

pay.getAccessToken({
 notify_url : &#39;http://demo.com/&#39;, //微信支付完成后的回调
 out_trade_no : new Date().getTime(), //订单号
 attach : &#39;名称&#39;,
 body : &#39;购买信息&#39;,
 total_fee : &#39;1&#39;, // 此处的额度为分
 spbill_create_ip : req.connection.remoteAddress,
 }, function (error, responseData) {
 res.render(&#39;payment&#39;, {
  title : &#39;微信支付&#39;,
  wxPayParams : JSON.stringify(responseData),
  //userInfo : userInfo
 });
 });

就到这里吧, 感觉也差不多了。如有不对的地方还请指正。

更多nodejs微信公众号支付开发相关文章请关注PHP中文网!


Déclaration:
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