- 移动应用想要调用微信的支付功能,需要到微信开发平台申请创建移动应用,微信会给appid,拿到appid到HBuilderX中打开一个uni-app项目,添加对应的sdk。
- 在微信开发平台申请好的移动应用要开通微信支付功能,需将微信的商户号绑定到该移动应用上,这时候就需要注册微信商户号了,到微信商户平台。
- 注册好绑定移动应用的appid即可,接下来就是开发步骤。
- 大体步骤就是,Java后台代码给微信的统一下单接口发一个请求,拿到响应后返回给前端的app,app拿到响应后传给微信拉起微信支付弹窗,然后确认付款即可,至于使用者付的款会落到绑定的商户号上面。
- 微信会提供Java后端开发的一些工具代码,简要实现:后端组装一下请求参数:appid(移动应用id,微信开发平台申请到的),mch_id(商户号,商户平台申请的),nonce_str(随机字符串,Java自己生成的),body(一个字符串,用来描述该应用的作用,如:天天爱消除-游戏充值),out_trade_no(商户订单号,这个是公司后端自己生成的业务代码,用来标识哪一个用户充值的订单号),total_fee(订单金额),spbill_create_ip(调用微信支付api的机器ip),notify_url(接收微信支付异步通知回调地址),trade_type('APP',标识这次请求来源是啥),sign(签名)
- 这里最关键的就是这个签名,签名怎么生成呢:) 笔者这里遇到很多坑,上述那些参数都需要组装成Java map,关键就是sign这个字段需要依赖上述那个map按照key的ASCII码排序后组装成查询参数,然后在查询参数后面加上'&key=xxxxxxx',key是商户平台上的密钥,组装好后得到字符串str,将str通过md5算法加密后大写得到的字符串就是sign的值,然后将sign和其值放入参数的map中,将参数通过工具类方法发送给微信即可,微信拿到后会生成响应,这些响应需要给前端发给微信使用的,那微信响应怎么包装成前端发给微信的呢?
- 后端拿到微信正确的响应后,需要从其中取出一些字段,存在map中,然后包装成查询参数字符串加上key,再md5后大写,将获得的字符串放在map中,作为sign的属性值,最后将map返给前端即可,这里需要注意的是,不论是发给微信的参数,还是发给前端让前端发给微信的参数的每一个字段名都需要跟微信要求的一致。
- 当前端拿到值后调用
uni.requestPayment(Object)
uni.requestPayment({
provider: 'wxpay',
orderInfo: JSON.stringify(config),
success(res) {},
fail(err) {}
})
app即拉取微信支付弹窗付费。uni-app的api搜一下就能出来,config为后端返回的要传给微信的参数。
'{"appid":"wx0411fa6a39d61297","noncestr":"71maVjWiEAvU85Wk","package":"Sign=WXPay","partnerid":"1230636401","prepayid":"wx03141004900988e2c281e3170042244847","timestamp":1535955004,"sign":"2AE06EF08E54B47659C79149CD9C284C"}'
注意点
安卓微信支付-100 (-1)错误排除指导
{"errMsg":"requestPayment:fail:[payment微信:-1]General errors"}
核对后端代码,查验统一下单和调起支付接口的逻辑是否有误,并确保两次签名生成算法一致。
过程有点麻烦,拉支付弹窗很可能报-1的错误,几乎可以肯定是参数问题,不是后端传给微信的参数问题,就是前端传给微信的有问题