评论

云开发支付

云开发实现小程序支付。

前提:

1、小程序开通微信支付成功;

2、去这里获取key = API密钥

小程序端:

wx.cloud.callFunction({
  name: 'wepay',
  success: res => {
    console.log(res.result)
    if (!res.result.appId) return
    wx.requestPayment({
      ...res.result,
      success: res => {
        console.log(res)
      }
    })
  }
})

云函数wepay:

const key = "ABC...XYZ"//换成你的商户key,32位
const mch_id = "1413092000"//换成你的商户号
//以下全部照抄即可
const cloud = require('wx-server-sdk')
const rp = require('request-promise')
const crypto = require('crypto')
cloud.init()
function getSign(args) {
  let sa = []
  for (let k in args) sa.push(k + '=' + args[k])
  sa.push('key=' + key)
  return crypto.createHash('md5').update(sa.join('&'), 'utf8').digest('hex').toUpperCase()
}
function getXml(args) {
  let sa = []
  for (let k in args) sa.push('<' + k + '>' + args[k] + '</' + k + '>')
  sa.push('<sign>' + getSign(args) + '</sign>')
  return '<xml>' + sa.join('') + '</xml>'
}
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let appId = appid = wxContext.APPID
  let openid = wxContext.OPENID
  let attach = 'attach'
  let body = 'body'
  let total_fee = 1
  let notify_url = "https://mysite.com/notify"
  let spbill_create_ip = "118.89.40.200"
  let nonceStr = nonce_str = Math.random().toString(36).substr(2, 15)
  let timeStamp = parseInt(Date.now() / 1000) + ''
  let out_trade_no = "otn" + nonce_str + timeStamp
  let trade_type = "JSAPI"
  let xmlArgs = { appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type }
  let xml = (await rp({ url: "https://api.mch.weixin.qq.com/pay/unifiedorder", method: 'POST', body: getXml(xmlArgs) })).toString("utf-8")
  if (xml.indexOf('prepay_id') < 0) return xml
  let prepay_id = xml.split("<prepay_id><![CDATA[")[1].split("]]></prepay_id>")[0]
  let payArgs = { appId, nonceStr, package: ('prepay_id=' + prepay_id), signType: 'MD5', timeStamp }
  return { ...payArgs, paySign: getSign(payArgs) }
}

packge.json:

{
  "name": "wepay",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "wx-server-sdk": "latest",
    "crypto": "^1.0.1",
    "request-promise": "^4.2.2"
  }
}


最后一次编辑于  11-20  
点赞 1
收藏
评论

4 个评论

  • 小草
    小草
    11-19
    Setting data field "brArr" to undefined is invalid 小程序感觉所有传值都没有成功,之前本地测试都正常的,API上公网就报这个错,postman单独测试又是正常的
    11-19
    赞同
    回复 1
    • 老张
      老张
      11-20
      和本文有关系吗?完全看不出来。
      11-20
      回复
  • 小草
    小草
    11-19
    👍 👍 👍
    11-19
    赞同
    回复
  • 大树小酒
    大树小酒
    11-19

    放弃了.哈哈

    11-19
    赞同
    回复 2
    • 老张
      老张
      11-19
      换成你的商户key和商户号都不会的话,那就没办法了。
      11-19
      回复
    • 大树小酒
      大树小酒
      11-19回复老张
      还是谢谢你.今天下午更新个云函数都卡半天.暂且不搞了.过俩天再来吧. 加个微信.改天再请教你? pla54414
      11-19
      回复
  • searchFan
    searchFan
    11-19

    特约商户的吗?

    11-19
    赞同
    回复 6
    • 老张
      老张
      11-19
      没接触过特约商户,但是目测不影响以上代码。特约商户只是在开通支付功能的流程不一样吧?
      11-19
      回复
    • searchFan
      searchFan
      11-19回复老张
      好吧
      11-19
      回复
    • 大树小酒
      大树小酒
      11-19回复老张
      好吧.试了好几个版本的.都不通过.看看这个怎么样
      11-19
      回复
    • searchFan
      searchFan
      11-27回复老张
      试着用您这套代码,出现了以下错误:但是我那个特约商户号已经开通JSAPI了啊。。
      11-27
      回复
    • 老张
      老张
      11-28回复searchFan
      说明代码没问题了。其他的我就不懂了。
      11-28
      1
      回复
    查看更多(1)