在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

分享小程序支付技巧的案例代碼圖文詳細教程

分享小程序支付技巧的案例代碼圖文詳細教程

更新時間:2025-09-30 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
微信小程序的支付和微信公眾號的支付是類似的,對比起來還比公眾號支付簡單了一些,我們只需要調用微信的統一下單接口獲取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,這個因人而異,可以根據自己需要來。我們需要請求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.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 = "<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

【相關推薦】

1. 微信小程序微信支付接入開發

2. 小程序開發之實現樓層錨點跳躍實例詳解

3. 實現微信小程序的在線支付功能代碼解析

以上就是分享小程序支付功能的實例代碼教程的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 五月天开心婷婷| 亚洲乱码日产精品bd在线观看| 艳母动漫在线观看| 少妇一级淫免费播放| 国产成人久久婷婷精品流白浆| 精品无码国模私拍视频| av片在线免费| 色欲色香天天天综合网www| 欧美少妇一区二区三区| 青青草综合视频| 国产黄色激情视频| 成人午夜视频在线观看免费| 亚洲色婷婷久久精品av蜜桃| 草草草视频在线观看| 日本香蕉视频在线观看| 免费成人在线视频网站| 欧美三级一级片| www.激情小说.com| 香蕉视频xxxx| 日本人妻伦在线中文字幕| a级黄色小视频| 中文字幕无码不卡免费视频| 乌克兰美女av| 99亚洲国产精品| 久久成人免费观看| 久久国产精品国产精品| 丰满女人性猛交| 无码粉嫩虎白一线天在线观看| 国产二区视频在线播放| 国产一级做a爰片久久| 91精品视频国产| 国产99久久九九精品无码| 波多野结衣天堂| 青青视频免费在线| 日韩av片在线看| 国内外成人激情免费视频| 亚洲中文字幕无码专区| 无需播放器的av| 天堂8在线天堂资源bt| 欧美日韩大尺度| 国产青草视频在线观看| 日本xxxxxxx免费视频| 老司机av福利| 色国产在线视频| 免费看黄在线看| 青青草影院在线观看| 黄色一级二级三级| 国产精品333| 波多野结衣 作品| 中文国产在线观看| 尤蜜粉嫩av国产一区二区三区| 免费极品av一视觉盛宴| 老司机午夜性大片| 亚洲欧美激情网| 中文字幕第80页| 日韩欧美在线播放视频| 亚洲中文字幕无码av永久| 亚欧美一区二区三区| 国产97色在线 | 日韩| 高清无码视频直接看| 四虎免费在线观看视频| 日韩av加勒比| 在线观看视频在线观看| 中文字幕亚洲欧洲| 自拍偷拍一区二区三区四区| 国产精品丝袜久久久久久消防器材| 日韩成人午夜影院| 嫩草影院中文字幕| 妞干网在线观看视频| 国产精品成人久久电影| 久久久性生活视频| 乱人伦xxxx国语对白| 成年人黄色在线观看| 女同性恋一区二区| 成人在线免费观看网址| 999一区二区三区| 国产中文字幕在线免费观看| 亚洲精品蜜桃久久久久久| 黄色一级片在线看| 中国丰满人妻videoshd| 亚洲视频在线观看一区二区三区| 国产h视频在线播放| 99久久激情视频| 色天使在线观看| 国产卡一卡二在线| 国产在线精品91| 久久久久久久久久久久久久国产| 国产最新免费视频| 亚洲一区日韩精品| 看一级黄色录像| 成人免费视频91| 亚洲欧美国产中文| 国产成人艳妇aa视频在线| 成人免费观看cn| 色综合五月婷婷| 久久99中文字幕| 在线看的黄色网址| 青青青在线视频播放| 久久久久久久少妇| 国产曰肥老太婆无遮挡| 亚洲精品怡红院| 久青草视频在线播放| 激情五月亚洲色图| 黄色一级片在线看| 加勒比av中文字幕| 免费看国产曰批40分钟| 日韩成人精品视频在线观看| a级黄色片免费| 91欧美一区二区三区| 亚洲色成人www永久在线观看| 人妻丰满熟妇av无码区app| 国产日本欧美在线| 苍井空浴缸大战猛男120分钟| 亚洲综合激情五月| 岛国av在线免费| 日韩中文字幕三区| 18禁裸男晨勃露j毛免费观看| 无限资源日本好片| 国产成人无码精品久久久性色| 亚洲制服在线观看| 午夜免费福利在线| 免费无码不卡视频在线观看| 裸体裸乳免费看| 亚洲欧美手机在线| 亚洲综合欧美在线| 国产精品wwwww| 日韩亚洲欧美视频| 日韩一级特黄毛片| 干日本少妇视频| 精品国产无码在线| 浴室偷拍美女洗澡456在线| 亚洲精品第三页| 奇米777在线视频| 亚洲福利精品视频| av中文字幕网址| av在线无限看| 91看片破解版| 国内av免费观看| 色乱码一区二区三区熟女| 亚洲免费黄色录像| 毛片毛片毛片毛片毛| 久久久久久综合网| 一级片免费在线观看视频| 国产无色aaa| 97av中文字幕| 天堂…中文在线最新版在线| 免费拍拍拍网站| 欧美日韩在线中文| 精品999在线| 精品嫩模一区二区三区| 麻豆映画在线观看| 亚洲中文字幕无码专区| 日本激情视频在线| a级黄色片网站| 日本毛片在线免费观看| 麻豆av免费在线| 亚洲天堂一区二区在线观看| 日韩视频在线免费播放| 僵尸世界大战2 在线播放| www.国产区| 91制片厂免费观看| 黄色影院一级片| 一级黄色在线播放| 国产婷婷一区二区三区| 岳毛多又紧做起爽| 免费看日本黄色| 成年人网站大全| 91成人综合网| 亚洲人视频在线| 亚洲午夜精品久久久久久人妖| 亚洲免费看av| 日本www在线视频| 黄色一级片av| 免费一区二区三区在线观看| 欧妇女乱妇女乱视频| av亚洲天堂网| 青青在线视频免费| 欧美在线一区视频| 精品国产无码在线| 超碰在线人人爱| 免费在线观看的av网站| 精品国产无码在线| 日韩欧美国产片| 激情婷婷综合网| 中文字幕日本最新乱码视频| 国产精品久久久影院| 在线免费看污网站| 色综合天天色综合| 中文字幕永久视频| 国产91在线视频观看| 成人午夜视频在线观看免费| aaa一级黄色片| 三级一区二区三区| www.com久久久| 日韩欧美亚洲另类| 久久久久久蜜桃一区二区| 成人一区二区三| 男人舔女人下面高潮视频| 逼特逼视频在线| 88av.com|