在集成微信支付时才发现微信的开发文档果然有些坑,本文主要是记录我在区分微信支付回调问题的处理。也让遇到同样问题的小伙伴们找到处理方法。若您知道此问题的解决办法,请不要喷我,您可以选择点击关闭此浏览器标签,谢谢。
问题
我所遇到的需求是APP里有两处涉及到微信支付,订单支付和充值支付,且支付完成后需要通知后台做其他操作(后台收到的支付结果通知是异步的,服务器是被动的),而微信支付的结果回调都在一个WXPayEntryActivity里面,而且此类微信官方规定的。我想要区分我的支付结果是属于订单支付还是充值支付,以便做出相应的操作,该怎么办呢?
思路
刚开始有些懵逼,毕竟不熟悉微信支付。所以最开始选择了用一个全局变量来保存当前的操作类型值,收到支付回调后判断此类型值,做出不同的操作。但总觉得这样做有些不妥。又想想微信这样的设计肯定不是没有考虑到这方面啊,所以就在调用微信支付SDK的地方来找方法。果不其然在PayReq里找到了这样一个方法:
调起微信支付SDK的地方
光找到传入数据的地方还不行,所有又去了回调页面WXPayEntryActivity里找接收数据的地方:
WXPayEntryActivity
阿西吧!居然没有关于接收数据的方法...
又把PayResp拿来试试,果然功夫不负有心人:
PayResp resp = (PayResp) baseResp;
String payType = resp.extData;
那这样一来就好办了呀,我就说嘛,微信这样设计肯定是考虑了这个问题的。
代码
还是把具体代码贴一下吧
1.生成加密串。
加密操作放在后台的,所以只需要传入相应的标题、本地订单号、价格给后台,后台会返给我调用微信支付SDK的相应参数,这里要注意一下,传给后台的价格必须是乘以100,比如支付价格为1元,那就得传100给后台,当然后台做处理也是可以的,还有价格不能为0,包括支付宝也是一样的。收到后台的数据如下:
{
"msg": 1,
"data": {
"appid": "wxf6a28d9fa0e4a5e7",
"partnerid": "1482680562",
"prepayid": "wx201711161536297ca36c8ab20902031739",
"package": "Sign=WXPay",
"noncestr": "cd98f00b204e9800998ecf8427e",
"timestamp": 1510817789,
"sign": "D1262473FD0AFD56E24E59248756666D"
},
}
2.调起微信支付。
这里是将后台返回的数据都装在了一个JavaBean里面
public void wxPay(WxPayStringBean.DataBean bean) {
PayReq request = new PayReq();
IWXAPI api = mModel.wxPay();
api.registerApp(Constants.KEY.WeChat.APP_ID);
request.appId = bean.getAppid();
request.partnerId = bean.getPartnerid();
request.prepayId = bean.getPrepayid();
request.packageValue = bean.getPackageX();
request.nonceStr = bean.getNoncestr();
request.timeStamp = bean.getTimestamp() + "";
//传入一个标识,以便区分回调
request.extData = "RechargePay";
request.sign = bean.getSign();
api.sendReq(request);
}
@Data
public class WxPayStringBean {
private int msg;
private String error;
private DataBean data;
private int hc;
@Data
public static class DataBean {
private String appid;
private String partnerid;
private String prepayid;
@SerializedName("package")
private String packageX;
private String noncestr;
private int timestamp;
private String sign;
}
}
在上门的wxPay方法中,可以看到传入一个参数
request.extData = "RechargePay";
3.在收到支付回调的页面做判断
@Override
public void onResp(BaseResp baseResp) {
PayResp resp = (PayResp) baseResp;
String payType = resp.extData;
switch (payType) {
case "OrderPay": //订单支付的回调
// TODO: doSomething
break;
case "RechargePay": //充值支付的回调
// TODO: doSomething
break;
}
}