原標題 : IOS整合微信支付或者支付寶支付功能小結
2016.7.1。由於蘋果強制要求適配ipv6,本文demo中採用的sdk可能有點老,如果採用的話,稽核可能被拒。建議升級各SDK的新版本再整合,方法大同小異,有什麼問題歡迎交流
整合ShareSDK社會化分享的時候整合了微信支付或者支付寶支付功能
(分別整合了微信支付和支付寶,用Ping++整合支付的煩請繞行…)
2016.01.07 更新(修改Xcode7.2 IOS9.2 微信客戶端操作之後返回程式 微信的onResp回撥方法不被執行的bug)
http://yun.baidu.com/share/link?shareid=187711184&uk=3055516665
不廢話,先甩連結
第一,你需要有微信開發平臺的開發者賬號,(網址https://open.weixin.qq.com/,或者自行百度“微信open”,支付寶支付同理,下同),並將你要整合的應用在你的開發者賬號中註冊,並獲取支付許可權(一般這步不需要程式設計師考慮,都是客戶自己獲取的,你只需要知道,沒有支付許可權的應用,不可以整合支付)。
第二,註冊完你的應用,通過稽核之後,你會獲得開放平臺給你發放屬於這個應用的AppID和AppSecret
第三,在開發平臺的資源中心(或者叫文件中心,SDK中心什麼的),下載IOS的SDK(文件也可以下載下來方便查閱)。我這次的Demo是之前整合過ShareSDK的分享和第三方登入,所以直接用的ShareSDK中的微信SDK。
(ps,這裡之前網友有過用ShareSDK中的微信SDK不支援支付功能,我這裡是可以支付的,應該是Mob整合好了,如果你下載的不能用的話,可以去微信官方下載官方的SDK,10M左右的樣子,把ShareSDK中的微信SDK替換掉,替換的時候要注意,不能只替換檔案,要看好工程中Target選項卡里的檔案路徑是否刪除了舊檔案路徑,否則的話可能舊檔案路徑會覆蓋新檔案路徑,導致替換沒有效果或者崩潰。)
第四,將下載好的SDK拷貝到工程資料夾中,然後再工程中AddFilesTo“你的工程”,
(這裡注意,Add的時候要勾選CopyItemsIfNeeed,否則可能會出現找不到路徑這種煩人的錯誤)
第五,配置你的工程。
1.新增系統依賴庫,(這裡我用了ShareSDK,所以也連Share必須的系統庫也一併新增了),方法—點選工程名—Target—BuildPhases—Link Binary With Libraries—點選+號搜尋你需要的系統庫,並新增
SystemConfiguration.framework
QuartzCore.framework
CoreTelephony.framework
libicucore.dylib(ps,這裡因為可能你的Xcode是Xcode7,所以這裡的.dylib可能會在你的系統庫裡顯示.tbd)正常新增就好
libz.1.2.5.dylib
Security.framework
JavaScriptCore.framework
libstdc++.dylib
CoreText.framework
libsqlite3.dylib
ImageIO.framework (shareSDK新浪必須依賴庫)
AdSupport.framework(shareSDK新浪必須依賴庫)
2.配置工程的URL Types中的URL Schemes,
這個URL Schemes是用來調起第三方客戶端支付或分享或授權之後回到你的程式的標識
方法:點選工程名—Target—Info—URL Types—點選+號,在URL Schemes欄中填入你在第二步中獲取到的APPID(圖見上一步,自己找一下info選項卡)
3.如果是Xcode7需要在Info.Plist檔案中加入欄位LSApplicationQueriesSchemes,為Array型別,然後在裡面新增兩個小選項,分別為weixin和wechat(Xcode7http請求適配Xcode7的問題請自行百度)
第六、開始寫程式碼了!
1.將Demo中的WXPay資料夾拷貝到工程資料夾中,然後Add到工程目錄
2.在AppDelegate.h中#import相關標頭檔案,在AppDelegate.m檔案中的application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中新增[WXApi registerApp:APP_ID withDescription:@”demo 2.0″];(這裡的APPID就是你第二步獲取的APPID,一般建議寫成巨集。@“demo2.0”不需要修改),我的demo裡在這個方法裡還註冊了shareSDK,希望大家不要有疑惑。
3.在AppDelegate.m中加入這兩個方法:
//重要更新,一下兩個方法IOS9.0以後被廢棄了,所以如果你是Xcode7.2的話,可能會出現不能進入微信的onResp回撥方法,原因是下邊兩個方法沒有被呼叫,所以這裡更新一下,改用另外一個方法(並不建議刪除這兩個方法,新方法是9.0以後的方法,可能系統低版本的使用者不支援。所以我三種方法都留下了,如果有人發現不能都留下的話,請簡信告訴我一下,再次謝過了)
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
– (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
//改用方法為- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options;
具體方法裡的程式碼如何書寫請看Demo中的註釋。
4.配置完AppDelegate檔案之後,向你的工程中拷貝入Demo中的UIViewController+WeChatAndAliPayMethod類目,並Add到工程中,
在你需要用到支付的頁面引用這個類目。(詳情請見Demo的ViewController頁面方法和程式碼,仔細觀看註釋和理解程式碼之後微信支付的整合就完成了)
PS.支付寶整合和微信支付整合大同小異,如果你整合了微信支付,你會發現支付寶整合更簡單。
第一步,將支付寶支付的SDK拷貝到工程資料夾中,然後Add到工程目錄,
(ps。這裡注意一下,我demo裡ThirdParty下的AliPay那些檔案都是需要你在這一步拷貝的東西。)
尤其是openssl和Util還有那兩個.a檔案。因為支付寶的開發文件寫的實在是不怎麼樣,亂七八糟的,都沒有直接給你要新增的SDK包,這些東西都是從官方的demo裡抽出來的。具體你們可以下載官方demo看一看。
第二步、Add完SDK包之後,引入所需的系統庫。呼叫UIViewController+WeChatAndAliPayMethod這個類目中的支付寶支付方法即可。(注意看我Demo中的程式碼和註釋)
PS。如果你在整合支付寶的時候可能會遇到<openssl/xxx.h>not found的錯誤,(你平時用別的SDK的時候也可能會遇到),這一般情況是Xcode找不到這些檔案的路徑。在這裡,你可以在Targets中的BuildSettings中的Header Search Paths選項卡中新增openssl的路徑。
重點:Demo裡有兩個存放關鍵幾個巨集的檔案,payRequsesrHandler.h和AliPayNeedDEF.h,這兩個檔案裡面的內容你們要自己填寫自己的資料。具體如何獲取這些資料我的註釋寫的很明白了。仔細看一下就好。
還有,你們在呼叫我的支付類目中的方法的同時,要寫一個監聽,來通知你是否支付成功。這個在我的程式碼註釋裡寫的很清楚,這裡就不多贅述了。
接下來的部分是後來新增的。(三方登入,和三方分享,包括適配ios9)
注:三方登入和分享這些程式碼Mob官網都有,就不多贅述了。這裡主要是為了減少大家的程式碼量,增強複用性進行的一些整合。如果哪裡有問題或者處理不妥,希望碼友們積極提出。
首先,能做到三方登入的話,和支付一樣,需要你在第三方平臺上註冊的應用擁有登入許可權。
其次,XCode7之後IOS9,shareSDK對應也有相應的變化,第三方分享登入的時候,需要比之前多一些步驟,比如新增Schemes白名單:
info.plist中需要新增如此多的欄位(為了適應新的sso授權。以下只是新浪微博,QQ,微信三個平臺需要新增的欄位)
為方便大家按需新增,這裡進行分類:
新浪微博:sinaweibo,
sinaweibohd,
sinaweibosso,
sinaweibohdsso,
weibosdk,(新增weibosdk需要)
weibosdk2.5(新增weibosdk需要)
微信:
wechat,
weixin
QQ:
mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqq,
mqqapi
(以下是QQZone需新增的,但是一般情況一下,需要整合QQ分享登入的,都需要QQZone的,所以一般建議大家直接把QQ和QQzone的都新增進去)
mqzone
mqzoneopensdk,
mqzoneopensdkapi,
mqzoneopensdkapi19,
mqzoneopensdkapiV2,
還有,不要忘記對URLType裡面的設定。(QQ新增的時候需要用十六進位制轉化的,例:QQ41D9BC03)
關於登入的簡單整理:
我的demo工程中有個LoginMethodObject資料夾,裡面有我自己新建的一個類LoginMethod。
使用者只需要引用這個類,例項化一個物件。並實現代理
-(void)recieveTheUserInfo:(NSDictionary*)userInfo
errorMsg:(NSString *)errorMsg;
userInfo即是獲取到的使用者資訊。裡面我只獲取了暱稱,uid,頭像等等簡單的資訊。如果需要其他資訊的話需要特別對待。不過一般登入只需要uid就夠了,所以這裡不過多贅述。
注意:在實現這個代理的時候,為了方便,邏輯更清楚。需要大家做下判斷,即判斷errorMsg是否存在。
(像AFNetWorking一樣)若存在errorMsg的話,說明獲取失敗,errorMsg列印出來即是錯誤原因。若errorMsg不存在代表獲取成功,就可以直接用userInfo中的使用者資訊了
具體可以看demo中的LoginViewController的運用。
關於第三方分享:
第三方分享的話,Mob的官網上寫的很明白了,我就不多此一舉再寫什麼了。Demo中有樣板的,如果不想去mob翻的話,直接複製的話就可以了。
(單說一下,demo中寫的是適用於所有平臺均傳送同一分享內容的方法。如果需要針對不同平臺分享不同內容的話需要呼叫另外一個方法,如下)