Die Zahlung für das WeChat-Miniprogramm ähnelt der Zahlung für das offizielle WeChat-Konto. Im Vergleich dazu ist sie einfacher als die Zahlung für das offizielle Konto. Wir müssen nur die einheitliche Bestellschnittstelle von WeChat aufrufen, um die prepay_id zu erhalten Rufen Sie die WeChat-Zahlung an.
Heute werden wir die Zahlungsschnittstelle eines allgemeinen Knotens kapseln! ! !
Zuerst müssen wir einige Informationen kennen, um die einheitliche Bestellschnittstelle aufzurufen
var bookingNo = 'davdian' + this.createNonceStr() + this.createTimeStamp() var deferred = Q.defer() var appid = config.appId var nonce_str = this.createNonceStr() var timeStamp = this.createTimeStamp() var url = "https://api.mch.weixin.qq.com/pay/unifiedorder" var formData = "<xml>" formData += "<appid>" + appid + "</appid>" //appid formData += "<attach>" + attach + "</attach>" //附加数据 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>" formData += "<openid>" + openid + "</openid>" formData += "<out_trade_no>" + bookingNo + "</out_trade_no>" formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>" formData += "<total_fee>" + total_fee + "</total_fee>" formData += "<trade_type>JSAPI</trade_type>" formData += "<sign>" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + "</sign>" formData += "</xml>" var self = this request({ url: url, method: 'POST', body: formData }, function(err, response, body) { if (!err && response.statusCode == 200) { var prepay_id = self.getXMLNodeValue('prepay_id', body.toString("utf-8")) var tmp = prepay_id.split('[') var tmp1 = tmp[2].split(']') //签名 var _paySignjs = self.paysignjs(appid, nonce_str, 'prepay_id=' + tmp1[0], 'MD5', timeStamp) var args = { appId: appid, timeStamp: timeStamp, nonceStr: nonce_str, signType: "MD5", package: tmp1[0], paySign: _paySignjs } deferred.resolve(args) } else { console.log(body) } }) return deferred.promise
Dies ist der Code einer einheitlichen Bestellschnittstelle. Wir benötigen die öffentliche Konto-ID des Appid-Applets, das Händlerkonto mch_id id, Der einzige Parameter des OpenID-Applets ist SchlüsselPasswort für die Zahlung. Die restlichen Parameter sind Bestellinformationen und Preis. Ich muss das Q-Modul eingeben und verwenden Von Person zu Person und kann an die eigenen Bedürfnisse angepasst werden. Wir müssen die Schnittstelle api.mch.weixin.qq.com/pay/unifiedorder anfordern Hinweis: Die Formdaten, die wir hier übergeben, sind XML statt
jsonDann ist eine Signaturmethode erforderlich. Hier müssen wir zwei Methoden kapseln. Eine wird von der Signaturmethode verwendet, um die einheitliche Bestellschnittstelle aufzurufen, und die andere wird verwendet, um das Applet-Zahlungszeichen aufzurufen :
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 = this.raw(ret) string = string + '&key=' + key var crypto = require('crypto') var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex') return sign.toUpperCase() 支付sign:
var ret = { appId: appid, nonceStr: nonceStr, package: package, signType: signType, timeStamp: timeStamp } var string = this.raw(ret) string = string + '&key=' + key var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex') return sign.toUpperCase() 注意加密的时候我们获取的是string而不是一个json,所以我们需要吧json转换成string,代码如下:
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 统一下单接口返回的是带有prepay_id的xml,所以我们需要一个方法进行解析,代码如下:
var tmp = xml.split("<" + node_name + ">") var _tmp = tmp[1].split("</" + node_name + ">") return _tmp[0] 最后我们只需要把这些连接到一起就是可以获取所有微信支付所需参数,代码如下:
//微信小程序支付封装,暂支持md5加密,不支持sha1 /** ***create order by jianchep 2016/11/22 **/ var config = require('../config/weapp.js') var Q = require("q") var request = require("request") var crypto = require('crypto') var ejs = require('ejs') var fs = require('fs') var key = config.key module.exports = { // 获取prepay_id getXMLNodeValue: function(node_name, xml) { var tmp = xml.split("<" + node_name + ">") var _tmp = tmp[1].split("" + node_name + ">") return _tmp[0] }, // object-->string raw: function(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 }, // 随机字符串产生函数 createNonceStr: function() { return Math.random().toString(36).substr(2, 15) }, // 时间戳产生函数 createTimeStamp: function() { return parseInt(new Date().getTime() / 1000) + '' }, // 支付md5加密获取sign paysignjs: function(appid, nonceStr, package, signType, timeStamp) { var ret = { appId: appid, nonceStr: nonceStr, package: package, signType: signType, timeStamp: timeStamp } var string = this.raw(ret) string = string + '&key=' + key var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex') return sign.toUpperCase() }, // 统一下单接口加密获取sign paysignjsapi: function(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 = this.raw(ret) string = string + '&key=' + key var crypto = require('crypto') var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex') return sign.toUpperCase() }, // 下单接口 order: function(attach, body, mch_id, openid, total_fee, notify_url) { var bookingNo = 'davdian' + this.createNonceStr() + this.createTimeStamp() var deferred = Q.defer() var appid = config.appId var nonce_str = this.createNonceStr() var timeStamp = this.createTimeStamp() var url = "https://api.mch.weixin.qq.com/pay/unifiedorder" var formData = "<xml>" formData += "<appid>" + appid + "</appid>" //appid formData += "<attach>" + attach + "</attach>" //附加数据 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>" formData += "<openid>" + openid + "</openid>" formData += "<out_trade_no>" + bookingNo + "</out_trade_no>" formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>" formData += "<total_fee>" + total_fee + "</total_fee>" formData += "<trade_type>JSAPI</trade_type>" formData += "<sign>" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + "</sign>" formData += "</xml>" var self = this request({ url: url, method: 'POST', body: formData }, function(err, response, body) { if (!err && response.statusCode == 200) { var prepay_id = self.getXMLNodeValue('prepay_id', body.toString("utf-8")) var tmp = prepay_id.split('[') var tmp1 = tmp[2].split(']') //签名 var _paySignjs = self.paysignjs(appid, nonce_str, 'prepay_id=' + tmp1[0], 'MD5', timeStamp) var args = { appId: appid, timeStamp: timeStamp, nonceStr: nonce_str, signType: "MD5", package: tmp1[0], paySign: _paySignjs } deferred.resolve(args) } else { console.log(body) } }) return deferred.promise } } 之后我们封装下单接口:
unifiedorder: function (req, res) { var body = "测试支付" var openid = "openid" var total_fee = 1 var notify_url = "http://localhost/notify" var mch_id = config.shopId var attach = "测试" wxpay.order(attach, body, mch_id, openid, total_fee, notify_url) .then(function(data){ console.log('data--->', data, 123123) res.json(data) }) },
1. Die einheitliche Bestellschnittstelle ist XML (dies gilt nicht nur für Miniprogramme, sondern auch für offizielle Konten) und der Rückgabewert ist ebenfalls im XML-Format und muss von Ihnen selbst bezogen werden
2 Der Signaturalgorithmus muss den Schlüssel bringen und schließlich muss er in einen größeren Wert konvertiert werden
3. Der Signaturalgorithmus der WeChat-Zahlung muss auch die App-ID mitbringen (das ist unwissenschaftlich, eine tiefe Grube)
4 Der Signaturalgorithmus darf keinen JSON-Spleißschlüssel verwenden
[Verwandte Empfehlungen]
1.
WeChat-Miniprogramm WeChat-Zahlungszugangsentwicklung3. Analyse des Codes zur Implementierung der Online-Zahlungsfunktion des WeChat-Miniprogramms
Das obige ist der detaillierte Inhalt vonTeilen Sie das Beispielcode-Tutorial der Miniprogramm-Zahlungsfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!