1、微信支付申請
1.1 微信 APP 支付申請步驟
- APP 支付:APP 支付又稱移動端支付,是商戶通過在移動端應用 APP 中集成開放 SDK 調起微信支付模塊完成支付的模式。
1.1.1 第 1 階段
-
1、注冊微信開放平台帳號,注冊成為微信開放平台開發者。
-
2、認證開發者資質,開發者資質認證通過后才可申請微信支付,申請審核服務費:300 元/次(年)。
-
3、創建 APP 並提交審核,提交你的 APP 基本信息,通過開放平台應用審核,以獲得 AppID。
-
微信認證審核時間在 7 個工作日左右。
1.1.2 第 2 階段
-
1、提交資料申請微信支付,申請成功后可以在 APP 中調用微信支付來付款。
-
商戶在微信公眾平台(申請掃碼支付、公眾號支付)或開放平台(申請APP支付)按照相應提示,申請相應微信支付模式。微信支付工作人員審核資料無誤后開通相應的微信支付權限。微信支付申請審核通過后,商戶在申請資料填寫的郵箱中收取到由微信支付小助手發送的郵件,此郵件包含開發時需要使用的支付賬戶信息。
-
郵件中的賬戶參數與接口API參數對應關系:
-
-
2、開戶成功,登錄商戶平台進行驗證,平台帳戶密碼請查看收到的開戶郵件,驗證款項(隨機金額)請查收你的結算帳戶。
-
約 1~5 個工作日。
1.1.3 第 3 階段
-
2、啟動設計和開發,支付接口已可以在開發環境下調用調試。
-
成功接入微信支付。
1.2 微信 APP 支付相關說明
1.2.1 支付賬戶
-
商戶在微信公眾平台(申請掃碼支付、公眾號支付)或開放平台(申請APP支付)按照相應提示,申請相應微信支付模式。微信支付工作人員審核資料無誤后開通相應的微信支付權限。微信支付申請審核通過后,商戶在申請資料填寫的郵箱中收取到由微信支付小助手發送的郵件,此郵件包含開發時需要使用的支付賬戶信息。
-
賬戶參數說明:
1.2.2 協議規則
-
商戶接入微信支付,調用API必須遵循以下規則:
1.2.3 參數規定
-
參數規定:
1.2.4 安全規范
-
- 簽名算法
- 生成隨機數算法
- 商戶證書
- 商戶回調API安全
1.2.5 業務流程
-
以下是交互時序圖,統一下單API、支付結果通知API和查詢訂單API等都涉及簽名過程,調用都必須在商戶服務器端完成。
-
商戶系統和微信支付系統主要交互說明:
- 步驟1:用戶在商戶 APP 中選擇商品,提交訂單,選擇微信支付。
- 步驟2:商戶后台收到用戶支付單,調用微信支付統一下單接口。參見【統一下單 API】。
- 步驟3:統一下單接口返回正常的 prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給 APP。參與簽名的字段名為 appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package 的值格式為 Sign=WXPay。
- 步驟4:商戶 APP 調起微信支付。api 參見本章節【app 端開發步驟說明】
- 步驟5:商戶后台接收支付通知。api 參見【支付結果通知 API】
- 步驟6:商戶后台查詢支付結果。,api 參見【查詢訂單API】
1.2.6 API 列表
1.2.7 驗收流程
2、微信 APP 支付開發
-
說明:
-
商戶服務端:
- 負責生成訂單及簽名,及接受支付異步通知。
-
APP 客戶端:
- 負責使用服務端傳來的訂單信息調用微信支付接口,及根據 SDK 同步返回的支付結果展示結果頁。
-
服務端接入:
- API 密鑰必須放在商戶服務端,簽名過程必須放在商戶服務端。
-
2.1 微信 APP 支付集成設置
-
1、下載 iOS 端開發工具包 WeChatSDK,並添加到創建的工程中。WeChatSDK 中有 5 個文件,分別為:
libWeChatSDK.a // 靜態庫文件 WechatAuthSDK.h // 微信登陸等接口 WXApi.h // 所有 Api 接口 WXApiObject.h // Api 對象,包含所有接口和對象數據定義 README.txt // 所有版本的使用說明
-
2、iOS 9 + 系統策略更新,限制了 http 協議的訪問,此外應用需要在 “Info.plist” 中將要使用的 URL Schemes 列為白名單,才可正常檢查其他應用是否安裝。
-
受此影響,當你的應用在 iOS 9 + 中需要使用微信 SDK 的相關能力(分享、收藏、支付、登錄等)時,需要在 “Info.plist” 里增加如下代碼:
<key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> </array> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
-
商戶在微信開放平台申請開發 APP 應用后,微信開放平台會生成 APP 的唯一標識 APPID。在 Xcode 中打開項目,設置項目屬性中的 URL Schemes 為您的 APPID。在 項目設置 => TARGETS => Info => URL Types 中點擊加號按鈕添加。
-
-
3、添加 SDK 的依賴庫和框架。在 項目設置 => TARGETS => Build Phases => Link Binary With Libraries 中依次添加 README.txt 說明文檔中提及的以下庫或框架:
SystemConfiguration.framework CoreTelephony.framework Security.framework CFNetwork.framework libz.dylib libsqlite3.0.dylib libWeChatSDK.a // 導入 SDK 時已自動添加
- 另外還需要添加官方沒有提到的下列依賴庫:
libc++.tbd
-
4、如果接入微信的 sdk,在 delegate 里加入這句注冊代碼 WXApi registerApp: 運行后程序就崩潰,原因是庫里用了某個類的擴展,編譯時這些擴展沒有編譯,所以崩潰的。只需要在 項目設置 => TARGETS => Build Settings => Linking => Other Linker Flags 中添加上 -ObjC 即可,注意 O 和 C 都為大寫。
2.2 微信 APP 支付集成
-
詳細代碼見 GitHub
-
Objective-C
-
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 向微信終端程序注冊第三方應用 APPID: wxb4ba3c02aa476ea1 [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"QWeChatPayDemo 1.0"]; return YES; } // 微信支付回調,當用戶通過其他應用啟動本應用時,會回調這個方法 // NS_DEPRECATED_IOS(2_0, 9_0) - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:self]; } // NS_DEPRECATED_IOS(2_0, 9_0) - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:self]; } // NS_AVAILABLE_IOS(9_0) 9.0 以后使用新 API 接口 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { return [WXApi handleOpenURL:url delegate:self]; } - (void)onResp:(BaseResp *)resp { if([resp isKindOfClass:[PayResp class]]){ // 支付返回結果,實際支付結果需要去微信服務器端查詢 NSString *strMsg; switch (resp.errCode) { case WXSuccess: strMsg = @"支付成功!"; NSLog(@"支付成功:retcode = %d", resp.errCode); break; default: strMsg = [NSString stringWithFormat:@"支付失敗!retcode = %d, retstr = %@", resp.errCode, resp.errStr]; NSLog(@"支付失敗:retcode = %d, retstr = %@", resp.errCode, resp.errStr); break; } // 顯示提示信息 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付結果" message:strMsg preferredStyle:UIAlertControllerStyleAlert]; [self.window.rootViewController presentViewController:alert animated:YES completion:^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [alert dismissViewControllerAnimated:YES completion:nil]; }); }]; } }
-
ViewController.m
// 判斷是否安裝了微信 if (![WXApi isWXAppInstalled]) { NSLog(@"沒有安裝微信"); return; } // 判斷是否支持微信支付 if (![WXApi isWXAppSupportApi]) { NSLog(@"不支持微信支付"); return; } NSMutableDictionary *params = [NSMutableDictionary dictionary]; // 在此設置商戶服務端需要的參數 params[WXTOTALFEE] = @"1"; params[WXEQUIPMENTIP] = [self fetchIPAddress]; // 向商戶微信支付服務器端請求微信預支付信息 AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; [sessionManager POST:QCUrlUserWeChatPay parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 解析商戶微信支付服務器端返回的數據,獲得預支付信息和簽名等 NSLog(@"responseObject = %@",responseObject); if (responseObject != nil) { // 發起微信支付 PayReq *request = [[PayReq alloc] init]; // 設置參數 request.openID = [responseObject objectForKey:WXAPPID]; request.partnerId = [responseObject objectForKey:WXMCHID]; request.prepayId= [responseObject objectForKey:WXPREPAYID]; request.nonceStr= [responseObject objectForKey:WXNONCESTR]; request.timeStamp= [[responseObject objectForKey:@"timestamp"] intValue]; request.package = @"Sign=WXPay"; request.sign = [responseObject objectForKey:@"sign"]; NSLog(@"%@--%@--%@--%@--%@--%d--%@",request.openID,request.partnerId,request.prepayId, request.package,request.nonceStr,request.timeStamp,request.sign); // 調用微信發起支付 [WXApi sendReq:request]; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"向商戶微信支付服務器端請求預支付信息失敗:%@", error.localizedDescription); }];
-