Zahlung im WeChat-Miniprogramm
Die Zahlung im WeChat-Miniprogramm ähnelt der Zahlung im offiziellen WeChat-Konto. Sie ist im Vergleich einfacher als die Zahlung im offiziellen WeChat-Konto Nach prepay_id können wir die WeChat-Zahlung aufrufen.
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 das Passwort für die Schlüsselzahlung. Die übrigen Parameter sind die Eingabe des q-Moduls, um Promise zu verwenden. Dies ist von Person zu Person unterschiedlich und kann entsprechend Ihren eigenen Bedürfnissen festgelegt werden . Wir müssen die https://api.mch.weixin.qq.com/pay/unifiedorder-Schnittstelle anfordern
Hinweis: Die Formdaten, die wir hier übergeben, sind XML statt JSON
Dann haben wir müssen signieren Methode, hier müssen wir zwei Methoden kapseln, eine ist die Signaturmethode, die zum Aufrufen der einheitlichen Bestellschnittstelle verwendet wird, die andere wird zum Aufrufen des Miniprogramms für die Zahlung verwendet
Zeichen der einheitlichen Bestellschnittstelle:
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()
Zahlungszeichen:
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()
Beachten Sie, dass wir beim Verschlüsseln einen String anstelle eines JSON erhalten, daher müssen wir den JSON in einen konvertieren Zeichenfolge, der Code lautet wie folgt:
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
Die einheitliche Bestellschnittstelle gibt XML mit prepay_id zurück, daher benötigen wir eine Methode zum Parsen. Der Code lautet wie folgt:
var tmp = xml.split("<" + node_name + ">") var _tmp = tmp[1].split("</" + node_name + ">") return _tmp[0]
Abschließend müssen wir diese nur noch miteinander verbinden, um alle für die WeChat-Zahlung erforderlichen Parameter zu erhalten. Der Code lautet wie folgt:
//微信小程序支付封装,暂支持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 = "" formData += " " 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 } }" + appid + " " //appid formData += "" + attach + " " //附加数据 formData += "" + body + "" formData += "" + mch_id + " " //商户号 formData += "" + nonce_str + " " //随机字符串,不长于32位。 formData += "" + notify_url + " " formData += "" + openid + " " formData += "" + bookingNo + " " formData += "61.50.221.43 " formData += "" + total_fee + " " formData += "JSAPI " formData += "" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, '61.50.221.43', total_fee, 'JSAPI') + " " formData += "
Danach kapseln wir die Bestellschnittstelle:
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) }) },
Dann müssen wir nur noch diese Schnittstelle im Miniprogramm aufrufen, und schon erhalten wir die gesamte Zahlung Informationen, und dann können wir über WeChat bezahlen.
Hier sind einige Fallstricke bei der Bezahlung von Miniprogrammen:
1. Die einheitliche Bestellschnittstelle ist XML (dies gilt nicht nur für Miniprogramme, sondern auch für offizielle Konten) und der Rückgabewert ist auch 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 JSON nicht zum Spleißen des Schlüssels verwenden
Vielen Dank fürs Lesen, Ich hoffe, es kann allen helfen. Vielen Dank für Ihre Unterstützung dieser Website!
Weitere einfache Beispiele und Vorsichtsmaßnahmen für die WeChat-Applet-Zahlung finden Sie auf der chinesischen PHP-Website!