在集成微信支付時才發(fā)現(xiàn)微信的開發(fā)文檔果然有些坑云石,本文主要是記錄我在區(qū)分微信支付回調問題的處理。也讓遇到同樣問題的小伙伴們找到處理方法淋硝。若您知道此問題的解決辦法宽菜,請不要噴我铅乡,您可以選擇點擊關閉此瀏覽器標簽,謝謝犬庇。
問題
我所遇到的需求是APP里有兩處涉及到微信支付侨嘀,訂單支付和充值支付,且支付完成后需要通知后臺做其他操作(后臺收到的支付結果通知是異步的欢峰,服務器是被動的)涨共,而微信支付的結果回調都在一個WXPayEntryActivity里面,而且此類微信官方規(guī)定的懊直。我想要區(qū)分我的支付結果是屬于訂單支付還是充值支付火鼻,以便做出相應的操作,該怎么辦呢融撞?
思路
剛開始有些懵逼尝偎,畢竟不熟悉微信支付。所以最開始選擇了用一個全局變量來保存當前的操作類型值致扯,收到支付回調后判斷此類型值,做出不同的操作急前。但總覺得這樣做有些不妥。又想想微信這樣的設計肯定不是沒有考慮到這方面啊瀑构,所以就在調用微信支付SDK的地方來找方法裆针。果不其然在PayReq里找到了這樣一個方法:調起微信支付SDK的地方
光找到傳入數(shù)據(jù)的地方還不行,所有又去了回調頁面WXPayEntryActivity里找接收數(shù)據(jù)的地方:
WXPayEntryActivity
阿西吧寺晌!居然沒有關于接收數(shù)據(jù)的方法...
又把PayResp拿來試試世吨,果然功夫不負有心人:
PayResp resp = (PayResp) baseResp;
String payType = resp.extData;
那這樣一來就好辦了呀,我就說嘛呻征,微信這樣設計肯定是考慮了這個問題的耘婚。
代碼
還是把具體代碼貼一下吧
1.生成加密串。
加密操作放在后臺的陆赋,所以只需要傳入相應的標題沐祷、本地訂單號攒岛、價格給后臺赖临,后臺會返給我調用微信支付SDK的相應參數(shù),這里要注意一下灾锯,傳給后臺的價格必須是乘以100兢榨,比如支付價格為1元,那就得傳100給后臺顺饮,當然后臺做處理也是可以的吵聪,還有價格不能為0,包括支付寶也是一樣的兼雄。收到后臺的數(shù)據(jù)如下:
{
"msg": 1,
"data": {
"appid": "wxf6a28d9fa0e4a5e7",
"partnerid": "1482680562",
"prepayid": "wx201711161536297ca36c8ab20902031739",
"package": "Sign=WXPay",
"noncestr": "cd98f00b204e9800998ecf8427e",
"timestamp": 1510817789,
"sign": "D1262473FD0AFD56E24E59248756666D"
},
}
2.調起微信支付吟逝。
這里是將后臺返回的數(shù)據(jù)都裝在了一個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() + "";
//傳入一個標識,以便區(qū)分回調
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方法中赦肋,可以看到傳入一個參數(shù)
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;
}
}
End