iOS - WXPay 微信支付


1、微信支付申請

1.1 微信 APP 支付申請步驟

  • APP 支付:APP 支付又稱移動端支付,是商戶通過在移動端應用 APP 中集成開放 SDK 調起微信支付模塊完成支付的模式。

1.1.1 第 1 階段

  • 1、注冊微信開放平台帳號,注冊成為微信開放平台開發者。

    wxpay1

  • 2、認證開發者資質,開發者資質認證通過后才可申請微信支付,申請審核服務費:300 元/次(年)。

    wxpay23

    wxpay2

  • 3、創建 APP 並提交審核,提交你的 APP 基本信息,通過開放平台應用審核,以獲得 AppID。

    wxpay3

    wxpay4

    wxpay5

  • 微信認證審核時間在 7 個工作日左右。

1.1.2 第 2 階段

  • 1、提交資料申請微信支付,申請成功后可以在 APP 中調用微信支付來付款。

    wxpay6

    wxpay7

    wxpay8

    wxpay9

    wxpay10

    wxpay11

    • 商戶在微信公眾平台(申請掃碼支付、公眾號支付)或開放平台(申請APP支付)按照相應提示,申請相應微信支付模式。微信支付工作人員審核資料無誤后開通相應的微信支付權限。微信支付申請審核通過后,商戶在申請資料填寫的郵箱中收取到由微信支付小助手發送的郵件,此郵件包含開發時需要使用的支付賬戶信息。

      wxpay25

      wxpay26

    • 郵件中的賬戶參數與接口API參數對應關系:

      wxpay16

  • 2、開戶成功,登錄商戶平台進行驗證,平台帳戶密碼請查看收到的開戶郵件,驗證款項(隨機金額)請查收你的結算帳戶。

    wxpay12

    wxpay13

    wxpay14

    wxpay15

  • 約 1~5 個工作日。

1.1.3 第 3 階段

1.2 微信 APP 支付相關說明

1.2.1 支付賬戶

  • 商戶在微信公眾平台(申請掃碼支付、公眾號支付)或開放平台(申請APP支付)按照相應提示,申請相應微信支付模式。微信支付工作人員審核資料無誤后開通相應的微信支付權限。微信支付申請審核通過后,商戶在申請資料填寫的郵箱中收取到由微信支付小助手發送的郵件,此郵件包含開發時需要使用的支付賬戶信息。

  • 賬戶參數說明:

    wxpay16

1.2.2 協議規則

  • 商戶接入微信支付,調用API必須遵循以下規則

    wxpay17

1.2.3 參數規定

1.2.4 安全規范

  • 安全規范

    • 簽名算法
    • 生成隨機數算法
    • 商戶證書
    • 商戶回調API安全

1.2.5 業務流程

  • 以下是交互時序圖,統一下單API、支付結果通知API和查詢訂單API等都涉及簽名過程,調用都必須在商戶服務器端完成。

    wxpay19

  • 商戶系統和微信支付系統主要交互說明:

    • 步驟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>
      

      wxpay24

    • 商戶在微信開放平台申請開發 APP 應用后,微信開放平台會生成 APP 的唯一標識 APPID。在 Xcode 中打開項目,設置項目屬性中的 URL Schemes 為您的 APPID。在 項目設置 => TARGETS => Info => URL Types 中點擊加號按鈕添加。

      wxpay20

  • 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
    

    wxpay21

  • 4、如果接入微信的 sdk,在 delegate 里加入這句注冊代碼 WXApi registerApp: 運行后程序就崩潰,原因是庫里用了某個類的擴展,編譯時這些擴展沒有編譯,所以崩潰的。只需要在 項目設置 => TARGETS => Build Settings => Linking => Other Linker Flags 中添加上 -ObjC 即可,注意 O 和 C 都為大寫。

    wxpay22

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);
      	}];
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM