iOS微信支付集成


概述

iOS微信支付集成

詳細

支付寶和微信都是業界的老大哥,相信大家都有所覺得文檔、SDK都是各種坑吧(純粹吐槽而已),這是繼上篇支付寶支付集成后接着的微信支付集成。

截圖.png

一、准備工作

1、微信商戶申請步驟

申請步驟: http://kf.qq.com/faq/120911VrYVrA150906F3qqY3.html

 

2、申請成功后說明

官方支付賬戶說明文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=3_1

官方業務流程文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

 

3、微信支付集成包

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417694084&token=&lang=zh_CN

 

4、開發步驟

官方開發步驟文擋:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

二、微信支付集成

1、 添加微信支付SDK

13CB91F9-22DB-4974-8802-A964D0E0B5CF.png

 

2、 添加庫

576025-b4cdc0668372c785.png.jpeg

 

3、項目設置APPID,在工程項目中添加商戶自己的APPID

商戶在微信開放平台申請開發APP應用后,微信開放平台會生成APP的唯一標識APPID。在Xcode中打開項目,設置項目屬性中的URL Schemes為您的APPID

E925D896-EBC2-4612-B2AF-92A3009E630A.png

4、iOS 9.0以上的系統如果要正常調起微信,還需要添加白名單,在工程項目的plist文件中添加

576025-1f936b7d10931001.jpg

 

5、注冊APPID

商戶APP工程中引入微信lib庫和頭文件,調用API前,需要先向微信注冊您的APPID,代碼如下:

// 在appDelegate.m中,注冊微信應用    
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //向微信注冊
    [WXApi registerApp:@"您的APPID"];
}

 

6、調起支付

商戶服務器生成支付訂單,先調用【統一下單API】生成預付單,獲取到prepay_id后將參數再次簽名傳輸給APP發起支付。以下是調起微信支付的關鍵代碼:

為了安全性,以下字段最好從服務器去獲取

// 調起微信支付
PayReq *request = [[PayReq alloc] init];
/** 微信分配的公眾賬號ID -> APPID */
request.partnerId = APPID;
/** 預支付訂單 從服務器獲取 */
request.prepayId = @"1101000000140415649af9fc314aa427";
/** 商家根據財付通文檔填寫的數據和簽名 <暫填寫固定值Sign=WXPay>*/
request.package = @"Sign=WXPay";
/** 隨機串,防重發 */
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
/** 時間戳,防重發 */
request.timeStamp= @“1397527777";
/** 商家根據微信開放平台文檔對數據做的簽名, 可從服務器獲取,也可本地生成*/
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
/* 調起支付 */
[WXApi sendReq:request];

賬戶參數說明:

576025-fbbd0d2e69268ab1.png

 

7、支付結果回調

照微信SDK Sample,在類實現onResp函數,支付完成后,微信APP會返回到商戶APP並回調onResp函數,開發者需要在該函數中接收通知,判斷返回錯誤碼,如果支付成功則去后台查詢支付結果再展示用戶實際支付結果。

注意: 一定不能以客戶端返回作為用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果為准。

// 支付返回結果,實際支付結果需要去微信服務器端查詢
-(void)onResp:(BaseResp *)resp {
   if([resp isKindOfClass:[PayResp class]]){
      switch (resp.errCode) {
          case WXSuccess:{
             NSlog(@"支付成功");
            // 發通知帶出支付成功結果
                [[NSNotificationCenter defaultCenter] postNotificationName:ZLWXReturnSucceedPayNotification object:resp];
          }
            break;
        default:{
            NSlog(@“支付失敗:%d”,resp.errCode);
             // 發通知帶出支付失敗結果
                [[NSNotificationCenter defaultCenter] postNotificationName:ZLWXReturnFailedPayNotification object:resp];
        }
          break;
    }
  }  
}

 

8、在appDelegate.m中整理判斷回調

/**
 這里處理微信/支付寶支付完成之后跳轉回來
 */
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    
    // 微信的支付回調
    if ([url.host isEqualToString:@"pay"]) {
        return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
    }
    return YES;
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    
    // 微信的支付回調
    if ([url.host isEqualToString:@"pay"]) {
        return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
    }
    
    return YES;
}

 

9、在使用微信支付的當前控制器里, 調起微信支付,接收通知

// 微信支付
- (void)weChatPay {
    
    // 1.拼接請求參數
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"orderid"] = [self generateTradeNO];
    params[@"userIp"] = [ZLGetIPTool deviceIPAdress]; // 獲取當前設備的ip
    
    // 2.發送請求
    // TODO: 這里用自己后台接口替換請求即可
    __weak __typeof(self) weakSelf = self;
//    [ZLHttpTool post:ZL_weChatPay_url params:params success:^(id json) {
//        ZLLog(@"微信支付返回參數接口 請求成功-%@", json);
    
//        if ([json[@"success"] isEqual:@(YES)]) {
    
    NSMutableDictionary *wechatDic = @{@"":@"", @"":@"", @"":@"", }.mutableCopy;// json[@"data"];
    
            [WXApi registerApp:[wechatDic objectForKey:@"appid"]];
            PayReq *request = [[PayReq alloc] init];
            request.partnerId = [wechatDic objectForKey:@"mch_id"]; // 商家向財付通申請的商家id
            request.prepayId= [wechatDic objectForKey:@"prepay_id"]; // 支付訂單
            request.package = @"Sign=WXPay"; // Sign=WXPay 商家根據財付通文檔填寫的數據和簽名
            request.nonceStr= [wechatDic objectForKey:@"nonce_str"]; // 隨機串,防重發
            request.timeStamp= [[wechatDic objectForKey:@"timestamp"] intValue]; //時間戳,防重發
            request.sign= [wechatDic objectForKey:@"sign2"]; // 商家根據微信開放平台文檔對數據做的簽名 二次簽名
            
            if ([WXApi sendReq:request]) {
                
                [ZLNotificationCenter addObserver:self selector:@selector(paySucceed) name:ZLWXReturnSucceedPayNotification object:nil];
                [ZLNotificationCenter addObserver:self selector:@selector(payFailed) name:ZLWXReturnFailedPayNotification object:nil];
            } else {
                
                UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付失敗" message:@"未安裝微信客戶端,請使用其他支付方式" preferredStyle:UIAlertControllerStyleAlert];
                UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                    
                }];
                [alert addAction:okAction];
                [self presentViewController:alert animated:YES completion:nil];
            }
            
//        } else {
//            [MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];
//        }
    
//        [weakSelf.tableView reloadData];
//    } failure:^(NSError *error) {
//        
//        [MBProgressHUD showError:@"暫無網絡,稍后再試"];
//        ZLLog(@"微信支付返回參數接口 請求失敗-%@", error);
//    }];
    
}

三、運行效果及壓縮文件截圖

1、運行時的效果圖:

微信支付.gif

2、壓縮文件截圖:

壓縮文件截圖.png

3、項目文件截圖:

13CB91F9-22DB-4974-8802-A964D0E0B5CF.png

四、其他補充

目前是項目中直接操作, 在項目里補充上你們的后台接口請求,

具體可參考代碼, 項目則能夠直接運行!

 

如果需要微信支付, 請移步:iOS微信支付集成 http://www.demodashi.com/demo/10729.html

 

 

注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權

 


免責聲明!

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



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