上一篇文章我们介绍了支付宝的接入,这一篇我们正式介绍一下app怎么接入微信支付功能
正文
微信sdk下载
微信支付文档
微信签名工具app
首先我们微信和支付宝一样,都需要导入相应的sdk 微信sdk下载 ,下载完成后正常导入即可。这里微信是不支持沙箱环境的。
一般会遇到的问题:(这里我说了几个比较常见的坑)
- 微信第一次调用成功以后,后面调用会返回失败,或者没有响应。
- key签名文件与微信服务器上不匹配。
- 明明key签名文件与微信服务器上一致,但就是提示你不匹配。
解:微信支付当必须用真机测试,其次当你的app第一次拉取微信支付的时候,微信会去请求服务器,但是当你第二次再拉取支付的时候,微信会直接读本地缓存,所以当你第一次签名不正确,然后你去微信后台更改了正确的签名依旧失败的情况,就是读取了缓存,这个时候你应该清楚掉手机微信的所有数据即可,当然这里建议不要用自己手机测试哦,不然你微信数据可就全没了。 那么这里我再提一下我们微信支付在后台给的签名应该是哪一个,是我们as默认的那个sha1签名吗,不是。是我们打包时候用的key.jks的sha1吗,也不是。那么我们怎么获取签名,我们应该把app安装到手机以后,然后安装 微信签名工具app,然后打开签名工具找到我们的app,然后获取到签名,把这个签名写到微信后台就对了。(更改签名是即时生效的哦)。
使用
说完了一些坑,那么现在来说一下微信怎么调用,怎么接收回调支付结果。
先来看一下我封的调用
这里看到有一堆字段,以及最后面有一个sign签名,如果你下载了微信的demo,里面你可能会找到相应的算法,但是你在移动端不需要,我们一般的逻辑都是交给服务器去计算,移动端只拿最后的结果进行调用,这也是为了安全考虑,因为计算会用到一些appId 以及商户号等,所以这里只需要这么点东西调用。
public class WXPayUtils {
public void init(){
//支付初始化 init
api = WXAPIFactory.createWXAPI(context, APIID);
PayReq request = new PayReq();
request.appId = APIID;
request.partnerId = PARTNERID;
request.prepayId= PREPAYID;
request.packageValue = PACKAGEVALUE;
request.nonceStr= NONCESTR;
request.timeStamp= TIMESTAMP;
request.sign= SIGN;
//发起微信支付调用
boolean bpp = api.sendReq(request);
}
}
调用完以后,我们该怎么接收,微信接收和支付宝不同,微信需要你新建一个包并且包名叫 wxapi 里面新建一个WXPayEntryActivity的类,回调结果会在这里接收。
这里我们会在onResp方法中接收到支付回调,状态有三种, //0成功 -1错误 -2用户取消,相应做不同处理。
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, PayConstant.WXAPPID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
//0成功 -1错误 -2用户取消
System.out.println("微信结果:"+ConstantsAPI.COMMAND_PAY_BY_WX);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0:
//与服务器进行验证是否成功
//如果服务器返回成功则跳转到付款成功界面
//否则按照失败处理
OrderQuery(WXPayUtils.orderid);
break;
case -1:
//错误情况跳转到付款失败界面请用户前往个人中心查看订单详情
jump();
break;
case -2:
//用户手动取消了付款
jump();
break;
}
}
}
private void jump(){
....
}
//验证是否成功
private void OrderQuery(final String id) {
......
}
}
那么整个微信支付的内容就提到这里,喜欢的点个赞吧,谢谢。
这里整个支付逻辑流程的话与支付宝一样,上一篇我也说了一个支付逻辑的流程。有兴趣可以去看一下上一篇文章结尾处有提到。