1.首先在微信开放平台去申请账号开通微信支付功能,并创建新应用获取APPID
2.填写项目包名和正式包签名(建议使用官方提供的获取签名工具)
3.集成sdk
//微信支付
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
4.必须在项目包名下创建wxapi文件和WXPayEntryActivity类,否则无法调起微信支付,这里参照demo里面的WXPayEntryActivity类就可以
注意:这里必须是在包名下,而且文件名和类名也要一致,不然支付回调不起作用
这里有个小坑,demo里的WXPayEntryActivity类,
api = WXAPIFactory.createWXAPI(this, UrlConstants.WXAPPID);
api.handleIntent(getIntent(), this);
这两行代码是放在onCreate()方法的,但是我在测试支付的时候,支付成功后没调用回调方法,
查了一下,解决方案是把这两行代码放在onStart()方法里,so解决问题
还有一个关于支付回调的细节,就是在manifest文件注册时最好是文件全路径,不然支付回调也可能不起作用
5.获取prepayid由服务器调用统一下单接口获取
注意:如果服务端开发文档跟客户端demo里的参数不一样,以demo里的参数为准,
否则服务器传过来的参数无法调起微信支付!!!
6.注册appId,在发起支付的activity的onCreate里面注册即可
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp("wxxxxxxxxxxx8f4f");
7.发起支付
发起支付根据req.checkArgs()和api.sendReq(req)的结果判断
如果req.checkArgs()为false,说明请求参数有误,需要检查请求参数是否和demo中给出的一致,
再就是sign,可以根据服务器返回的参数去官方的签名校验工具检查一下签名是否正确
一般req.checkArgs()为true,api.sendReq(req)也会是true,其他情况没碰到过
只有eq.checkArgs()和api.sendReq(req)都为true时才可以正常发起支付,进行付款.
8.支付回调
回调方法根据code的值进行相关处理就可以了,code=-1时,一般就是签名问题,需检查签名是否正确
补充:
1.Android系统是否支持微信双开
举例华为和vivo系统,如果使用了微信双开,点击其中一个会出现支付窗口闪一下消失的情况,点另一个就可以正常调起支付,具体原因不明
2.服务端在调用统一下单接口前后都需要进行签名,总共需要两次签名