5.2 SDK集成流程
5.2.1 iOS
解壓接口壓縮文件(文件名是 WS_MOBILE_PAY_SDK_BASE.zip),找到iOS的壓縮文件(文件名是支付寶移動支付SDK 標准版(iOS).zip)。
1. 導入代碼
-
步驟1: 啟動IDE(如Xcode),把iOS包中的壓縮文件中以下文件拷貝到項目文件夾下,
並導入到項目工程中。
-
AlipaySDK.bundle AlipaySDK.framework
-
步驟2: 在需要調用AlipaySDK的文件中,增加頭文件引用。
-
#import <AlipaySDK/AlipaySDK.h>
步驟3: 配置請求信息。
AlipaySDK.bundle AlipaySDK.framework
Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = [self generateTradeNO]; //訂單ID(由商家□自□行制定)order.productName = product.subject; //商品標題order.productDescription = product.body; //商品描述
order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品價格
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3第 8頁
移動支付接口 SDK2.0 標准版附錄文檔
order.notifyURL = @"http://www.xxx.com"; //回調URLorder.service = @"mobile.securitypay.pay";order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
//應用注冊scheme,在AlixPayDemo-Info.plist定義URL typesNSString *appScheme = @"alisdkdemo";
//將商品信息拼接成字符串
NSString *orderSpec = [order description];NSLog(@"orderSpec = %@",orderSpec);
//獲取私鑰並將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA 簽名規范,並將簽名字符串base64 編碼和 UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSStringstringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appSchemecallback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
[tableView deselectRowAtIndexPath:indexPath animated:YES];}
詳細可參見 Demo中示例文件
AliSDKDemo\APViewController.hAliSDKDemo\APViewController.mAliSDKDemo\Order.h
AliSDKDemo\Order.m
步驟4: 配置支付寶客戶端返回url處理方法。
如示例 AliSDKDemo\APAppDelegate.m文件中,增加引用代碼:
#import <AlipaySDK/AlipaySDK.h>
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3
第 9頁
移動支付接口 SDK2.0 標准版附錄文檔
在@implementation AppDelegate中增加如下代碼:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)urlsourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
//如果極簡SDK 不可用,會跳轉支付寶錢包進行支付,需要將支付寶錢包的支付結果回傳給SDKif ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權返回authCode
[[AlipaySDK defaultService] processAuthResult:urlstandbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;}
2. 針對Demo的運行注意
(1) 關於簽名代碼問題
-
AliSDKDemo\Util及下面所有文件
-
AliSDKDemo\openssl及下面所有文件
libcrypto.a
libssl.a
這些文件是為示例簽名所在客戶端本地使用。出於安全考慮,請商戶盡量把私鑰保存在服務端,在服務端進行簽名驗簽。
(2) 如果遇到運行后報錯,類似於以下提示信息:
Cannot find interface declaration for 'NSObject', superclass of 'Base64'那么需要打開報錯了的文件,增加頭文件。
#import <Foundation/Foundation.h>
(3) 如果商戶要在某個文件中使用支付寶的SDK 類庫,需增加引用頭文件。
#import <AlipaySDK/AlipaySDK.h>
(4) 點擊項目名稱,點擊“Build Settings”選項卡,在搜索框中,以關鍵字“search”搜索,對“Header Search Paths”增加頭文件路徑:$(SRCROOT)/項目名稱。如果頭文件信息已增加,可不必再增加。
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3第 10頁
移動支付接口 SDK2.0 標准版附錄文檔
圖5-1增加頭文件信息
(5) 點擊項目名稱,點擊“Build Phases”選項卡,在“Link Binary with Librarles”選項中,新增“AlipaySDK.framework”和“SystemConfiguration.framework”兩個系統庫文件。如果商戶項目中已有這兩個庫文件,可不必再增加。
圖5-2增加系統庫文件
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3第 11頁
移動支付接口 SDK2.0 標准版附錄文檔
(6) 點擊項目名稱,點擊“Info”選項卡,在“URL Types”選項中,點擊“+”,在“URL Schemes”中輸入“alisdkdemo”。“alisdkdemo”來自於文件“APViewController.m”的NSString *appScheme = @"alisdkdemo";。
圖5-3配置 URL Schemes
3. 配置基本信息打開“APViewController.m”文件,對以下三個參數進行編輯
表5-1 IOS基本信息配置
NSString *partner = @""; NSString *seller = @""; NSString *privateKey = @"";
|
參數 |
含義 |
|
partner |
合作身份者ID,以2088 開頭由16 位純數字組成的字符串。請參考“7.1如何獲得PID與密鑰”。 |
|
seller |
支付寶收款賬號,手機號碼或郵箱格式。 |
|
private_key |
商戶方的私鑰,pkcs8格式。請參考“7.2 RSA密鑰生成與使用”。 |
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3第 12頁
移動支付接口 SDK2.0 標准版附錄文檔注意:
這些參數配置是為客戶端簽名功能服務的,僅作為示例使用。商戶在接入支付寶產品時,請把這些信息通過商戶項目自己的服務端傳遞。
4. 代碼示例運行邏輯
-
步驟1: 調用order.m 里的函數 description將商品信息拼接成字符串作為待簽名字符串,
如:
-
步驟2: 使用類CreateRSADataSigner,調用signString簽名函數做簽名,如:
-
步驟3: 把簽名結果賦值給參數sign,並把sign 加入之前的待簽名數組中,此時得到的便是要請求給支付寶的全部數據。
"partner=\"2088101568353491\"&seller_id=\"2088101568353491\"&out_trade_no=\"YR2VGG3G1I31XDZ\"&subject=\"1\"&body=\"我 是 測 試 數 據\"&total_fee=\"0.02\"¬ify_url=\"http://www.xxx.com\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&show_url=\"m.alipay.com\""
"GsSZgPloF1vn52XAItRAldwQAbzIgkDyByCxMfTZG%2FMapRoyrNIJo4U1LUGjHp6gdBZ7U8jA1kljLPqkeGv8MZigd3kH25V0UK3Jc3C94Ngxm5S%2Fz5QsNr6wnqNY9sx%2Bw6DqNdEQnnks7PKvvU0zgsynip50lAhJmflmfHvp%2Bgk%3D"
"partner=\"2088101568353491\"&seller_id=\"2088101568353491\"&out_trade_no=\"YR2VGG3G1I31XDZ\"&subject=\"1\"&body=\"我 是 測 試 數 據\"&total_fee=\"0.02\"¬ify_url=\"http://www.xxx.com\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&show_url=\"m.alipay.com\"&sign=\"GsSZgPloF1vn52XAItRAldwQAbzIgkDyByCxMfTZG%2FMapRoyrNIJo4U1LUGjHp6gdBZ7U8jA1kljLPqkeGv8MZigd3kH25V0UK3Jc3C94Ngxm5S%2Fz5QsNr6wnqNY9sx%2Bw6DqNdEQnnks7PKvvU0zgsynip50lAhJmflmfHvp%2Bgk%3D\"&sign_type=\"RSA\""
步驟4: 調用(AlipaySDK *)defaultService 類下面的支付接口函數,喚起支付寶支付頁面。
appScheme 為app 在info.plist 注冊的 scheme。
(void)payOrder:(NSString *)orderStr
fromScheme:(NSString *)schemeStr
callback:(CompletionBlock)completionBlock
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3第 13頁
移動支付接口 SDK2.0 標准版附錄文檔
圖5-4支付寶支付頁面后面的動作全由買家在支付寶收銀台中操作完成。如果設備中有支付寶客戶端,會
優先調用支付寶客戶端進行支付,支付完成后會重新喚起商戶app。
步驟5: 當這筆交易被買家支付成功后支付寶收銀台上顯示該筆交易成功,並提示用戶“返回”。此時在APAppDelegate.m的 -
(BOOL)application:(UIApplication )application openURL:(NSURL )urlsourceApplication:(NSString *)sourceApplication annotation:(id)annotation中調用獲取返回數據的代碼:
拿到返回數據:
點取消后返回
對其做 URLDecode
支付寶(中國)網絡技術有限公司 版權所有|版本:1.3第 14頁
[[AlipaySDK defaultService]processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);//返回的支付結果}];
"alisdkdemo://safepay/?%7B%22memo%22:%7B%22result%22:%22%22,%22memo%22:%22%E7%94%A8%E6%88%B7%E4%B8%AD%E9%80%94%E5%8F%96%E6%B6%88%22,%22ResultStatus%22:%226001%22%7D,%22requestType%22:%22safepay%22%7D"
移動支付接口 SDK2.0 標准版附錄文檔點確認后返回
"alisdkdemo://safepay/?{"memo":{"result":"","memo":"用 戶 中 途 取 消","ResultStatus":"6001"},"requestType":"safepay"}"
"alisdkdemo://safepay/?%7B%22memo%22:%7B%22result%22:%22partner=%5C%222088101568353491%5C%22&seller_id=%5C%222088101568353491%5C%22&out_trade_no=%5C%22QU6ZOD85K4HVQFN%5C%22&subject=%5C%221%5C%22&body=%5C%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%5C%22&total_fee=%5C%220.02%5C%22¬ify_url=%5C%22http:%5C/%5C/www.xxx.com%5C%22&service=%5C%22mobile.securitypay.pay%5C%22&payment_type=%5C%221%5C%22&_input_charset=%5C%22utf-8%5C%22&it_b_pay=%5C%2230m%5C%22&show_url=%5C%22m.alipay.com%5C%22&success=%5C%22true%5C%22&sign_type=%5C%22RSA%5C%22&sign=%5C%22pg16DPA%5C/cIRg1iUFCl8lYZG54de+kfw+vCj32hGWye97isZ1A4bW6RNaDXHhZXVaI5Vk2YDxhNUl85EHRd+EL7%5C/+ogQTnsaEHl+D13PuZExIXRKGBnkYqaNV6kH6hDygnf5IOtoojHWLQyem7oRBVzB0vlF%5C/+YGFpzFHZyTVpM8=%5C%22%22,%22memo%22:%22%22,%22ResultStatus%22:%229000%22%7D,%22requestType%22:%22safepay%22%7D"
對其做 URLDecode
"alisdkdemo://safepay/?{"memo":{"result":"partner=\"2088101568353491\"&seller_id=\"2088101568353491\"&out_trade_no=\"QU6ZOD85K4HVQFN\"&subject=\"1\"&body=\"我 是 測 試 數 據\"&total_fee=\"0.02\"¬ify_url=\"http:\/\/www.xxx.com\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&show_url=\"m.alipay.com\"&success=\"true\"&sign_type=\"RSA\"&sign=\"pg16DPA\/cIRg1iUFCl8lYZG54de+kfw+vCj32hGWye97isZ1A4bW6RNaDXHhZXVaI5Vk2YDxhNUl85EHRd+EL7\/+ogQTnsaEHl+D13PuZExIXRKGBnkYqaNV6kH6hDygnf5IOtoojHWLQyem7oRBVzB0vlF\/+YGFpzFHZyTVpM8=\"","memo":"","ResultStatus":"9000"},"requestType":"safepay"}"
之后,對這些數據做處理。
注意:
-
由於在跳轉支付寶客戶端支付的過程中,商戶app在后台很可能被系統kill了,所以pay 接口的callback 就會失效,請商戶對 standbyCallback返回的回調結果進行處理;
-
同步返回數據時,建議通過服務端的驗簽功能代碼做驗簽處理,之后再對返回的數據做業務邏輯處理;
-
須以服務器異步通知的結果數據為准,並對其做業務邏輯處理。
在集成支付寶的時候會出現一下錯誤:這是路徑錯誤,

一個文件夾:名字自己起里面放着支付寶的所需的第三方庫,等頭文件如上


在build Setting里面點擊Header Search Paths然后將文件夾拖進去如上:不要手打比較容易出錯。會自動識別成相對路徑。然后就OK了


希望能夠幫到你》》》》
