Heim >WeChat-Applet >Mini-Programmentwicklung >Einfache Beispiele und Vorsichtsmaßnahmen für die Bezahlung des WeChat Mini-Programms

Einfache Beispiele und Vorsichtsmaßnahmen für die Bezahlung des WeChat Mini-Programms

高洛峰
高洛峰Original
2017-01-10 09:59:122457Durchsuche

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, &#39;61.50.221.43&#39;, total_fee, &#39;JSAPI&#39;) + "</sign>"
  formData += "</xml>"
  var self = this
  request({ 
   url: url, 
   method: &#39;POST&#39;, 
   body: formData 
  }, function(err, response, body) { 
   if (!err && response.statusCode == 200) { 
    var prepay_id = self.getXMLNodeValue(&#39;prepay_id&#39;, body.toString("utf-8")) 
    var tmp = prepay_id.split(&#39;[&#39;) 
    var tmp1 = tmp[2].split(&#39;]&#39;) 
    //签名 
    var _paySignjs = self.paysignjs(appid, nonce_str, &#39;prepay_id=&#39; + tmp1[0], &#39;MD5&#39;, 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 + &#39;&key=&#39; + key 
  var crypto = require(&#39;crypto&#39;) 
  var sign = crypto.createHash(&#39;md5&#39;).update(string, &#39;utf8&#39;).digest(&#39;hex&#39;) 
  return sign.toUpperCase()

Zahlungszeichen:

var ret = {
    appId: appid,
    nonceStr: nonceStr,
    package: package,
    signType: signType,
    timeStamp: timeStamp
  }
  var string = this.raw(ret)
  string = string + &#39;&key=&#39; + key
  var sign = crypto.createHash(&#39;md5&#39;).update(string, &#39;utf8&#39;).digest(&#39;hex&#39;)
  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 = &#39;&#39;
  for (var k in newArgs) {
    string += &#39;&&#39; + k + &#39;=&#39; + 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 = &#39;&#39;
  for (var k in newArgs) {
    string += &#39;&&#39; + k + &#39;=&#39; + 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 + &#39;&key=&#39; + key
  var sign = crypto.createHash(&#39;md5&#39;).update(string, &#39;utf8&#39;).digest(&#39;hex&#39;)
  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 += "" + 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 += ""
  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
 }
}

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(&#39;data--->&#39;, 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn