下載下傳官方sdk要注意很多東西,首先要确認你的軟體是調用支付寶的什麼支付方式,目前,我所知的有調用支付寶,支付寶錢包,支付寶網頁,支付寶快捷支付,每種使用方式的代碼和邏輯都不太一樣,使用時要注意。這裡簡述一下如何使用支付寶接口。
解壓接口壓縮檔案(檔案名是 WS_MOBILE_PAY_SDK_BASE.zip),找到 iOS的壓縮檔案(檔案名是支付寶錢包支付開發包标準版(iOS).zip)。
1. 導入代碼
-
步驟1: 啟動IDE(如Xcode),把iOS包中的壓縮檔案中以下檔案拷貝到項目檔案夾下,
并導入到項目工程中。
- 步驟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]; //商品價格
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];}
步驟4: 配置支付寶用戶端傳回url處理方法。
如示例 AliSDKDemo\APAppDelegate.m 檔案中,增加引用代碼:#import <AlipaySDK/AlipaySDK.h>
在@implementation AppDelegate 中增加如下代碼:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)urlsourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
//如果極簡開發包不可用,會跳轉支付寶錢包進行支付,需要将支付寶錢包的支付結果回傳給開發包
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url
standbyCallback:^(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'
那麼需要打開報錯了的檔案,增加頭檔案。
(3) 如果商戶要在某個檔案中使用支付寶的開發包類庫,需增加引用頭檔案。#import <AlipaySDK/AlipaySDK.h>#import <Foundation/Foundation.h>
(4) 點選項目名稱,點選“Build Settings”頁籤,在搜尋框中,以關鍵字“search”搜尋,對“Header Search Paths”增加頭檔案路徑:$(SRCROOT)/項目名稱。如果頭檔案資訊已增加,可不必再增加。
圖5-1 增加頭檔案資訊
(5) 點選項目名稱,點選“Build Phases”頁籤,在“Link Binary with Librarles”選項中,新增“AlipaySDK.framework”和“SystemConfiguration.framework”兩個系統庫檔案。如果商戶項目中已有這兩個庫檔案,可不必再增加。
圖5-2 增加系統庫檔案
(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密鑰生成與使用”。 |
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。
圖5-4 支付寶支付頁面後面的動作全由買家在支付寶收銀台中操作完成。如果裝置中有支付寶用戶端,會
優先調用支付寶用戶端進行支付,支付完成後會重新喚起商戶 app。
步驟5: 當這筆交易被買家支付成功後支付寶收銀台上顯示該筆交易成功,并提示使用者“傳回”。此時在 APAppDelegate.m 的 -
(BOOL)application:(UIApplication )application openURL:(NSURL )urlsourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調用擷取傳回資料的代碼:
拿到傳回資料:
點取消後傳回
對其做 URLDecode
點确認後傳回
"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 傳回的回調結果進行處理;
- 同步傳回資料時,建議通過服務端的驗簽功能代碼做驗簽處理,之後再對傳回的資料做業務邏輯處理;
- 須以伺服器異步通知的結果資料為準,并對其做業務邏輯處理。
注意事項:1.一定要修改test中info.plist中的url 資訊,且要與自己設定的appScheme相同,否則則支付寶軟體不傳回資料且不退出支付寶,也不傳回原app
2.使用前先确認自己的版本是哪一個,是否是最新的
3.部分包需要import <Foudation/Foundation.h> 頭檔案
4.遇到openssl 報錯時 首先檢查build setting 中的Header Search Paths 是否設定,然後看看自己的檔案中openssl 和util 是都放在各自的檔案夾中,若是與項目檔案放在一起,則需要将項目中"openssl/ " 删除掉,或者重新整理下openssl ,将器放在檔案夾中
5.使用時記得對其傳回的resultStatus做處理
如下:
-(NSString *)dealWithResultCode
{
int a =[self intValue];
switch (a) {
case 9000:
return @"訂單支付成功";
break;
case 8000:
return @"正在進行中";
break;
case 4000:
return @"訂單支付失敗";
break;
case 6001:
return @"使用者中途取消";
break;
case 6002:
return @"網絡連接配接出錯";
break;
default:
break;
}
return @"不能識别";
}
以上就是我使用的見解與說明。