国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

微信小程序 支付簡單實例及注意事項

2019-11-19 18:05:32
字體:
來源:轉載
供稿:網友

微信小程序 支付

微信小程序的支付和微信公眾號的支付是類似的,對比起來還比公眾號支付簡單了一些,我們只需要調用微信的統一下單接口獲取prepay_id之后我們在調用微信的支付即可。

今天我們來封裝一般node的支付接口!!!

首先調用統一下單接口我們需要知道一些信息

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 

這個是一個統一下單接口的代碼,我們需要appid小程序公眾號id,mch_id商戶號id,openid小程序的唯一標實,key支付用的密碼,剩下的參數都是訂單的信息和價格之類的,本人require進q模塊使用promise,這個因人而異,可以根據自己需要來。我們需要請求https://api.mch.weixin.qq.com/pay/unifiedorder接口

注意:這里我們傳遞的formdata是一個xml而不是json

然后我們需要簽名方法,這里我們需要封裝兩個方法,一個是簽名方法調用統一下單接口會用到,另一個是調用小程序支付用到

統一下單接口sign:

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.keymodule.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.統一下單接口是xml(這個不只是小程序,公眾號也是),返回值也是xml格式需要自己獲取prepay_id,

2.簽名算法要帶上key,最后要轉換成大些

3.微信支付的sign算法也要帶上appid(這個不科學,深坑)

4.簽名算法一定不要用json拼接key

感謝閱讀,希望能幫助到大家,謝謝大家對本站 的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 库尔勒市| 温泉县| 建始县| 岑巩县| 黄大仙区| 萨迦县| 苍山县| 军事| 沁阳市| 嵊泗县| 简阳市| 阿合奇县| 宁晋县| 大化| 甘洛县| 皋兰县| 水富县| 罗田县| 凌海市| 安康市| 南丰县| 新营市| 靖安县| 蕲春县| 通许县| 施甸县| 伊春市| 新田县| 建宁县| 布尔津县| 台安县| 淮滨县| 喜德县| 太仆寺旗| 都兰县| 广饶县| 安岳县| 米易县| 昂仁县| 成武县| 临颍县|