Heim >WeChat-Applet >Mini-Programmentwicklung >Teilen Sie das Beispielcode-Tutorial der Miniprogramm-Zahlungsfunktion

Teilen Sie das Beispielcode-Tutorial der Miniprogramm-Zahlungsfunktion

零下一度
零下一度Original
2017-05-26 09:45:322596Durchsuche

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, &#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 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

json

Dann 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 + &#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() 

支付sign:
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()  

注意加密的时候我们获取的是string而不是一个json,所以我们需要吧json转换成string,代码如下:

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  

统一下单接口返回的是带有prepay_id的xml,所以我们需要一个方法进行解析,代码如下:
Dann müssen wir nur noch diese Schnittstelle im Miniprogramm aufrufen, und schon bekommen wir alles Zahlungsinformationen eingeben und dann einfach über WeChat bezahlen.
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("")  
    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 = &#39;davdian&#39; + 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  
  }
}

之后我们封装下单接口:
Hier sind einige Fallstricke bei der Bezahlung von Miniprogrammen:
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)
      })  
  },

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-Zahlungszugangsentwicklung

2. Detaillierte Erläuterung des Beispiels der Implementierung von Floor Anchor Point Jumping in der Miniprogrammentwicklung

3. 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!

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