1. <li id="7x3ty"><meter id="7x3ty"><th id="7x3ty"></th></meter></li>
    1. <span id="7x3ty"><optgroup id="7x3ty"></optgroup></span>

        COURSE 小程序教程 我們的作品,他們的故事
        Our work, their stories
        微信小程序接入微信支付方法
        發布人:龍兵科技 17-05-17
        微信小程序開發出來后,想要用在線支付功能怎么辦?畢竟在小程序里面實現微信支付的話還是會帶來很大的便捷的。有過開發服務號下微信支付經驗的親會發現,其實小程序里的微信支付和服務號里面的開發過程很像。
        那么具體過程是怎樣的呢?移步到微種草君七嬤嬤帶你瞧瞧:
        Step1:開通微信支付和微信商戶號

        這個過程幾乎就和開通服務號的微信支付一樣。

        Step2:獲得用戶的 OpenID
        首先,我們需要在小程序的客戶端的邏輯層中,獲取當前用戶的 OpenID。通過調用 wx.login方法,可以得到用戶的code,然后開發者服務器使用登錄憑證code 獲取 openid。
          wx.login({
          success: function (res) {
          if (res.code) {
          //發起網絡請求
          wx.request({
          url: 'https://yourwebsit/onLogin',
          method: 'POST',
          data: {
          code: res.code
          },
          success: function (res) {
          var openid = res.data.openid;
          },
          fail: function (err) {
          console.log(err)
          }
          })
          }
          else {
          console.log('獲取用戶登錄態失敗!' + res.errMsg)
          }
          }
          });
          var code = req.param("code");
          request({
          url: "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code",
          method: 'GET'
          }, function (err, response, body) {
          if (!err && response.statusCode == 200) {
          res.json(JSON.parse(body));
          }
          });
        Step3:獲取 prepay_id和支付簽名驗證paySign
        這一步的過程,和服務號里的微信支付過程一樣。這個過程區分為客戶端操作,以及服務器端的操作。首先來看一下客戶端邏輯層實現。在服務號里,我們是通過如下的代碼來調起支付功能:
          function jsApiCall() {
          WeixinJSBridge.invoke('getBrandWCPayRequest', {
          "appId": "", //公眾號名稱,由商戶傳入
          "timeStamp": "", //時間戳,自1970年以來的秒數
          "nonceStr": "", //隨機串
          "package": "prepay_id=",
          "signType": "MD5", //微信簽名方式:
          "paySign": "" //微信簽名
          }, function (res) {
          WeixinJSBridge.log(res.err_msg);
          if (res.err_msg == "get_brand_wcpay_request:ok") {
          ;
          }
          else {
          ;
          }
          });
          }
        在小程序里,我們是通過 wx.requestPayment 方法調起支付功能。當然,在這之前,我們先要獲取 prepay_id。
          wx.request({
          url: 'https://yourwebsit/service/getPay',
          method: 'POST',
          data: {
          bookingNo: bookingNo,
          total_fee: total_fee,
          openid: openid
          },
          header: {
          'content-type': 'application/json'
          }, success: function (res) {
          wx.requestPayment({
          'timeStamp': timeStamp
          , 'nonceStr': nonceStr
          , 'package': 'prepay_id=' + res.data.prepay_id
          , 'signType': 'MD5'
          , 'paySign': res.data._paySignjs
          , 'success': function (res) {
          console.log(res);
          }
          , 'fail': function (res) {
          console.log('fail:' + JSON.stringify(res));
          }
          })
          },
          fail: function (err) {
          console.log(err)
          }
          })
        在服務器端,我們需要實現的是 prepay_id 的獲取,以及簽名 paySign 的獲取。
          var bookingNo = req.param("bookingNo");
          var total_fee = req.param("total_fee");
          var openid = req.param("openid");
          var body = "費用說明";
          var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
          var formData = "";
          formData += "appid"; //appid
          formData += "test";
          formData += "" + body + "";
          formData += "mch_id"; //商戶號
          formData += "nonce_str";
          formData += "notify_url";
          formData += "" + openid + "";
          formData += "" + bookingNo + "";
          formData += "spbill_create_ip";
          formData += "" + total_fee + "";
          formData += "JSAPI";
          formData += "" + paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, spbill_create_ip, total_fee, 'JSAPI') + "";
          formData += "";
          request({
          url: url,
          method: 'POST',
          body: formData
          }, function (err, response, body) {
          if (!err && response.statusCode == 200) {
          var prepay_id = getXMLNodeValue('prepay_id', body.toString("utf-8"));
          var tmp = prepay_id.split('[');
          var tmp1 = tmp[2].split(']');
          //簽名
          var _paySignjs = paysignjs(appid, mch_id, 'prepay_id=' + tmp1[0], 'MD5', timeStamp);
          var o = {
          prepay_id: tmp1[0]
          , _paySignjs: _paySignjs
          }
          res.send(o);
          }
          });
        下面是用到的函數:
          function paysignjs(appid, nonceStr, package, signType, timeStamp) {
          var ret = {
          appId: appid,
          nonceStr: nonceStr,
          package: package,
          signType: signType,
          timeStamp: timeStamp
          };
          var string = raw1(ret);
          string = string + '&key=' + key;
          console.log(string);
          var crypto = require('crypto');
          return crypto.createHash('md5').update(string, 'utf8').digest('hex');
          };
          function raw1(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;
          };
          function paysignjsapi(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 = raw(ret);
          string = string + '&key=' + key;
          var crypto = require('crypto');
          return crypto.createHash('md5').update(string, 'utf8').digest('hex');
          };
          function raw(args) {
          var keys = Object.keys(args);
          keys = keys.sort()
          var newArgs = {};
          keys.forEach(function (key) {
          newArgs[key.toLowerCase()] = args[key];
          });
          var string = '';
          for (var k in newArgs) {
        我有話說
        聯系我們
        掃二微碼
        麻豆亚洲av熟女国产一区二| 综合亚洲伊人午夜网| 国产天堂在线观看| 青青草原综合网| 国产女人aaa级久久久级| 色青青草原桃花久久综合| 在线精品一区二区三区电影| 一个人看的www免费高清| 天天综合色天天综合| chinese乱子伦xxxx国语对白| 国内精品久久人妻互换| 91青青青国产在观免费影视| 国产精品亚洲欧美一级久久精品 | 国产精品自产拍高潮在线观看| 97精品国产一区二区三区| 国产精品一卡二卡三卡| 香蕉视频污在线观看| 国产太嫩了在线观看| 美女扒开小内裤| 动漫人物桶动漫人物免费观看| 玉蒲团之偷情宝典| 亚洲色偷偷色噜噜狠狠99网| 欧美性猛交xxxx乱大交中文| 亚洲国产欧美日韩精品小说| 日韩午夜伦y4480私人影院| 久久婷婷色一区二区三区| 成人黄软件网18免费下载成人黄18免费视频 | 久久久久亚洲av无码专区蜜芽| 影音先锋在线_让看片永远陪伴| 一级特黄录像免费播放中文版 | 国产乱理伦片a级在线观看| 精品久久久久久国产| 免费无码AV一区二区三区| 欧美日韩高清完整版在线观看免费 | 大伊人青草狠狠久久| 91青青草视频| 国产婷婷色一区二区三区| 精品真实国产乱文在线| 偷窥欧美wc经典tv| 欧美a级黄色片| 久久精品99久久香蕉国产|