Android與iOS對接微信支付
與iOS內購不同,微信的支付系統把大部分重要的工作都放在了服務端,客戶端只有少量工作
我相信,各位程式在看這篇文章的時,微信的appid應該已經註冊,app支付功能應該已經開通了。
重點名詞:
1.客戶端 :app自己的客戶單
2.伺服器 :app自己的伺服器
3.微信 : 三方的微信平臺
實現流程
1.客戶端向伺服器請求所有支付需要的引數
android:
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(req);
iOS:
PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"10000100";
request.prepayId= @"1101000000140415649af9fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= @"1397527777";
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq:request];
appId:是在微信開發者後臺註冊app時分配的唯一標識,可以儲存在客戶端
partnerId:是商戶號,在app申請支付功能通過後分配給商戶的唯一標識
prepayId:這個是服務端向微信下單時,微信返回給伺服器的訂單號
packageValue:固定值(一定要填)
nonceStr:隨機碼
timeStamp:時間戳
sign:簽名,簽名是各個資料的順序不能搞錯,一定要按順序來,不然無法調動支付
客戶端向伺服器請求訂單的時候要告訴伺服器支付金額,然後伺服器找微信下單,伺服器拿到prepayId後,再生產隨機碼和時間戳一起返回給客戶端
2.服務端處理
雖然appId partnerId packageValue都可以放在客戶端,但是為了設計上更簡潔更安全,最好所有引數都由伺服器下發
3.坑:
支付返回-1:微信支付返回介面比較簡單,只有成功、失敗、取消。無論是什麼原因失敗,都返回-1,無法啟動支付也返回-1
這個時候就要逐步檢查了
1.appid是否正確
2.app簽名(不是訂單簽名)是否正確
3.訂單引數是不是每個都正確且有效
通常這幾個是主要問題,如果確認無誤,就應該是服務端返回引數的問題了
1.返回的商戶號是否正確
2.訂單簽名是否正確,訂單簽名一定要按順序,而且各個引數的名字都要準確,一個字母都不能差
4.回撥
android:
publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
if(resp.errCode == 0)
if(resp.errCode == -1)
if(resp.errCode == -2)
}
}
ios:
-(void)onResp:(BaseResp*)resp{ if ([respis KindOfClass:[PayResp class]]){ PayResp * response=(PayResp*)resp; switch(response.errCode){ case WXSuccess: //伺服器端查詢支付通知或查詢API返回的結果再提示成功 NSlog(@"支付成功"); break; default: NSlog(@"支付失敗,retcode=%d",resp.errCode); break; } } }如果已經集成了微信登入功,再整合微信支付,估計一天就夠搞定了