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






































