作者感言
慣例, 開頭都是要說些東西的了, 隨着現在的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位
就趕緊毫不猶豫的直接點下載,
下載完成之后, 我們來看看SDK包里都有啥
我看了看2.0版本的Demo, 里面居然是沒有微信支付的相關代碼, 這相當蛋疼, 如果是第一次集成的童鞋們, 那就要哭了...不過好在我們用龐大的互聯網搜索引擎, 谷歌, 百度, 這些問題都是可以解決的,
再廢話一段
廢話講了那么多, 現在讓我們來看看怎么集成DSK包, 我們先創建一個
WorkSpace
文件, 叫PayProject
, 然后再創建我們的第一個工程WeChatPay-Objective-C
, 由於之前有人和我反應過, 為啥沒有Swift
版本的, 其實不是我想寫Swift
版本, 是它的語法到現在居然都還沒有定型, 每個版本改一丟丟, 這比較蛋疼, 現在有人反應, 那我今后也把Swift
版本給補上吧, 如果以后語法繼續有更改, 那大家就根據自己的編程經驗以及Xcode
的提示自行修改哈~~
配置工程
打開我們創建好的
WeChatPay-Objective-C
工程, 把SDK
包拖進去, 這里的文件夾我改名字了, 你們也可以根據你們自己的喜好來改
添加完
SDK
包之后, 我們還要操作某些東西, 因為在iOS 9
之后, 蘋果限制了正常的HTTP
請求, 如果我們要繼續用, 就得先配置一下~~在微信的SDK
文件夾里也有聲明
打開工程, 找到工程的
Info.plist
文件, 直接添加就好了, 有時候Xcode不會提示, 需要我們手動填入, 這個就比較蛋疼了, 我這里就列舉出來吧
- Application requires iPhone environment
- LSApplicationQueriesSchemes
- App Transport Security Settings
- Allow Arbitrary Loads
添加完這些之后, 還是不夠的, 我們需要去添加一個
URL Schemes
, 這里我先提供一個App ID
, 是從以前的微信官方Demo里拷貝下來的~~wxb4ba3c02aa476ea1
, 童鞋們自動復制粘貼哈, 這個時候, 我們就要打開工程配置了, 然后添加微信的URL Schemes
到這一步, 基本上這個階段已經告已段落了, 繼續下一個階段~~~
添加依賴包
使用第三方
SDK
最蛋疼的一件事就是需要添加很多的依賴包, 因為第三方需要做數據的收集, 或者其他操作之類的, 這樣子你才能在他們的后台列表了查詢到你的App流量, 微信的依賴包有好幾個,
- UIKit.framework
- Foundation.framework
- SystemConfiguration.framework
- CoreTelephony.framework
- Security.framework
- libz.tbd
- libc++.tbd
- libsqlite3.tbd
現在我們就來添加這些依賴包吧, 怎么添加應該不用我說了吧0.0
注冊AppID
前期工作我們都做完了, 現在我們就用代碼來實現微信支付~, 首先我們肯定要先注冊一下微信
App ID
, 不然別說支付了, 就連分享神馬之類的功能你都沒法用, 打開AppDelegate.m
, 導入WXApi.h
文件, 注冊App ID
, 這個App ID
, 就是我剛剛提供的那個wxb4ba3c02aa476ea1
.
布局UI
要調起微信支付, 我們肯定要有一個點擊事件, 這里的
UI
, 我們就只給個UIButton
和一個Action
事件就好了.
調起微信支付
重頭戲來了, 前面做了那么多的工作, 寫了那么多的廢話, 只為了現在真正的調起微信支付進行支付~~
實現代碼都給你們貼出來了~這是我在以前的官方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
的兩個方法
具體實現的代碼
- (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]; }