Popular blog tags

  手机                            云服务器              微信官方支付服务器

(小程序云客户端)          (云函数)             微信支付服务器

 

1.按约定规则组合参数,向https://api.mch.weixin.qq.com/pay/unifiedorder发起调用,拿回prepay_id参数。

2.用拿回的参数prepay_id再次组合,发起支付请求。

 

 

1,小程序appid
2,云开发环境id
3,微信商户号
4,商户密匙

微信小程序微信支付官方流程图链接我简化的流程

step 1:设计按钮

<!--miniprogram/pages/to-pay-order/index.wxml-->
<view class="container">
  
  
 <button bindtap='pay'>buy</button>
   
</view>

 

step 2:绑定事件

// miniprogram/pages/to-pay-order/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },


  pay: function () {

   

      

  }
   

})

 

step 3:客户端调用框架

选用Promise 风格调用

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/functions/callFunction.html

wx.cloud.callFunction({
  // 要调用的云函数名称
  name: 'add',
  // 传递给云函数的event参数
  data: {
    x: 1,
    y: 2,
  }
}).then(res => {
  // output: res.result === 3
}).catch(err => {
  // handle error
})

 

pay: function () {

    wx.cloud.callFunction({
      // 要调用的云函数名称
      name: 'payment',
      // 传递给云函数的event参数
      data: {
        x: 1,
        y: 2,
      }
    }).then(res => {
      console.log('调用云支付函数OK:'+res)
    }).catch(err => {
      console.log('调用云支付函数fail: ' + err.errMsg)
    })

  }

step 4:新建云函数pay

// 云函数微信入口文件
//come from:https://github.com/Voyzz/Fruit-store-mp/blob/master/cloudfunctions/pay/index.js
const cloud = require('wx-server-sdk')
const request = require('request')

cloud.init()

// 云函数入口函数
// 获取prepay_id
exports.main = async (event, context) => {
  let result = await getPrepayIdPromise(event);
  return result
}

const getPrepayIdPromise = function (event) {
  return new Promise((resolve, reject) => {
    let options = {
      "url": 'https://api.mch.weixin.qq.com/pay/unifiedorder',
      "method": "POST",
      "headers": {
        "Content-Type": "text/xml",
        "charset": "utf-8"
      },
      "form": event.xmlData
    };
    request.post(options, (err, result, body) => {
      resolve({
        err: err,
        body: body
      })
    })
  })
}

 

return new Promise(function (resolve, reject) {
    let options = {
      url: "https://api.mch.weixin.qq.com/pay/unifiedorder",
      timeout: 1000,
      body: formData,
    };

    // console.log('reqXml', reqXml);

    request.post(options, function (error, response, body) {
      if (error) {
        console.log("=======================支付云函数连接微信官方支付服务器失败:" + error + "=====================");
        reject(error);
      } else {
        console.log('支付云函数调用微信官方支付服务器返回的信息: ', body);
        resolve(body);
      }
    });

  });

 

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <attach>支付测试</attach>
   <body>JSAPI支付测试</body>
   <mch_id>10000100</mch_id>
   <detail><![CDATA[{ "goods_detail":[ { "goods_id":"iphone6s_16G", "wxpay_goods_id":"1001", "goods_name":"iPhone6s 16G", "quantity":1, "price":528800, "goods_category":"123456", "body":"苹果手机" }, { "goods_id":"iphone6s_32G", "wxpay_goods_id":"1002", "goods_name":"iPhone6s 32G", "quantity":1, "price":608800, "goods_category":"123789", "body":"苹果手机" } ] }]]></detail>
   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
   <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
   <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
   <out_trade_no>1415659990</out_trade_no>
   <spbill_create_ip>14.23.150.211</spbill_create_ip>
   <total_fee>1</total_fee>
   <trade_type>JSAPI</trade_type>
   <sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

 

返回结果
"<xml><return_code><![CDATA[SUCCESS]]></return_code>\n<return_msg><![CDATA[OK]]></return_msg>\n<appid><![CDATA[wx9b00e80b6****]]></appid>\n<mch_id><![CDATA[15*****]]></mch_id>\n<nonce_str><![CDATA[5a7I0LWiPaAa1QJZ]]></nonce_str>\n<sign><![CDATA[7419DD696686A2ADD5B466D4FCDF6219]]></sign>\n<result_code><![CDATA[SUCCESS]]></result_code>\n<prepay_id><![CDATA[wx10212206059271b7365263ce1864643600]]></prepay_id>\n<trade_type><![CDATA[JSAPI]]></trade_type>\n</xml>"

 

客户端:

签名步骤:

#1.对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串:

appId=***&nonceStr=xko42en9z3i&package=prepay_id=wx040102530328974f881b611299800100&signType=MD5&timeStamp=1575392572

#2.连接商户key:

appId=***&nonceStr=xko42en9z3i&package=prepay_id=wx040102530328974f881b611299800100&signType=MD5&timeStamp=1575392572&key=833843333354ddde

#3.生成sign并转成大写:

 var paySign = md5.md5(paySignTemp).toUpperCase()

paySign=06891AB4D4AA3713A13D1C2BE03B98FB

注意:

在第一次签名时是小写“appid”  二次前面是驼峰大写“appId”

微信支付接口签名校验工具

https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1

 

微信小程序通过云函数进行微信支付

https://blog.csdn.net/gf771115/article/details/100917779

真机测试已通过未用第三方支付的代码

https://developers.weixin.qq.com/community/develop/doc/000620ec5acb482103b7bf41d51804

水果小程序

https://github.com/Voyzz/Fruit-store-mp/blob/master/cloudfunctions/pay/index.js

 

小程序云开发使用第三方库pay实现小程序支付功能(含源码)

https://developers.weixin.qq.com/community/develop/article/doc/000ceae09288489c0e9886e6c59c13

小程序云开发使用第三方库wx-js-utils实现小程序支付功能(含源码)

https://blog.csdn.net/weixin_34268310/article/details/91422026

小程序云开发使用第三方库wx.BaaS.pay实现小程序支付功能(含源码)

https://blog.csdn.net/chuizigun7053/article/details/100894595

小程序云开发使用第三方库tenpay实现小程序支付功能(含源码)

https://blog.csdn.net/qiushi_1990/article/details/99347580