Android移动支付踩过的坑,哪里有坑哪里填(返回-1)
转载请注明 —— [ 肖义熙 ]
1、关于移动支付
目前很多APP使用了第三方支付,如:微信、支付宝等等。从他们的官网上都可以看到清(luan)清(qi)楚(ba)楚(zao)的接入文档。相信看着文档接入一次就能成功的人很少很少~下面来说说集成前的准备吧。
2、集成准备
微信支付集成准备:
a)申请应用
如何注册相信看这篇文章没什么卵用,看这个文章的人前期准备肯定是已经准备好了。但是为什么还要说这个步骤呢?理由很简单,申请应用的时候需要填入的应用包名和应用签名很重要,这一步要是设置错了就谈不上集成微信支付了。请看以下图:
b)导入jar包
这一步几乎没什么可说的了,直接导入他们的demo中libs下的jar包即可。需要注意的是你需要导入的是支付的demo下的jar,这个比较坑的是分享和支付的两个jar名称是一样的!!上次我集成的时候就搞错了,让我都快开始怀疑人生了!
b)开始写代码了
1、向微信注册你的APPID,在调起支付前判断是否安装微信客户端并注册:
private boolean isWXAppInstalledAndSupported() {
IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
//向微信注册你的APPID
msgApi.registerApp(APPID_WEIXIN);
//是否安装了微信客户端
boolean sIsWXAppInstalledAndSupported = msgApi.isWXAppInstalled()
&& msgApi.isWXAppSupportAPI();
return sIsWXAppInstalledAndSupported;
}
2、调起支付
这里我就当一个大自然的搬运工吧,微信官方文档写的就挺好
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f"; //可以从本地取,也可以放服务器
request.partnerId = "1900000109";//从服务器取
request.prepayId= "1101000000140415649af9fc314aa427";//服务器取
request.packageValue = "Sign=WXPay";//写死或服务器取
request.nonceStr= "1101000000140429eb40476f8896f4c9";//服务器取
request.timeStamp= "1398746574";//服务器取
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";//服务器取
api.sendReq(request);//这里官方文档写错了(撸多了吧),参数应该是request
注:上面代码提到的“服务器取“指的是从你们自己服务器取的数据。APP端提交一个订单,后台将订单信息传到微信服务器端生成一个预支付订单,同时微信服务端将返回信息给后台,后台处理后将数据返回到APP端,APP拿着这些数据调起支付。
哦!!!!!对了,这里需要大概介绍一下整个支付流程了!!非常重要!!!!
我们先看微信官方给出的:
看完这个,说的很清楚吧~这里注意看步骤4、6、7。
(4)调用统一下单API(怎么下单这个你就不用管后台了),一定记得提醒后台加密签名等等操作!
(6)生成待签名的客户端支付信息:后台接收到(5)来自微信服务端的数据后已定要记得处理数据( 重新对这些数据进行签名,方法和统一下单的签名方法一样!)
(7)拿着后台将微信服务器端返回的数据再一次进行签名后的数据调起支付,并在APP端处理支付回调
/**
* 调起微信支付
* @param data
*/
private void payOrder(Prepay data){
PayReq request = new PayReq();
request.appId = HttpUrl.APPID_WEIXIN;
request.partnerId = data.getMch_id();
request.prepayId= data.getPrepay_id();
request.packageValue = "Sign=WXPay";
request.nonceStr= data.getNonce_str();
request.timeStamp= data.getAdd_time();
request.sign=data.getSign();
msgApi.sendReq(request);
}
//在WXPayEntryActivity中处理支付回调
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if(resp.errCode == 0){
//支付成功,处理结果
Intent intent = new Intent(WXPayEntryActivity.this,SuccessActivity.class);
startActivity(intent);
finish();
} else if(resp.errCode == -1) {
Toast.makeText(getApplicationContext(),resp.errStr+resp.errCode,Toast.LENGTH_SHORT).show();
finish();
} else if(resp.errCode == -2) {
Toast.makeText(getApplicationContext(),"您取消了支付...",Toast.LENGTH_SHORT).show();
finish();
}
}
}
一定要注意第六步,很大的一个坑就是后台收到微信服务器端的数据直接返回,然后你拿着这个数据再去调起支付,最终的结果只有-1
先写到这里吧,有问题的欢迎问我,看到会及时回复。