集成 WeChat SDK - 支付篇

做者感言

慣例, 開頭都是要說些東西的了, 隨着如今的App愈來愈商業化, 不少公司的App都會集成第三方的支付SDK, 這樣子的成本就比較低, 可是呢, 有不少朋友仍是不太會集成, 也不太愛看集成文檔(我也是~), 想了想, 仍是寫一篇關於支付的文章吧, 如今寫的是微信支付, 過段時間就把支付寶銀聯Apple Pay的也補上.php

最後:
若是你有更好的建議或者對這篇文章有不滿的地方, 請聯繫我, 我會參考大家的意見再進行修改, 聯繫我時, 請備註WeChat支付若是以爲好的話, 但願你們也能夠打賞一下~嘻嘻~祝你們學習愉快~謝謝~ios


簡介

微信SDK, 一個集成了社會化分享以及財付通支付功能的SDK, 須要商家先去微信開放平臺先登記註冊, 審批事後才能得到商家ID, 這樣子才能使用支付功能, 下面讓咱們一塊兒來看看吧.c++


準備工做

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

  • 1.申請商家ID
  • 2.申請App ID
  • 3.下載, 集成SDK包
  • 4.添加依賴包
  • 5.最後, 調起支付

作好以上的工做, 微信的SDK集成就告一段落了~github


申請商家ID

這裏就不作詳細介紹了, 畢竟咱們這裏講的是如何集成SDK, 若是想了解的童鞋, 能夠自行去微信公衆平臺自行查看哈~sql


申請App ID

申請App ID這裏也不作介紹, 這個步驟也很簡單, 直接去微信開放平臺, 根據對應的指導信息, 一步一步的往下填寫就OK了, 微信的App ID是須要審覈時間的, 快的話幾分鐘, 慢的話, 慢慢等吧~~編程


下載SDK包

下載SDK包, 這個更加的簡單了, 直接去到資源中心看到iOS開發工具包64位
就趕忙堅決果斷的直接點下載, 服務器

1

下載完成以後, 咱們來看看SDK包裏都有啥微信

2

我看了看2.0版本的Demo, 裏面竟然是沒有微信支付的相關代碼, 這至關蛋疼, 若是是第一次集成的童鞋們, 那就要哭了...不過好在咱們用龐大的互聯網搜索引擎, 谷歌, 百度, 這些問題都是能夠解決的, app


再廢話一段

廢話講了那麼多, 如今讓咱們來看看怎麼集成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

相關文章
相關標籤/搜索