iOS 支付寶支付開發(fā)(新版)
1. 介紹
本文為以前做的項目總結(jié),由于相關(guān)支付 SDK 迭代,原文已經(jīng)不滿足需求,故作如下更新,供大家參考,另外增加常見問題總結(jié)。
今天我們就主要介紹一下支付寶支付,其他支付介紹后面會盡快更新出來。
在做支付之前,在網(wǎng)上也查尋了資料,大多都說,支付接入坑太多,微信坑最多,銀聯(lián)文檔太復(fù)雜。
其實如果接入的多的話,那些套路都可以繞著走。
網(wǎng)上的經(jīng)驗什么的大都是比較老的,比較新的能用到的文章不多(但是好文章還是有的,對我?guī)椭埠艽?,下面給大家詳細介紹一下,幫助大家繞開坑。
2. 交互流程
建議先把開發(fā)文檔仔仔細細看一遍,一定要看,剛開始的時候沒有老老實實地看完,結(jié)果遇到很多的坑,浪費的挺多的時間的,所以建議一定要好好看看,特別是交互流程這一部分。
2.1 功能流程
2.2 數(shù)據(jù)交互
支付寶支付的功能流程相比較微信支付來說簡單的很,如上面兩張圖展示的,我們的 App(也就是商戶客戶端)所做的大概只有三個步驟:
- 生成訂單
- 調(diào)用支付寶接口,發(fā)送訂單
- 返回訂單支付結(jié)果并處理
3. 下載支付寶 SDK
支付寶業(yè)務(wù)眾多,真想找到想要的支付sdk還是要費一番功夫的,這里給出了最新的 SDK 地址
注意的是下載出來的 SDK 包里面并沒有傳說中的開發(fā)文檔,需要其他地方找或者看網(wǎng)頁上的。
公鑰、私鑰、PID、sellerID、key這些東西的用途和獲取方式在文檔上都有詳細的說明,這里不再贅述,一定要把概念分清楚再去做,不然一會就亂了。如果遇到問題的話咱們可以再一起探討。
4. 導(dǎo)入庫集成SDK
4.1 導(dǎo)入文件和關(guān)鍵庫
通過 CocoaPods 導(dǎo)入
- pod 'AlipaySDK-iOS'
手動導(dǎo)入
官方 demo 截圖
打開 iOS 工程,新版本 SDK 文件 Order 文件,你需要復(fù)制粘貼到自己工程里的有:
- AlipaySDK.framework
- AlipaySDK.bundle
- Until 文件夾
- openssl 文件夾
- libcrypto.a 和 libssl.a
上面的一部分文件在打開的項目中是看不到的,需要打開項目文件夾找到。
在 Build Phases 選項卡的 Link Binary With Libraries 中,增加以下依賴:
其中,需要注意的是:
- 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
- 如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib(如下圖)。
此時,假如你啟動工程,很大幾率上你會發(fā)現(xiàn)報 error 的情況。
4.2 引入頭文件
在需要調(diào)用 AlipaySDK 的文件中,增加頭文件引用。
- import <AlipaySDK/AlipaySDK.h>
4.3 調(diào)用支付接口
在支付寶的接入文檔中,是將生成一個訂單這步放在客戶端來做了,但這個最好是放在服務(wù)器端來做。
后臺生成訂單然后拼接,簽名,然后服務(wù)器端直接給客戶端傳一個加密簽名過的參數(shù)就可以了,這樣比較安全。
所有的訂單信息,商戶信息等都掌握在自己的手中,這樣的話APP端就不怕被攔截數(shù)據(jù),并且調(diào)用起來也就特別簡單了,只需要調(diào)用支付的接口。
如果只需要發(fā)送訂單和處理支付返回結(jié)果,只需要添加 AlipaySDK.bundle 和AlipaySDK.framework 這兩個就行了,下載的SDK中很容易發(fā)現(xiàn)。
快捷支付方法是這個:
- -(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
在支付的按鈕中,使用支付寶這個類,再調(diào)用這個方法就行啦!如下如:
- // NOTE: 調(diào)用支付結(jié)果開始支付
- [[AlipaySDK defaultService] payOrder:orderString fromScheme:@"FBYAlipayDemo" callback:^(NSDictionary *resultDic) {
- NSLog(@"reslut = %@",resultDic);
- }];
4.4 配置支付寶客戶端返回 url 處理方法
如示例 AliSDKDemo\APAppDelegate.m 文件中,增加引用代碼:
- import <AlipaySDK/AlipaySDK.h>
在 @implementation AppDelegate 中以下代碼中的 NSLog 改為實際業(yè)務(wù)處理代碼:
- - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
- {
- if ([url.host isEqualToString:@"safepay"]) {
- //跳轉(zhuǎn)支付寶錢包進行支付,處理支付結(jié)果
- [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
- NSLog(@"result = %@",resultDic);
- }];
- }
- return YES;
- }
4.5 項目配置
最后,不要忘了還要寫一個 URL Scheme,在 Targets -> Info 下最后一個即可找到,
點擊 “Info” 選項卡,在 “URL Types ”選項中,點擊 “+”。
5. 常見問題匯總
5.1 支付后無法返回 App
一般是由于白名單沒有設(shè)置正確
- // NOTE: 調(diào)用支付結(jié)果開始支付
- [[AlipaySDK defaultService] payOrder:orderString fromScheme:@"FBYAlipayDemo" callback:^(NSDictionary *resultDic) {
- NSLog(@"reslut = %@",resultDic);
- }];
上方代碼中 appScheme 參數(shù)需要和文章 4.5 項目配置中設(shè)置的 URL Schemes 相同,這樣才能對應(yīng)返回 App。
5.2 #include not find
這是一個神奇的大坑,我Google了好久,也不得其解,然后經(jīng)網(wǎng)友提醒之后想起來#import ""和#import <>的區(qū)別。
解決方法:Targets -> Build Settings 下的 Header Search Paths。
添加如下目錄 "$(SRCROOT)/項目名稱/文件的絕對地址"
如圖:
5.3 'openssl/asn1.h' file not found
由于在項目中引入 openssl 庫,出現(xiàn)這個問題是因為庫文件項目無法找到,只需要在 Header Search Paths 中加入 $(PROJECT_DIR)/項目名稱/openssl 即可,如下圖操作:
5.4 Undefined symbol: OBJC_METACLASS$_WKWebView
出現(xiàn)上面的問題,需要在項目配置中添加系統(tǒng)類庫:WebKit.framework
5.5 如果遇到運行后報錯,類似于以下提示信息:
- Cannot find interface declaration for 'NSObject', superclass of 'Base64'
那么需要打開報錯了的文件,增加頭文件。
- # import <Foundation/Foundation.h>
5.6 Swift 中接入 SDK 遇到的問題
如果項目使用 Swift 為開發(fā)語言,需要添加橋接文件,如 Bridging-Header.h
同時,在項目 Build Settings 中設(shè)置橋接文件的位置。
運行時如果發(fā)生以下報錯,則在橋接文件中,寫入#import
5.7 點擊支付跳轉(zhuǎn)至支付寶卡在啟動頁面
出現(xiàn)這個情況被卡在的頁面會出現(xiàn)相應(yīng)錯誤提示,一般有以下幾種情況:
- 商品信息拼接字符串錯誤
- 支付賬號過期待續(xù)費狀態(tài)
- 商戶 ID 錯誤
- 訂單信息驗簽失敗