在线看毛片视频-国产免费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>
  • www欧美激情| 精品久久久噜噜噜噜久久图片| 久久无码高潮喷水| 毛片在线视频观看| 日韩精品在线播放视频| 亚洲综合伊人久久| 中文字幕精品一区二区三区在线| 黑森林精品导航| 邪恶网站在线观看| 亚洲视频第二页| 黄色a级三级三级三级| 五月天开心婷婷| 91免费网站视频| 五月天激情图片| heyzo亚洲| 妞干网在线免费视频| 国产精品人人妻人人爽人人牛| 三级在线免费看| 伊人色在线观看| 99视频精品全部免费看 | 1024av视频| 黄色网页免费在线观看| 精品视频无码一区二区三区| 黄色一级免费大片| 国产又粗又长又爽又黄的视频| 国产日韩视频在线播放| 国产无限制自拍| 欧美国产日韩在线播放| www.成年人| 亚洲色欲久久久综合网东京热| 久久婷婷五月综合色国产香蕉| 亚洲 欧美 日韩系列| 麻豆传媒网站在线观看| 无罩大乳的熟妇正在播放| 182午夜在线观看| 国产自产在线视频| 国内国产精品天干天干| 免费不卡av在线| 6080国产精品| 国产精品97在线| 天堂а√在线中文在线| 日韩av卡一卡二| 男的插女的下面视频| 国产成人黄色网址| 免费观看国产精品视频| www激情五月| 男女男精品视频站| 日本免费黄视频| 激情六月天婷婷| 国产福利在线免费| 免费观看日韩毛片| 国产精品视频一二三四区| 亚洲另类第一页| 日本成人在线免费视频| 日本www在线视频| 黄色大片中文字幕| 97超碰人人爱| 熟女视频一区二区三区| 免费成人黄色大片| 浓精h攵女乱爱av| 欧美在线观看视频网站| 国产精品免费入口| av动漫在线看| 凹凸国产熟女精品视频| 欧美日韩视频免费| 日韩在线视频在线| 2022中文字幕| 国产911在线观看| 女人被男人躁得好爽免费视频| 欧美又黄又嫩大片a级| 亚洲一区二区三区观看| 亚洲免费黄色网| 蜜桃福利午夜精品一区| 久久精品亚洲天堂| 国产四区在线观看| 天天想你在线观看完整版电影免费| 三级av免费看| 亚洲色图都市激情| 香港三级日本三级a视频| 中国丰满熟妇xxxx性| 人妻av中文系列| 一本大道熟女人妻中文字幕在线 | 国产区二区三区| 91视频免费版污| 午夜久久福利视频| 欧美 日韩 国产 在线观看| 精产国品一二三区| 国产96在线 | 亚洲| 欧美日韩激情视频在线观看 | 五月天激情视频在线观看| 亚洲小视频网站| 国产又粗又猛又爽又黄的网站 | 日本人体一区二区| 亚洲爆乳无码专区| 自拍偷拍一区二区三区四区| 中文国产在线观看| 人妻少妇精品无码专区二区| 欧美日韩在线免费播放| 法国空姐在线观看免费| 青青青免费在线| 欧美一级小视频| 日本www在线播放| 污污视频网站在线| 国产aaa一级片| 看一级黄色录像| 久久国产色av免费观看| 欧美一二三不卡| 午夜宅男在线视频| 欧美精品自拍视频| 久久综合在线观看| 在线视频日韩一区 | 日韩伦理在线免费观看| 国产喷水theporn| 精品少妇人妻av免费久久洗澡| www.这里只有精品| 日本三级免费网站| 精品人妻少妇一区二区| aaaaaaaa毛片| 九九精品久久久| 992kp快乐看片永久免费网址| 国内少妇毛片视频| 成人性做爰片免费视频| 午夜国产福利在线观看| 97在线播放视频| 日韩中文字幕在线免费| 免费看日b视频| 水蜜桃在线免费观看| 国产性生活一级片| 欧美视频国产视频| 激情视频免费网站| 日韩一区二区三区不卡视频| 毛片一区二区三区四区| 日韩av在线第一页| 日本黄网站免费| 国产精品动漫网站| 国产一级片黄色| 九九热在线免费| 色婷婷.com| 天堂av2020| 波多野结衣免费观看| √天堂资源在线| 黄色免费高清视频| 路边理发店露脸熟妇泻火| 日本丰满大乳奶| 8x8x华人在线| 午夜免费福利小电影| 色综合久久久久无码专区| 777米奇影视第四色| 热久久精品国产| 五月天开心婷婷| 无码日本精品xxxxxxxxx| 日韩黄色短视频| 99草草国产熟女视频在线| 岛国毛片在线播放| 国产成人生活片| 精品99在线视频| 在线免费黄色网| 日韩 欧美 视频| 一区二区三区 日韩| 特黄特黄一级片| 免费看黄在线看| 91小视频网站| 国产欧美日韩网站| 无尽裸体动漫2d在线观看| 国产91在线亚洲| 成人午夜激情av| 美女黄色免费看| 中文字幕成人在线视频| 成人在线免费观看视频网站| 国产精品秘入口18禁麻豆免会员| 在线观看国产一级片| 欧美性潮喷xxxxx免费视频看| 在线视频日韩一区 | 日韩欧美xxxx| 337p亚洲精品色噜噜狠狠p| 天天摸天天碰天天添| a级网站在线观看| 黑森林精品导航| 看av免费毛片手机播放| 国产911在线观看| 午夜剧场在线免费观看| 欧美视频在线播放一区| 午夜啪啪福利视频| 岛国毛片在线播放| 黄色影院一级片| 国产美女主播在线| 国产欧美精品一二三| 天堂社区在线视频| 少妇高潮喷水在线观看| 日韩欧美视频免费在线观看| xxww在线观看| 日韩一区二区三区久久| 欧美视频第三页| 国产最新免费视频| 欧美三级一级片| 免费av手机在线观看| 日韩视频一二三| 久久这里只有精品8| 六月婷婷激情网| 永久免费在线看片视频|