欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

小程序怎么實現(xiàn)支付功能

這篇文章主要介紹小程序怎么實現(xiàn)支付功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)的客戶來自各行各業(yè),為了共同目標,我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領域包括成都做網(wǎng)站、網(wǎng)站建設、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。

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

今天我們來封裝一般node的支付接口?。。?/p>

首先調用統(tǒng)一下單接口我們需要知道一些信息

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>" //附加數(shù)據(jù)  
    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

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

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

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

統(tǒng)一下單接口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  

統(tǒng)一下單接口返回的是帶有prepay_id的xml,所以我們需要一個方法進行解析,代碼如下:
var tmp = xml.split("<" + node_name + ">")  
    var _tmp = tmp[1].split("</" + node_name + ">")  
    return _tmp[0]  

最后我們只需要把這些連接到一起就是可以獲取所有微信支付所需參數(shù),代碼如下:
//微信小程序支付封裝,暫支持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  
  },  
    // 隨機字符串產(chǎn)生函數(shù)  
  createNonceStr: function() {  
      return Math.random().toString(36).substr(2, 15)  
  },  
  // 時間戳產(chǎn)生函數(shù)  
  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()  
  },
  // 統(tǒng)一下單接口加密獲取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>" //附加數(shù)據(jù)  
    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.統(tǒng)一下單接口是xml(這個不只是小程序,公眾號也是),返回值也是xml格式需要自己獲取prepay_id,

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

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

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

以上是“小程序怎么實現(xiàn)支付功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

名稱欄目:小程序怎么實現(xiàn)支付功能
文章地址:http://aaarwkj.com/article26/pjdjcg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站收錄、域名注冊、關鍵詞優(yōu)化外貿建站、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網(wǎng)站制作
欧美日韩黄色在线观看| 国产精品白嫩初高中害羞小美女| 日韩精品在线播放观看| 欧美日韩一区二区综合性色| 91精品中综合久久久久| 久久精品一区二区三区不卡| 人妻少妇中文字幕一区| 日韩精品在线观看视频一区二区三区| 日韩一二三四区免费观看| 亚洲av污精品一区二区三区| 亚洲一区二区三区国色天香| 亚洲国产一区二区高清| 美女高潮呻吟免费观看久久久| 欧美一日韩一级片免费看| 国产精品自拍午夜福利| 国产亚洲精品视频在线| 人妻日韩精品综合一二三四| 欧美日韩国产精品久久乐播| 中文字幕人成乱码在线观看| av免费在线观看大全| 中文字幕av免费专区| 国产乱码免费一区二区三区| 国产精品自拍激情在线观看| 国产一区二区三区午夜视频| 精品人妻在线中文字幕| 国产日产精品久久婷婷色| 国产欧美成人精品第一区| 欧美在线观看黄片视频| 国产精品一区二区激情视频| 国产精品久久亚洲一区二区| 亚洲欧美日韩午夜在线| 极品丝袜美腿一区二区| 少妇高潮视频在线观看| av毛片在线观看地址| 亚洲精品成人午夜久久| 久久精品女人天堂av免费观看| 亚洲国产精品第一区第二区| 不卡在线视频中文字幕| 天堂av日韩在线播放| 国产精品欧美日韩高清| 国产精品黄色自拍合集|