Android第三方支付——微信支付
目录
之前一直说要坚持写一个技术博客,但是人都有惰性,说是那么说了,就是不见行动。今天终于觉悟了,痛改前非,于是产生了这篇文章。
1.微信平台注册应用
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串。签名工具下载地址,注册应用必须使用应用包名和正式应用签名,其正确性必须由开发者保证。
2.支付流程图
3.注册appId
APP引入微信JAR包,调用API前,需要先向微信注册自己APP的appid,代码如下:
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("自己应用的appId");
4.调起支付
后台生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
IWXAPI api;
if(!api.isWXAppInstalled()) {
Toast.makeText(context,"请安装微信客户端",Toast.LENGTH_SHORT).show();
}
public void pay() {
IWXAPI api;
// 去后台请求订单信息payInfo
WXPayInfo payInfo = new WXPayInfo();
PayReq request = new PayReq();
request.appId = payInfo.getAppId();
request.partnerId = payInfo.getPartnerId();
request.prepayId= payInfo.getPartnerId();
request.packageValue = payInfo.getPackageValue();
request.nonceStr= payInfo.getNonceStr();
request.timeStamp= payInfo.getTimeStamp();
request.sign= payInfo.getSign();
api.sendReq(req);
}
5.支付结果回调
publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
swich(resp.errCode) {
case 0:
//支付成功
break;
case -1:
//支付失败
break;
case -2:
//支付取消
break;
}
}
}
微信支付回调WXPayEntryActivity类必须写在项目名下一级目录wxapi包中,其中支付回调-1(支付失败)结果可能出现的原因如下:
- 签名错误
- 未注册appid到微信平台
- 项目中设置的appid错误
- 注册的appid与设置的appid不同
6.注意事项
- 支付失败大多数是签名错误导致。
- 回调的WXPayEntryActivity的位置未写正确,或者未注册该activity。
- 如果微信支付是在library中实现的,WXPayEntryActivity的位置还必须是项目名一级目录下wxapi包中,否则回调不到。
- 打包的apk签名信息与微信平台注册时不同,将签名文件重新生成一下。
- 后台获取订单信息后再次签名参数时严格区分参数大小写问题(开发中后台返回没有按微信平台要求,导致我花了大半天时间查询问题所在,感受如何你们懂得。。。。。。)