以下是子商戶APP中調用支付的交互時序圖,如下圖所示。服務商提供的接口實現請參見【服務商處理支付流程】
商戶APP調用支付的主要交互說明:
步驟1 用戶在商戶APP中選擇商品,選擇微信支付,提交訂單,如圖中步驟1-3所示。
步驟2 調用服務商提供的下單接口,服務商后臺收到下單請求,會返回簽好名的訂單數據,用于商戶APP里面調起微信支付,如圖中步驟3-5所示。
步驟3 用戶確認支付,輸入密碼,支付完成,如圖中步驟6-8所示。
步驟4 支付完成后,微信返回商戶APP,回調APP實現的回調函數,此時需要根據單號調用服務商提供的查詢結果,查詢后臺實際支付結果,再作用戶頁面展示和發(fā)貨操作。如圖步驟9-13.
以下是服務商接收到子商戶APP中下單請求的處理流程交互時序圖
服務商后臺主要交互說明:
步驟1 接收到下單請求后,服務商系統調用微信支付【統一下單API】,微信返回prepay_id等參數,如圖步驟2-4所示。
步驟2 服務商系統獲取到prepay_id后,按照【調起支付API】列表中的參數進行簽名(服務商開發(fā)注意,appid和partnerid都不是服務商的參數,appid是子商戶的應用APPID,partnerid是子商戶的商戶號),將數據返回給商戶APP端,如圖中步驟5-6所示。
以下是服務商接收到子商戶APP中查單請求的處理流程交互時序圖
服務商后臺主要交互說明:
步驟1 服務商系統需要具備接收微信支付通知的能力,實現請見【支付結果通知API】,接收到支付通知后,可以定義接口將該通知轉給子商戶,或者服務商系統保存支付結果,供后續(xù)查詢,如圖步驟1-3所示。
步驟2 商戶APP提交查詢支付結果,服務商系統先查詢是否收到支付通知,如果未成功接收,請調用【查詢訂單API】,將微信返回的實際查詢結果返回給商戶,如圖步驟4-8所示。
由于蘋果公司在iOS13系統回收了查詢 App bundleID 的能力,導致微信無法保證授權憑證能正確返回給AppID對應的應用。為此,微信支付強烈要求所有商戶盡快升級到OpenSDK1.8.6,并讓用戶及時更新APP,否則安全風險將一直存在。謝謝配合!
詳細OpenSDK升級指引請參見:opensdk升級指引
注意:opensdk升級后請一定按照文檔要求完成驗證工作,確保opensddk升級成功。
(以上截圖來自opensdk升級指引)
以下項目開發(fā)環(huán)境以Xcode6,運行環(huán)境為IOS7.0為例,說明其開發(fā)中需要的操作。
1、項目設置APPID
商戶在微信開放平臺申請開發(fā)APP應用后,微信開放平臺會生成APP的唯一標識APPID。在Xcode中打開項目,設置項目屬性中的URL Schemes為子商戶的APPID。如下圖標紅位置所示。
2、注冊APPID
APP工程中引入微信lib庫和頭文件,調用API前,需要先向微信注冊子商戶的APPID,代碼如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];//
注意:該sign生成字段名列表見調起支付API
3、調起支付
子商戶調用“服務商提供的接口”返回支付數據,在APP發(fā)起支付。以下是調起微信支付的關鍵代碼:
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];
注意:該sign生成字段名列表見調起支付API
4、支付結果回調
照微信SDK Sample,在類實現onResp函數,支付完成后,微信APP會返回到商戶APP并回調onResp函數,開發(fā)者需要在該函數中接收,判斷返回錯誤碼,再調用服務商提供接口查詢支付結果,最后展示用戶實際支付結果。
注意:一定不能以客戶端返回作為用戶支付的結果,應以后臺的接收的支付通知或查詢API返回的結果為準。
代碼示例如下:
-(void)onResp:(BaseResp*)resp{
if ([respisKindOfClass:[PayRespclass]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
caseWXSuccess:
//服務器端查詢支付通知或查詢API返回的結果再提示成功
NSlog(@"支付成功");
break;
default:
NSlog(@"支付失敗,retcode=%d",resp.errCode);
break;
}
}
}
回調中errCode值列表:
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯誤 | 可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等。 |
-2 | 用戶取消 | 無需處理。發(fā)生場景:用戶不支付了,點擊取消,返回APP。 |
1、后臺設置
商戶在微信開放平臺申請開發(fā)應用后,微信開放平臺會生成APP的唯一標識APPID。由于需要保證支付安全,需要在開放平臺綁定商戶應用包名和應用簽名,設置好后才能正常發(fā)起支付。設置界面在【開放平臺】中的欄目【管理中心 / 修改應用 / 修改開發(fā)信息】里面,如圖紅框內所示。
應用包名:是在APP項目配置文件AndroidManifest.xml中聲明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
應用簽名:根據項目的應用包名和編譯使用的keystore,可由簽名工具生成一個32位的md5串,在調試的手機上安裝簽名工具后,運行可生成應用簽名串,如圖所示,綠色串即應用簽名。簽名工具下載
2、注冊APPID
商戶APP工程中引入微信JAR包,調用API前,需要先向微信注冊子商戶的APPID,代碼如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 將該app注冊到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
3、調起支付
子商戶調用“服務商提供的接口”返回支付數據,在APP發(fā)起支付。以下是調起微信支付的關鍵代碼:
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";//子商戶appid
request.partnerId = "1900000109";//子商戶號
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(request);
4、支付結果回調
參照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路徑中實現WXPayEntryActivity類(包名或類名不一致會造成無法回調),在WXPayEntryActivity類中實現onResp函數,支付完成后,微信APP會返回到商戶APP并回調onResp函數,開發(fā)者需要在該函數中接收通知,判斷返回錯誤碼,支付成功則調用“服務商提供的查詢接口”獲取到支付狀態(tài)再展示用戶實際支付結果。注意一定不能以客戶端返回作為用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果為準。
代碼示例如下:
publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
}
}
回調中errCode值列表:
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯誤 | 可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等。 |
-2 | 用戶取消 | 無需處理。發(fā)生場景:用戶不支付了,點擊取消,返回APP。 |