玩轉iOS開發:整合 WeChat SDK - 支付篇

CainLuo發表於2016-09-11

文章轉至: https://cainluo.github.io/14735762460993.html


作者感言

慣例, 開頭都是要說些東西的了, 隨著現在的App越來越商業化, 很多公司的App都會整合第三方的支付SDK, 這樣子的成本就比較低, 但是呢, 有很多朋友還是不太會整合, 也不太愛看整合文件(我也是~), 想了想, 還是寫一篇關於支付的文章吧, 現在寫的是**微信支付, 過段時間就把支付寶**, 銀聯, **Apple Pay**的也補上.

最後: 如果你有更好的建議或者對這篇文章有不滿的地方, 請聯絡我, 我會參考你們的意見再進行修改, 聯絡我時, 請備註WeChat支付如果覺得好的話, 希望大家也可以打賞一下~嘻嘻~祝大家學習愉快~謝謝~


簡介

微信SDK, 一個整合了社會化分享以及財付通支付功能的SDK, 需要商家先去微信開放平臺先登記註冊, 審批過後才能獲得商家ID, 這樣子才能使用支付功能, 下面讓我們一起來看看吧.


準備工作

首先, 我們要來做好準備工作:

  • 1.申請商家ID
  • 2.申請App ID
  • 3.下載, 整合SDK包
  • 4.新增依賴包
  • 5.最後, 調起支付

做好以上的工作, 微信的SDK整合就告一段落了~


申請商家ID

這裡就不做詳細介紹了, 畢竟我們這裡講的是如何整合SDK, 如果想了解的童鞋, 可以自行去**微信公眾平臺**自行檢視哈~


申請App ID

申請**App ID這裡也不做介紹, 這個步驟也很簡單, 直接去微信開放平臺, 根據對應的指導資訊, 一步一步的往下填寫就OK了, 微信的App ID**是需要稽核時間的, 快的話幾分鐘, 慢的話, 慢慢等吧~~


下載SDK包

下載SDK包, 這個更加的簡單了, 直接去到**資源中心看到iOS開發工具包64位**就趕緊毫不猶豫的直接點下載,

1

下載完成之後, 我們來看看SDK包裡都有啥

2

我看了看2.0版本的Demo, 裡面居然是沒有微信支付的相關程式碼, 這相當蛋疼, 如果是第一次整合的童鞋們, 那就要哭了...不過好在我們用龐大的網際網路搜尋引擎, 谷歌, 百度, 這些問題都是可以解決的,


再廢話一段

廢話講了那麼多, 現在讓我們來看看怎麼整合DSK包, 我們先建立一個**WorkSpace檔案, 叫PayProject, 然後再建立我們的第一個工程WeChatPay-Objective-C, 由於之前有人和我反應過, 為啥沒有Swift版本的, 其實不是我想寫Swift版本, 是它的語法到現在居然都還沒有定型, 每個版本改一丟丟, 這比較蛋疼, 現在有人反應, 那我今後也把Swift版本給補上吧, 如果以後語法繼續有更改, 那大家就根據自己的程式設計經驗以及Xcode**的提示自行修改哈~~


配置工程

開啟我們建立好的**WeChatPay-Objective-C工程, 把SDK**包拖進去, 這裡的資料夾我改名字了, 你們也可以根據你們自己的喜好來改

3

新增完**SDK包之後, 我們還要操作某些東西, 因為在iOS 9之後, 蘋果限制了正常的HTTP請求, 如果我們要繼續用, 就得先配置一下~~在微信的SDK**資料夾裡也有宣告

4

開啟工程, 找到工程的**Info.plist**檔案, 直接新增就好了, 有時候Xcode不會提示, 需要我們手動填入, 這個就比較蛋疼了, 我這裡就列舉出來吧

  • Application requires iPhone environment
  • LSApplicationQueriesSchemes
  • App Transport Security Settings
    • Allow Arbitrary Loads

5

新增完這些之後, 還是不夠的, 我們需要去新增一個**URL Schemes, 這裡我先提供一個App ID, 是從以前的微信官方Demo裡拷貝下來的~~wxb4ba3c02aa476ea1, 童鞋們自動複製貼上哈, 這個時候, 我們就要開啟工程配置了, 然後新增微信的URL Schemes**

6

到這一步, 基本上這個階段已經告已段落了, 繼續下一個階段~~~


新增依賴包

使用第三方**SDK**最蛋疼的一件事就是需要新增很多的依賴包, 因為第三方需要做資料的收集, 或者其他操作之類的, 這樣子你才能在他們的後臺列表了查詢到你的App流量, 微信的依賴包有好幾個,

  • UIKit.framework
  • Foundation.framework
  • SystemConfiguration.framework
  • CoreTelephony.framework
  • Security.framework
  • libz.tbd
  • libc++.tbd
  • libsqlite3.tbd

現在我們就來新增這些依賴包吧, 怎麼新增應該不用我說了吧0.0

7


註冊AppID

前期工作我們都做完了, 現在我們就用程式碼來實現微信支付~, 首先我們肯定要先註冊一下微信**App ID, 不然別說支付了, 就連分享神馬之類的功能你都沒法用, 開啟AppDelegate.m, 匯入WXApi.h檔案, 註冊App ID, 這個App ID, 就是我剛剛提供的那個wxb4ba3c02aa476ea1**.

8


佈局UI

要調起微信支付, 我們肯定要有一個點選事件, 這裡的**UI, 我們就只給個UIButton和一個Action**事件就好了.

9


調起微信支付

重頭戲來了, 前面做了那麼多的工作, 寫了那麼多的廢話, 只為了現在真正的調起微信支付進行支付~~

10

實現程式碼都給你們貼出來了~這是我在以前的官方Demo中拷貝出來的~

PS: 這裡是Demo, 所以這裡拿到的神馬簽名啊, 商戶ID, 支付連結神馬的, 都是寫在客戶端的, 但在實際開發當中, 這是強烈不建議在客戶端內自己生成, 一定一定要由伺服器返回, 不然你會非常深刻的瞭解到蛋疼這個詞語是啥意思~~

    NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
                               
                               if (data != nil) {
                                   
                                   NSError *error;
                                   NSMutableDictionary *dictionart = NULL;
                                   
                                   dictionart = [NSJSONSerialization JSONObjectWithData:data
                                                                          options:NSJSONReadingMutableLeaves
                                                                            error:&error];
                                   
                                   NSLog(@"URL: %@", urlString);
                                   
                                   if (dictionart != nil) {
                                       
                                       NSMutableString *retCode = [dictionart objectForKey:@"retcode"];
                                       
                                       if (retCode.integerValue == 0) {
                                           
                                           NSMutableString *stamp = [dictionart objectForKey:@"timestamp"];
                                           
                                           // 調起微信支付
                                           PayReq *req   = [[PayReq alloc] init];
                                           req.partnerId = [dictionart objectForKey:@"partnerid"];
                                           req.prepayId  = [dictionart objectForKey:@"prepayid"];
                                           req.nonceStr  = [dictionart objectForKey:@"noncestr"];
                                           req.timeStamp = stamp.intValue;
                                           req.package   = [dictionart objectForKey:@"package"];
                                           req.sign      = [dictionart objectForKey:@"sign"];
                                           
                                           [WXApi sendReq:req];
                                           
                                           // 日誌輸出
                                           NSLog(@"appid = %@", [dictionart objectForKey:@"appid"]);
                                           NSLog(@"partnerId = %@", req.partnerId);
                                           NSLog(@"prepayId = %@", req.prepayId);
                                           NSLog(@"nonceStr = %@", req.nonceStr);
                                           NSLog(@"timeStamp = %d", req.timeStamp);
                                           NSLog(@"package = %@", req.package);
                                           NSLog(@"sign = %@", req.sign);
                                           
                                       } else {
                                           
                                           NSLog(@"retmsg: %@", [dictionart objectForKey:@"retmsg"]);
                                       }
                                   } else {
                                       
                                       NSLog(@"伺服器返回錯誤, 未獲取到JSON物件");
                                   }
                               } else {
                                   
                                   NSLog(@"伺服器返回錯誤");
                               }
                           }];
複製程式碼

處理回撥結果

實現程式碼我們都搞定了, 現在我們差的就是要處理微信回撥回來的結果, 無論你支付成功或者是支付失敗, 還是微信伺服器爆炸了, 這個結果我們都要獲取到, 還有對應的**errCode.
開啟
AppDelegate.m, 我們要新增微信的代理協議, 實現一個微信的代理方法, 以及AppDelegate**的兩個方法

11

具體實現的程式碼

- (void)onResp:(BaseResp *)resp {
    
    if ([resp isKindOfClass:[PayResp class]]) {
        
        NSString *stringMessage = @"支付結果";
        NSString *stringTitle  = @"支付結果";
        
        switch (resp.errCode) {
            case WXSuccess:
                
                stringMessage = @"支付結果: 成功!";
                
                NSLog(@"支付成功 - PaySuccess, retCode = %d", resp.errCode);
                
                break;
            default:
                
                stringMessage = [NSString stringWithFormat:@"支付結果: 失敗!, retcode = %d, retstr = %@", resp.errCode, resp.errStr];
                
                break;
        }
        
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:stringTitle
                                                            message:stringMessage
                                                           delegate:nil
                                                  cancelButtonTitle:@"好的"
                                                  otherButtonTitles:nil, nil];
        
        [alertView show];
    }
}

- (BOOL)application:(UIApplication *)application
      handleOpenURL:(NSURL *)url {
    
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    
    return [WXApi handleOpenURL:url delegate:self];
}
複製程式碼

最終效果

12


工程地址

專案地址: https://github.com/CainRun/PayProject


最後

碼字很費腦, 看官賞點飯錢可好

微信

支付寶

相關文章