Android微信支付sdk对接问题总结

背景

很多公司app、小程序、h5都需要接入微信支付,支付宝支付,甚至很多第三方银行或者渠道支付,以满足业务需求。这里主要总结微信支付遇到问题,以及解决方案。不枉费花费一天时间对接微信app支付。

微信资源

app端只涉及统一下单,以及调起支付api。退款以及其他由服务端完成
文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
demo下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
api列表:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

前期准备

1、注册微信开放平台账号,并添加app。app的信息一定要准确,包括应用名,包名,app签名,做过微信分享、微信登录的应该知道。确保信息准确,不然会给后期调试带来不必要的麻烦
2、开通app微信支付功能,需要注册微信商家开放平台账号,并在微信开放平台app的支付信息里绑定微信商家开放平台的商户号。
3、在微信商家开放平台,设置key。具体可以参考微信官方文档。这一步由于是公司财务操作,开发没有商家开放平台账号,所以本人没操作。

开始接入

app端接入:按照官方文档接入即可。

服务端:

方式一:maven方式接入。
方式二:不集成微信服务端sdk,自己拼接参数调用微信官方api。

调试问题

app端问题:

1、注意微信开放平台的appId是否正确
2、运行在手机上的app的包名,签名是否跟微信开放平台注册的包名、签名一致。很多开发AS直接run,用的是AS的debug签名或者是自己配置的debug签名。请确保签名一致

服务端问题:

maven方式

1、调用微信统一下单api,请看官方文档,很详细,哪些参数是必传参数,哪些是选传参数都有描述。https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1。很多网上接入的问题,很多贴代码的,都是有问题的,统一下单api入参都少了sign这个必传参数。当然这个sign参数有什么作用呢,很多人只知道要传,传什么值,但是微信是怎么通过sign字段进行校验的呢,仔细想想。sign是微信用来验证的,是参数map生成的,是为了防止篡改参数map的key和value。个人猜测,微信服务api和微信APP sdk接受到sign后,会根据sign的生成规则,反向推算出参数map的key value,如果推算出来的key 大小写不一致,名字不一致,value的值不对,都会返回失败,包括app端调用微信sdk,也会失败。
2、统一下单api入参sign,一定是要传的。sign怎么生成的呢,微信服务端有提供方法去生成(WXPayUtil.generateSignature),重点是统一下单其他参数map组装好,将map、商家开放平台的key(不是商家开放平台的商户id),当入参传入微信服务端sdk的方法(WXPayUtil.generateSignature)即可得到sign的值,默认是md5方式。再把sign参数添加到总的map参数,调用统一下单wxpay.unifiedOrder。
3、统一下单接口会返回一些支付信息,需要服务端回传给app客户端。此时要注意,统一下单接口会返回sign字段,这个字段是没有用的,千万不要用,千万不要用,千万不要用,如果你把这个返回的sign给了客户端,那你等着被客户端吊打吧。sign需要重新生成,生成方式跟第一步调用统一下单api生成方式一致,只不过参数map变成了调起支付接口api的参数map,https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2。appid、partnerid、prepayid、package、noncestr、timestamp这6个字段,map的key一定要注意大小写,请跟这6个字段保持一致,value就是具体的值。package的值如果app端写死了Sign=WXPay,那么服务端package的值也需要一致为Sign=WXPay,如果app端没有写死,则服务端可以自定义,app端调起微信支付sdk时需要用服务端返回的package值。调用WXPayUtil.generateSignature,传入以上拼装的参数map,商家的key即可得到sign的值。
4、appid、partnerid、prepayid、package、noncestr、timestamp、sign7个参数返回给app端使用。如果前面步骤没问题,这一步会很顺畅。app端用服务端返回的字段,直接可调起支付。

不集成微信服务端sdk,手动调用微信api方式

1、调用统一下单api:sign参数生成方式一致,只不过需要自己根据微信提供的签名算法去生成(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3)。文档有说明重要规则,请认真查看,包括参数ASCII排序,参数名区分大小写等。组装成xml,请求统一下单api。可以参考接口规则官方文档https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3#
2、返回给app端字段信息跟maven方式一致。sign字段生成方式要跟调用统一下单接口入参sign生成方式一致(生成sign的参数map不一致,生成方式一定要一致)

你可能感兴趣的:(Android微信支付sdk对接问题总结)