评论

传统原生支付用云开发实现(非云支付)

云开发实现小程序支付。 有用记得点赞哦。

本文的代码已过时,请勿照抄。建议改用云支付。

本文的代码被论坛自动过滤了所有XML的标签,所以照抄是会出错的。需要代码的话,看以前的老版本:

https://developers.weixin.qq.com/community/develop/doc/000620ec5acb482103b7bf41d51804?jumpto=comment&commentid=000ea67d7b4da8d6c47acd1e05b8


代码前提:只需要替换两个与自己相关的参数key和mch_id

1、小程序开通微信支付成功,去公众平台(https://mp.weixin.qq.com/);

成功后可以知道自己的mch_id,即商户号。

2、去这里:商户平台(https://pay.weixin.qq.com/),获取key = API密钥,如果是退款的话,还需要下载API证书。

以下代码仅包含统一下单,以及小程序端拉起支付的代码。

小程序端:

  testWxCloudPay: function () {
    wx.cloud.callFunction({
      name: 'getPay',
      // data: {body:"body",attach:"attach",total_fee:1}, // 可传入相关参数。
      success: res => {
        console.log(res.result)
        if (!res.result.appId) return
        wx.requestPayment({
          ...res.result,
          success: res => {
            console.log(res)
          }
        })
      }
    })
  },

云函数getPay:

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] + '')
  sa.push('' + getSign(args) + '')
  return '' + sa.join('') + ''
}

exports.main = async(event, context) => {
  const wxContext = cloud.getWXContext()
  const appId = appid = wxContext.APPID
  const openid = wxContext.OPENID
  const attach = 'attach'
  const body = 'body'
  const total_fee = 1
  const notify_url = "https://mysite.com/notify"
  const spbill_create_ip = "118.89.40.200"
  const nonceStr = nonce_str = Math.random().toString(36).substr(2, 15)
  const timeStamp = parseInt(Date.now() / 1000) + ''
  const out_trade_no = "otn" + nonce_str + timeStamp
  const trade_type = "JSAPI"
  const xmlArgs = {
    appid,
    openid,
    attach,
    body,
    mch_id,
    nonce_str,
    notify_url,
    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("")[0]
  let payArgs = {
    appId,
    nonceStr,
    package: ('prepay_id=' + prepay_id),
    signType: 'MD5',
    timeStamp
  }
  return { 
    ...payArgs,
    paySign: getSign(payArgs)
  }
}

packge.json:

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

附:完整代码片段:如果你觉得在这上面花的时间超过一天了,就去下载代码片段吧。

最后一次编辑于  8小时前  
点赞 14
收藏
评论

24 个评论

  • 郑洪智 | 虚境VRAR
    郑洪智 | 虚境VRAR
    03-10

    getXML方法里丢了好多东西,应该是这样子:

    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>'
    }
    
    03-10
    赞同 3
    回复 10
    • 老张
      老张
      03-10
      才发现。某次修改文章的时候拷贝代码出错了。
      03-10
      1
      回复
    • 拎包哥
      拎包哥
      03-16回复老张
      请问你加进去了吗。。
      03-16
      回复
    • 老张
      老张
      03-16回复拎包哥
      出错了?什么错误信息?
      03-16
      回复
    • 拎包哥
      拎包哥
      03-16回复老张
      用到了,非常感谢您老张哥
      03-16
      回复
    • 拎包哥
      拎包哥
      03-16回复老张
      原来是没有下载云函数需要的那些包。。
      03-16
      回复
    查看更多(5)
  • 默枫
    默枫
    05-14

    感谢老张的代码,借助借助这套代码把QQ小程序支付用云开发搞定了

    05-14
    赞同 1
    回复
  • 舍脂多
    舍脂多
    04-27

    返回结果:<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[XML格式错误]]></return_msg></xml>

    04-27
    赞同 1
    回复 2
    • 徐子坪
      徐子坪
      04-30
      请问解决了吗 出现了一样的问题 换api密钥也没用
      04-30
      回复
    • 劉囍朙
      劉囍朙
      05-07
      我也是同样的错误
      05-07
      回复
  • 新涛
    新涛
    04-23

    请问大神,如何支付成功跳转到指定页面?感谢感谢

    04-23
    赞同 1
    回复 3
    • 老张
      老张
      04-23
      平时跳到指定页面你会吗?wx.navigateTo了解一下。
      04-23
      1
      回复
    • 新涛
      新涛
      04-23回复老张
      感谢
      04-23
      1
      回复
    • 新涛
      新涛
      04-23
      success: res => {
              console.log(’提交成功’,res.result)
              if (!res.result.appId) return
              wx.requestPayment({
                ...res.result,
                ’success’function(res){
                    wx.navigateTo({
                 url: ’/pages/l/l’
                 })

                },
                'fail'(res) {

                  console.log("支付失败", res)
      我是这样写的,但是支付完成后没有跳转页面
      04-23
      1
      回复
  • 智享云互联
    智享云互联
    10-14

    了解微信支付费率调整0.2%详细介绍:https://zhifu.xcx-dl.com

    


    10-14
    赞同
    回复
  • 木叶随风落
    木叶随风落
    06-11
    let prepay_id = xml.split("")[0]
     改成
    let prepay_id = xml.split("<prepay_id>")[1].split("</prepay_id>")[0].split('[')[2].split(']')[0]
     泪崩呀~~
    
    06-11
    赞同
    回复 1
    • 老张
      老张
      06-11
      嗯,贴代码的时候,论坛系统会把所以XML东西都过滤掉。我也懒得弄了。
      06-11
      回复
  • 关家宝
    关家宝
    06-11

    老张,这套能不能实现分账指令嘞?

    06-11
    赞同
    回复 4
    • 老张
      老张
      06-11
      不能。
      06-11
      回复
    • 关家宝
      关家宝
      06-11回复老张
      哎,云开发啥时能实现分账呀
      06-11
      回复
    • 老张
      老张
      06-11
      什么时候都可以。自己写代码呗。你象上面的统一下单,不也是云开发嘛。
      06-11
      回复
    • 关家宝
      关家宝
      06-11回复老张
      OK
      06-11
      回复
  • 张
    05-15

    请问如果用HMAC-SHA256加密的话,应该怎么写,都需要改哪里?

    05-15
    赞同
    回复
  • Beyond
    Beyond
    05-06

    沒sign怎可? 根本不行...

    05-06
    赞同
    回复
  • 老朝奉
    老朝奉
    04-18

    简直是太TM靠谱了. 感谢

    04-18
    赞同
    回复

正在加载...

登录 后发表内容