微信支付的相關(guān)步驟
1.前提準(zhǔn)備
??公司的要求是接入微信支付,但是之前沒怎么接觸,這里記錄下。申請注冊審核的步驟都已經(jīng)省略,這些工作,在項(xiàng)目開始的時(shí)候就需要開始進(jìn)行申請,因?yàn)槲⑿诺膶徍似诔措u長,而且這中間還可能回因?yàn)槟承┰虮痪堋K孕枰崆白龊脺?zhǔn)備。下面這些是步驟:
1.首先拿到你的AppId(這個(gè)值是申請成功了之后微信給你的);
2.下載demo,微信支付給你的demo,主要是拿到里面的包。就這兩個(gè)
文件夾下wechat-sdk-android-with-mta-1.0.2.jar在開發(fā)聯(lián)調(diào)環(huán)境中使用。
3.你需要在你的app根文件目錄下,有這么一個(gè)文件目錄:
微信的要求,因?yàn)樗鼤詣釉谀愕母夸浵聶z索文件,也就是這個(gè)包。
4.在文件目錄下有這個(gè)一個(gè)文件,整個(gè)拷貝過來,這也是微信的要求整個(gè)拷貝過來。
2. 開發(fā)準(zhǔn)備
做好了基本的準(zhǔn)備功能,下面這里的是具體的調(diào)用步驟:
1.新建一個(gè)bean類,名字為WXPayBean.java。以我的項(xiàng)目為例子。(特別說一下,這里的參數(shù),是后臺哪邊返回的,具體的值,由后臺哪邊定,基本上就這么點(diǎn)。)
public class WXPayBean implements Serializable {
private String appid;
private String mchId;
private String nonceStr;
private String prepayId;
private String resultCode;
private String returnCode;
private String returnMsg;
private String sign;
private String timeStamp;
private String tradeType;
private String packageValue;
public String getPackageValue() {
return packageValue;
}
public void setPackageValue(String packageValue) {
this.packageValue = packageValue;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getNonceStr() {
return nonceStr;
}
public void setNonceStr(String nonceStr) {
this.nonceStr = nonceStr;
}
public String getPrepayId() {
return prepayId;
}
public void setPrepayId(String prepayId) {
this.prepayId = prepayId;
}
public String getResultCode() {
return resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
public String getReturnCode() {
return returnCode;
}
public void setReturnCode(String returnCode) {
this.returnCode = returnCode;
}
public String getReturnMsg() {
return returnMsg;
}
public void setReturnMsg(String returnMsg) {
this.returnMsg = returnMsg;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
public String getTradeType() {
return tradeType;
}
public void setTradeType(String tradeType) {
this.tradeType = tradeType;
}
}
- 接下來,是請求后臺的接口,然后對后臺接口返回值進(jìn)行操作。這里是自己封裝的請求
Ordernumber,是自己項(xiàng)目的訂單編號。
final IWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID,false);
api.registerApp(Constants.APP_ID); //將微信返回給你的AppId值帶進(jìn)去就好了。
onResponse 是請求成功以后返回的值。將object 的類型轉(zhuǎn)換為你之前見的bean類。
取出返回的數(shù)據(jù)。
appId,這個(gè)值可以自己取,也可以用之前的固定值
mchId 、這里注意下,微信的小坑。 你看微信的文檔時(shí)候,https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
在Api列表里面,統(tǒng)一下單和調(diào)起支付接口的請求參數(shù),都是商戶號,但是商戶號的值竟然不一樣。 Partnered 和mch_id
主要代碼就是這一點(diǎn):
PayReq req = new PayReq();
req.appId =appId;
req.partnerId =mchId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp=wxContent.getTimeStamp();
req.sign = sign;
req.packageValue=wxContent.getPackageValue();
api.sendReq(req);
//微信支付
public void WXPay(String orderNumber) {
final IWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID,false);
api.registerApp(Constants.APP_ID);
HttpPostAsyn asyn=new HttpPostAsyn(ApiConfig.PATH_USER);
asyn.addParamters("action","unified_order");
asyn.addParamters("body","項(xiàng)目名稱-"+categoryName);
asyn.addParamters("price",totalPrice+"");
asyn.addParamters("outtradeno",orderNumber);
asyn.addCallBack(new HttpCallBack() {
@Override
public void onFailure(CustomizException e) throws Exception {
@Override
public void onResponse(Object object1) throws Exception {
WXPayBean wxContent = (WXPayBean) object1;
if(wxContent!=null){
String appId = wxContent.getAppid();
String mchId = wxContent.getMchId();
String prepayId = wxContent.getPrepayId();
String nonceStr = wxContent.getNonceStr();
String sign = wxContent.getSign();
try {
PayReq req = new PayReq();
req.appId =appId;
req.partnerId =mchId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp=wxContent.getTimeStamp();
req.sign = sign; req.packageValue=wxContent.getPackageValue();
// Toast.makeText(mContext, "正常調(diào)起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果應(yīng)用沒有注冊到微信,應(yīng)該先調(diào)用IWXMsg.registerApp將應(yīng)用注冊到微信 api.sendReq(req);
} catch (Exception e) {
e.printStackTrace();
Log.e("tag", "異常:" + e.getMessage()); Toast.makeText(mContext, "異常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(mContext, "服務(wù)器請求錯(cuò)誤", Toast.LENGTH_SHORT).show();
}
}
});
OkHttpUtil.HttpAsyn(asyn,WXPayBean.class); }
3.最后一步,準(zhǔn)備工作的時(shí)候有一個(gè)拷貝的Activity,WXPayEntryActivity.java ,還記得吧.(這個(gè)文件是為了接受第7步,api.sendReq(req); 發(fā)過來的數(shù)據(jù),根據(jù) resp.errCode的值,來確定你的下一步操作,只有是0的時(shí)候,才是正常的,其他的時(shí)候,都是非正常的。 )
添加判斷
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode){
case 0:
//請求正常,進(jìn)行下一步的操作。。。。
break;
case -1:
UiHelper.Toast(this,"支付異常,請聯(lián)系商家");
break; case -2:
UiHelper.Toast(this,"支付取消");
break; }
finish();
}
微信支付的一點(diǎn)小坑:
??微信文檔很簡單,錯(cuò)誤提示更少。文檔上這樣寫,一般-1的時(shí)候都是 簽名錯(cuò)誤、未注冊APPID、項(xiàng)目設(shè)置APPID不正確、注冊的APPID與設(shè)置的不匹配、其他異常等。這句話說的好籠統(tǒng),但是微信的文檔就是這樣,你需要一個(gè)個(gè)的檢查。出現(xiàn)問題,你會發(fā)瘋,不知道從何下手。
??之前我自己做的時(shí)候也出現(xiàn)了這種情況,這個(gè)時(shí)候千萬不要慌,慢慢檢查你的參數(shù):
1.檢查你的AppId值,這個(gè)值是在注冊的時(shí)候給你的,所以你要看看你是不是少了,或者錯(cuò)了。
2.檢查簽名,這里最需要注意了,一般加簽我們都是在后臺直接傳過來的,寫在App端加簽,不安全,和你的后臺好好去對對,多調(diào)試幾次。(我之前查了一晚上,四個(gè)多小時(shí),后面就是后臺加簽名傳錯(cuò)了某個(gè)值,然后出現(xiàn)-1.搞的我差點(diǎn)想打死那貨,莫名其妙被加了班,那貨下班就走了。想想都?xì)馊耍?br>
3.檢查你的代碼,一般我們在寫代碼的時(shí)候都是按照文檔上來的,這時(shí)候也不能馬虎,某個(gè)值的錯(cuò)誤可能會導(dǎo)致你前功盡棄。耐心點(diǎn)吧。
好了,到此結(jié)束。
最后祝你不要碰到坑。