iOS微信支付集成

概述

iOS微信支付集成

詳細

支付寶和微信都是業界的老大哥,相信你們都有所以爲文檔、SDK都是各類坑吧(純粹吐槽而已),這是繼上篇支付寶支付集成後接着的微信支付集成。php

截圖.png

1、準備工做

一、微信商戶申請步驟html

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

 

二、申請成功後說明api

官方支付帳戶說明文檔: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服務器

 

三、微信支付集成包微信

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

 

四、開發步驟app

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

2、微信支付集成

一、 添加微信支付SDK

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

 

二、 添加庫

576025-b4cdc0668372c785.png.jpeg

 

三、項目設置APPID,在工程項目中添加商戶本身的APPID

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

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

四、iOS 9.0以上的系統若是要正常調起微信,還須要添加白名單,在工程項目的plist文件中添加

576025-1f936b7d10931001.jpg

 

五、註冊APPID

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

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

 

六、調起支付

商戶服務器生成支付訂單,先調用【統一下單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

 

七、支付結果回調

照微信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;
    }
  }  
}

 

八、在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;
}

 

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

// 微信支付
- (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);
//    }];
    
}

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

一、運行時的效果圖:

微信支付.gif

二、壓縮文件截圖:

壓縮文件截圖.png

三、項目文件截圖:

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

4、其餘補充

目前是項目中直接操做, 在項目裏補充上大家的後臺接口請求,

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

 

若是須要微信支付, 請移步:iOS微信支付集成 http://www.demodashi.com/demo/10729.html

 

 

注:本文著做權歸做者,由demo大師發表,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索