微信支付的实现非常简单,核心代码就十几行,但是一旦出问题,就很难找到问题所在
简单介绍一下:
- 引入包
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
- 在appliction中注册
IWXAPI api = WXAPIFactory.createWXAPI(this, null,false);
api.registerApp("你的appid");
- 发起支付
// 数据是服务端生成的
IWXAPI api = WXAPIFactory.createWXAPI(context, entity.getResp_data().getAppid(),false);
PayReq request = new PayReq();
request.appId = entity.getResp_data().getAppid();
request.partnerId = entity.getResp_data().getPartnerid();
request.prepayId= entity.getResp_data().getPrepayid();
request.packageValue = "Sign=WXPay";//entity.getResp_data().getDatapackage();
request.nonceStr= entity.getResp_data().getNoncestr();
request.timeStamp= entity.getResp_data().getTimestamp();
request.sign= entity.getResp_data().getSign();
api.sendReq(request);
- 接收返回值
@Override
public void onResp(BaseResp resp) {
/*
0 支付成功
-1 发生错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 发生场景:用户不支付了,点击取消,返回APP。
*/
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// 根据返回码
int code = resp.errCode;
switch (code) {
case 0:
// 去本地确认支付结果
EventBus.getDefault().post("0");
finish();
break;
case -1:
Toasts.showShort(App.getAppContext(),"支付异常");
finish();
break;
case -2:
Toasts.showShort(App.getAppContext(),"支付已取消");
finish();
break;
default:
Toasts.showShort(App.getAppContext(),"支付失败");
finish();
break;
}
}
}
什么目录结构之类的就不在赘述了,主要说一下最坑的错误代码: -1
因为支付是服务端统一下单的,数据都是组装好的,如果不是的话,再检查一下签名加密之类的。
理论上来说,我这边直接po过去,就调起微信,开始支付。也成功了,后来就没管了。
等打包的时候,在后台改了md5,但,开始报错了,-1。
各种检查,各种怀疑人生,还是-1 。
闲得蛋疼,把微信账号退了,再次开启支付。
首先是调起了微信,要求登录,好,登录一个新的微信账号,要求添加银行卡等支付前置,添加好了,支付成功了!
数据没问题的情况下,可以考虑清空微信的缓存。
个人猜测,微信调起支付的注册验证是优先本地的,即:
我在之前使用debug包在微信内注册一次,正常使用,当换为签名包时,MD5变更,验证失败,返回-1。清空缓存后,没在本地查找到注册,重新注册,通过。
有相同问题的可以尝试一下。