1. 程式人生 > >Android與iOS對接微信支付

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;
                  }
                  	}
                } 
如果已經集成了微信登入功,再整合微信支付,估計一天就夠搞定了