小程序变化太快了, 文档不断修改, 甚至官方文档都更新不上。
为了防止喷我胡说, 有图有链接为证
上链接
这个是支付引导:
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)
然后去小程序->功能->微信支付->商户号管理,确认绑定
哈哈哈
不行,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--