Récemment, j'ai eu besoin d'utiliser la fonction de paiement en ligne dans le mini programme WeChat, j'ai donc jeté un œil à la documentation officielle et j'ai trouvé qu'il est très pratique d'implémenter le paiement WeChat dans le mini programme si vous avez développé le paiement WeChat sous. un compte de service auparavant, vous constaterez ensuite que le processus de développement du paiement WeChat dans le mini programme est exactement le même que celui du compte de service. Je vais maintenant parler du processus de développement et des points d'attention du paiement WeChat dans le mini programme. en détails.
1. Ouvrir le paiement WeChat et le compte marchand WeChat
Ce processus est le même que le processus de paiement WeChat pour l'ouverture d'un service. compte, non Que peut-on dire.
2. Obtenez l'openid de l'utilisateur
Page d'accueil Nous devons obtenir l'utilisateur actuel dans le client js de le mini programme L'openid de l'utilisateur peut être obtenu en appelant la méthode wx.login, puis le serveur de développement utilise le code d'identification de connexion pour obtenir l'openid.
wx.login({ success: function(res) { if (res.code) { //发起网络请求 wx.request({ url: 'https://yourwebsit/onLogin', method: 'POST', data: { code: res.code }, success: function(res) { var openid = res.data.openid; }, fail: function(err) { console.log(err) } }) } else { console.log('获取用户登录态失败!' + res.errMsg) } } });
var code = req.param("code"); request({ url: "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code", method: 'GET' }, function(err, response, body) { if (!err && response.statusCode == 200) { res.json(JSON.parse(body)); } });
3. Obtenez le prepay_id et la vérification de la signature de paiement paySign
Le processus de cette étape est le même que le processus de paiement WeChat dans le compte de service, qui est divisé en côté client et côté serveur
Jetons d'abord un coup d'oeil au client js
Dans le compte de service, nous activons la fonction de paiement via le code suivant
function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":"", //公众号名称,由商户传入 "timeStamp":"", //时间戳,自1970年以来的秒数 "nonceStr":"", //随机串 "package":"prepay_id=", "signType":"MD5", //微信签名方式: "paySign":"" //微信签名 }, function(res){ WeixinJSBridge.log(res.err_msg); if( res.err_msg =="get_brand_wcpay_request:ok"){ alert("支付成功!"); }else{ alert("支付失败!"); } } ); }
Dans le mini programme, nous utilisez la méthode wx. requestPayment pour activer la fonction de paiement. Bien sûr, avant de faire cela, nous devons d'abord obtenir le prepay_id.
wx.request({ url: 'https://yourwebsit/service/getPay', method: 'POST', data: { bookingNo:bookingNo, /*订单号*/ total_fee:total_fee, /*订单金额*/ openid:openid }, header: { 'content-type': 'application/json' }, success: function(res) { wx.requestPayment({ 'timeStamp':timeStamp, 'nonceStr': nonceStr, 'package': 'prepay_id='+res.data.prepay_id, 'signType': 'MD5', 'paySign': res.data._paySignjs, 'success':function(res){ console.log(res); }, 'fail':function(res){ console.log('fail:'+JSON.stringify(res)); } }) }, fail: function(err) { console.log(err) } })
La principale chose à mettre en œuvre côté serveur est d'obtenir prepay_id et de signer paySign
var bookingNo = req.param("bookingNo"); var total_fee = req.param("total_fee"); var openid = req.param("openid"); var body = "费用说明"; var url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; var formData = "<xml>"; formData += "<appid>appid</appid>"; //appid formData += "<attach>test</attach>"; formData += "" + body + ""; formData += "<mch_id>mch_id</mch_id>"; //商户号 formData += "<nonce_str>nonce_str</nonce_str>"; formData += "<notify_url>notify_url</notify_url>"; formData += "<openid>" + openid + "</openid>"; formData += "<out_trade_no>" + bookingNo + "</out_trade_no>"; formData += "<spbill_create_ip>spbill_create_ip</spbill_create_ip>"; formData += "<total_fee>" + total_fee + "</total_fee>"; formData += "<trade_type>JSAPI</trade_type>"; formData += "<sign>" + paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, spbill_create_ip, total_fee, 'JSAPI') + "</sign>"; formData += "</xml>"; request({ url: url, method: 'POST', body: formData }, function(err, response, body) { if(!err && response.statusCode == 200) { var prepay_id = getXMLNodeValue('prepay_id', body.toString("utf-8")); var tmp = prepay_id.split('['); var tmp1 = tmp[2].split(']'); //签名 var _paySignjs = paysignjs(appid, mch_id, 'prepay_id=' + tmp1[0], 'MD5',timeStamp); var o = { prepay_id: tmp1[0], _paySignjs: _paySignjs } res.send(o); } });
Voici les fonctions utilisées
function paysignjs(appid, nonceStr, package, signType, timeStamp) { var ret = { appId: appid, nonceStr: nonceStr, package: package, signType: signType, timeStamp: timeStamp }; var string = raw1(ret); string = string + '&key='+key; console.log(string); var crypto = require('crypto'); return crypto.createHash('md5').update(string, 'utf8').digest('hex'); }; function raw1(args) { var keys = Object.keys(args); keys = keys.sort() var newArgs = {}; keys.forEach(function(key) { newArgs[key] = args[key]; }); var string = ''; for(var k in newArgs) { string += '&' + k + '=' + newArgs[k]; } string = string.substr(1); return string; }; function paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) { var ret = { 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, spbill_create_ip: spbill_create_ip, total_fee: total_fee, trade_type: trade_type }; var string = raw(ret); string = string + '&key='+key; var crypto = require('crypto'); return crypto.createHash('md5').update(string, 'utf8').digest('hex'); }; function raw(args) { var keys = Object.keys(args); keys = keys.sort() var newArgs = {}; keys.forEach(function(key) { newArgs[key.toLowerCase()] = args[key]; }); var string = ''; for(var k in newArgs) { string += '&' + k + '=' + newArgs[k]; } string = string.substr(1); return string; }; function getXMLNodeValue(node_name, xml) { var tmp = xml.split(""); var _tmp = tmp[1].split("" + node_name + ">"); return _tmp[0]; }
C'est aussi simple À l'étape 3, la fonction de paiement WeChat du mini programme est connectée. Voici le diagramme d'effet de paiement de test
<.>
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!