Cet article présente principalement en détail le développement du paiement du compte public nodejs WeChat, qui a une certaine valeur de référence. Les amis intéressés peuvent se référer à
Développement de la fonction de compte public odeJs WeChat, mobile H5 La page 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. Demander le CODE
Le but de la demande de code est d'obtenir l'openid de l'utilisateur (le relatif de l'utilisateur par rapport à l'actuel). compte officiel Identifiant unique) et access_token, demandés API : 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 du redirect_uri que vous avez défini après avoir demandé l'adresse ci-dessus, le redirect_url nécessite ici **url_encode** *php*. * *encodeURLComponent(url)** encodage
3. réponse_type=code, il n'y a rien à dire à ce sujet, juste corrigé réponse_type=code Pour des instructions détaillées, vous pouvez consulter les instructions sur le site officiel de WeChat
. 4. scope=snsapi_userinfo, écrivez-le simplement comme ceci, pour des instructions détaillées, vous pouvez consulter les instructions sur le site officiel de WeChat
5 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, écrivez-le simplement comme ceci, pour des instructions détaillées, vous pouvez consulter le site officiel de WeChat Remarque
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, puis l'étape suivante est Vous devez obtenir la valeur de access_token et openid via le code. >API
api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
Description des paramètres de l'API ici :
2. Clé secrète du compte public WeChat, obtenue à partir de l'arrière-plan du compte public WeChat
3, la première étape consiste à obtenir le code utilisé
4. . Corrigez simplement grant_type=authorization_code
3. Appelez l'interfaceaccess_token peut être utilisé pour les fonctions suivantes, vous pouvez. reportez-vous à l'exemple officiel :
open.weixin.qq.com/cgi-bin/show
document?action=dir_list&t =resource/res_list&verify=1&id=open1419316518&lang=zh_CN
En voyant cela, avez-vous l'impression 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 estJSON
. Remarque : l'objet intégré
de WeixinJSBridge n'est pas valide 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(); }
{ "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 "package" : "prepay_id=u802345jgfjsdfgsdg888", "signType" : "MD5", //微信签名方式: "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 }
1. appId // Nom du compte officiel, transmis par le commerçant
2. timeStamp // Timestamp, nombre de secondes depuis 1970 Une attention particulière est nécessaire ici , il doit êtreLe format d'horodatage de la chaîne
signifie qu'il doit être "" guillemet3 nonceStr //Chaîne aléatoire 32 bits, la méthode sera fournie plus tardsignType /. /Méthode de signature WeChat : MD5
5. paySign //Connectez-vous sur WeChat, puis dites
6 **package** //C'est le plus important, où avez-vous obtenu le paiement ? Suivant.
ps : Description de l'interface officielle du site Web
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
Obtenez prepay_id depuis l'interface de commande unifiée de WeChatAPI officielle :
api.mch.weixin.qq.com/pay/unified 请求参数一堆, 但是有一些不是必须的,下面是必须参数 微信的统一下单接口要求传递的是 xml 的数据, 而且数据还需要签名, 那么首先吧数据签名。 生成签名后需要吧数据组装为xml 的格式: 接下来就是请求 api 获取prepay_id的值了, 将上面得到的 xml 数据请求下面的 api 发送给微信, 微信验证数据没问题后会放回你想要的值。 六. 获取到了prepay_id是不是就可以在 h5 段直接调用微信的支付了么? 答案是还不可以。 获取到了prepay_id那么现在h5 呼起微信的支付功能的参数是这样的: 有了这样的参数, 那么你还需要吧所有参与的参数做签名。签名规跟上面的一样,生成了签名后需要吧签名的参数 paySign 赋给h5 呼起微信的支付功能的参数(也就是微信的签名不参与签名的生成) 如果你的各个环节都没有问题, 那么得到了这样参数后你就可以正常的调用起微信的支付功能, 跟原生的功能是没有任何的差别的,(估计你现在的心里也特高兴吧, 没有 app 竟然可以使用 app 的功能,就是这么的神奇)。 七.支付完成的回调 微信支付完了后会在 h5 页面的微信支付的回调函数里面放回值, 根据自己的业务逻辑解析这个 xml 格式的数据就好了。 小坑:node ,express 框架开发, 如果你在微信的支付成功后的回调中没有获取到任何 xml 的值, 那么你需要安装一组件:body-parser-xml, 你可以使用 npm install body-parser-xml --save 安装, 在 app.js 里面require('body-parser-xml')(bodyParser);,使用中间件的方式 这样你就可以正常的获取到微信的 xml 数据了。 使用方法: 就到这里吧, 感觉也差不多了。如有不对的地方还请指正。 【相关推荐】 1. 特别推荐:“php程序员工具箱”V0.1版本下载 2. 微信小程序完整源码 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!
ordeuh{
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',
}
签名规则可以参考微信给出的签名规则(签名方法一会给出)
微信官方签名规则:
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3var body = '<xml> ' +
'<appid>'+config.wxappid+'</appid> ' +
'<attach>'+obj.attach+'</attach> ' +
'<body>'+obj.body+'</body> ' +
'<mch_id>'+config.mch_id+'</mch_id> ' +
'<nonce_str>'+obj.nonce_str+'</nonce_str> ' +
'<notify_url>'+obj.notify_url+'</notify_url>' +
'<openid>'+obj.openid+'</openid> ' +
'<out_trade_no>'+obj.out_trade_no+'</out_trade_no>'+
'<spbill_create_ip>'+obj.spbill_create_ip+'</spbill_create_ip> ' +
'<total_fee>'+obj.total_fee+'</total_fee> ' +
'<trade_type>'+obj.trade_type+'</trade_type> ' +
'<sign>'+obj.sign+'</sign> ' + // 此处必带签名, 否者微信在验证数据的时候是不通过的
'</xml>';
api : api.mch.weixin.qq.com/pay/unifiedorder{
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
}
最后的参数是这样子的:{
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
"paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
}
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>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
// 解决微信支付通知回调数据
app.use(bodyParser.xml({
limit: '2MB', // 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
}
}));
pay.getAccessToken({
notify_url : 'http://demo.com/', //微信支付完成后的回调
out_trade_no : new Date().getTime(), //订单号
attach : '名称',
body : '购买信息',
total_fee : '1', // 此处的额度为分
spbill_create_ip : req.connection.remoteAddress,
}, function (error, responseData) {
res.render('payment', {
title : '微信支付',
wxPayParams : JSON.stringify(responseData),
//userInfo : userInfo
});
});