小程序支付与微信支付的差异,从零分析小程序支付

小程序变化太快了, 文档不断修改, 甚至官方文档都更新不上。

为了防止喷我胡说, 有图有链接为证

上链接
这个是支付引导:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11&index=2
这个是微信小程序微信支付的:
https://mp.weixin.qq.com/wxopen/frame?t=wxpay/index_frame&iframe=/pay/mp_wxopen&token=1523089829&lang=zh_CN

可以看到第一界面不对, 然后点击进去,文档说的是可以关联已有的支付, 而新版的没有。


虽然官方文档跟不上,但是相对别的文档,还是很多比较新, 所以, 只要文档一看到对不上,立刻放弃。 目前我没找到最新的, 哈哈哈。 所以胡乱写了这篇。


小程序支付和微信JSAPI支付差异的实践问题解析
1: 直接拿关联的小程序JSAPI接入, 会发现,商户传入的appid参数不正确,请联系商户处理
2: 在目前的官方文档里面,JSAPI跟小程序下单支付是一样的
3: 需要重新生成小程序的openid

可以看出来在支付的时候,其实把公众号的appid改成小程序的appid就可以了。

小程序的appid在: 开发->开发者设置 新版的是这个地址, 搜索引擎出来的都是旧版的地址找不到

Tip如果没有做其他配置, 这时候还是会失败, 这时候打印信息,(如果有发现返回的值异常但是没看到错误信息,请修改源码,在微信统一下单的地方打印), 微信小程序支付统一下单的地址API如下https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1,可以去看异常信息

"商户号mch_id与appid不匹配"的问题解决

需要去微信支付添加appid(小程序appid)



然后去小程序->功能->微信支付->商户号管理,确认绑定


image.png

哈哈哈



不行,openid乱写被它知道了,接下来还是需要搞定小程序的appid

小程序获取openid

获取code值, 如果是web-view, 用url传参的方式传递到web-view, 然后进入后台获取openid,然后用wx.miniProgram.postMessage把结果告诉小程序,下次就不需要获取code。

小程序:

wx.login({
      success: res => {
        console.log(res.code)
        this.setData({
          showWebUrl: true,
          webUrl: `${webUrl}?code=${res.code}`
        })
      }

web-view:
不用web-view的请略过。 处理跟公众号一样, 参考我上个文章。

后台:
以nodejs为例子(可直接复制,纯原生代码):

(params) => new Promise(async (resolve, reject) => {
    let {code} = params
    var url = `https://api.weixin.qq.com/sns/jscode2session?appid=${Config.smallProgramPayInfo.appid}&secret=${Config.smallProgramPayInfo.appSecret}&js_code=${code}&grant_type=authorization_code`
    https.get(url, (res) => {
        var datas = ''
        res.on('data', (d) => {
            datas += d
        })
        res.on('end', (d) => {
            console.log('微信授权结果')
            console.log(datas)
            console.log(typeof datas)
            var result = JSON.parse(datas)
            if(result.errcode){
                resolve({code: 1, msg: result.errmsg})
                return
            }
            if(result.openid){
                resolve({code: 0, msg: result.openid})
                return
            }
        })
    })
    .on('error', (e) => {
      resolve({code: 0, msg: '服务器异常'})
      console.error(e)
    })

关于公众号可以,小程序不可以

正常这时候然后可以直接用了,前端传参数判断下调用哪个key就可以
Config[isMini ? '小程序' : '公众号']

但是我遇到一个问题, 竟然搞了一天,好郁闷哦(mmp哦), 越调试越郁闷,明明签名都没错,还提示签名错误, 搞得怀疑人生, 到了晚上的时候发现是前端问题。

if(isminiProgram){
                let addNonceStr = msg => {
                    return {
                        ...msg,
                        nonceStr: msg.nonceStr || (+new Date()) + ''
                    }
                }
                // 通知小程序
                wx.miniProgram.navigateTo({
                    url: `/pages/wxpay/index?payParam=${
                        payResult.msg |> 
                        addNonceStr |> 
                        JSON.stringify |> 
                        encodeURIComponent
                    }`
                })
                return
            }

其他问题基本提示很清楚。到此结束了。

other

获取ip方法:

let ip = req.headers['x-forwarded-for'] ||
        req.connection.remoteAddress ||
        req.socket.remoteAddress ||
        req.connection.socket.remoteAddress

关于回调和退款:
跟公众号一致(上一篇文章有公众号的),如果回调地址一致的话,记得校验的时候加个小程序的。


参考链接:
https://pay.weixin.qq.com/wiki/doc/api/index.html
小程序: 明月小店(可能还在审核中)
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1

--END--

你可能感兴趣的:(小程序支付与微信支付的差异,从零分析小程序支付)