在記錄支付寶支付的開頭,只想感嘆一句,支付寶的文檔寫的是真真好呀!非常仔細。。。。(__) 嘻嘻……
一、在支付中添加應用
https://open.alipay.com/platform/home.htm?from=zhuzhan20160818
登錄支付寶賬戶,
1.1 創建一個新的應用
1.2 按照開發文檔設置應用信息,可以修改,也可以在上線時再設置
1.3配置應用環境(生成器生成的公鑰在這進行設置,iOS使用原始私鑰,andriod使用pkcs8私鑰)
在這部分對應的支付寶文檔對公鑰私鑰有相應的解釋。
1.3.1 私鑰生成器的長這個樣子
1.3.2私鑰生成器的使用
1.3.3 生成公鑰私鑰后,將公鑰粘貼進應用環境的,應用公鑰中(這一步需要發送手機號驗證碼確認后,才能進行公鑰設置)
1.4 給應用配置相應的功能
添加功能->選擇相應功能—>添加完成
注釋:
上線:這里的上線只是在支付寶平臺的上線,并不是我們的app在應用商店上線
是否需簽約:簽約是指應用是否簽約購買了這項服務。
1、如果是已經購買的服務,上線后,接口可以直接使用;如果是沒有購買的服務,需要購買后才可以使用;
2、不需要簽約的服務,應用上線就可以用了
沙箱環境:沙箱環境是一個不需要上線可以直接調用接口測試的環境
1、安卓可以不用上線,使用沙箱環境測試。
2、iOS目前是無法使用沙箱環境測試APP支付的,只能先讓應用上線,上線時間1天,非常快,一般用不了1天。
1.5 應用上線,如果在1.2中沒有設置應用信息,需要在這里進行修改
二、查看支付寶的集成文檔
2.1了解支付寶支付架構
2.2支付寶支付的流程圖
2.3具體的接口調用在支付寶的文檔中寫的非常詳細!
2.4 注意事項
2.4.1構造交易數據并簽名必須在商戶服務端完成,
2.4.2商戶的應用私鑰絕對不能保存在商戶APP客戶端中,也不能從服務端下發。
2.4.3同步返回的數據,只是一個簡單的結果通知,商戶確定該筆交易付款是否成功需要依賴服務端收到支付寶異步通知的結果進行判斷。
2.4.4商戶系統接收到通知以后,必須通過驗簽(驗證通知中的sign參數)來確保支付通知是由支付寶發送的。建議使用支付寶提供的SDK來完成,詳細驗簽規則參考異步通知驗簽。
三、集成過程
支付寶集成流程詳解
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.mCFv8i&treeId=193&articleId=105295&docType=1
步驟1:調用order.m里的函數description將商品信息拼接成字符串作為待簽名字符串
<code>NSString *authInfoStr = [authInfo description];
</code>
步驟2:使用類CreateRSADataSigner,調用signString簽名函數做簽名
<code>id<DataSigner> signer = CreateRSADataSigner(privateKey);</code>
步驟3:把簽名結果賦值給參數sign,并把sign加入之前的待簽名數組中,此時得到的便是要請求給支付寶的全部數據。
<code>authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, @"RSA"];</code>
*步驟4:調用(AlipaySDK )defaultService類下面的支付接口函數,喚起支付寶支付頁面。
<code>[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];</code>
步驟5:當這筆交易被買家支付成功后支付寶收銀臺上顯示該筆交易成功,并提示用戶返回。
此時在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調用獲取返回數據的代碼【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中執行 】:
<code>[[AlipaySDK defaultService]
processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);//返回的支付結果
}];</code>
五、官方demo
<pre>
點擊訂單模擬支付行為==============
-
(void)doAlipayPay
{
/步驟一、需要填寫商戶app申請的APPID和私鑰===================================/NSString *appID = @"支付寶應用的APPID";
NSString *privateKey = @"支付寶應用公鑰對應的私鑰";//partner和seller獲取失敗,提示
if ([appID length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少appId或者私鑰。"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
return;
}
//生成訂單信息及簽名
/步驟二、訂單信息設置===================================/
//將商品信息賦予AlixPayOrder的成員變量
Order* order = [Order new];
// NOTE: app_id設置
order.app_id = appID;
// NOTE: 支付接口名稱
order.method = @"alipay.trade.app.pay";
// NOTE: 參數編碼格式
order.charset = @"utf-8";
// NOTE: 當前時間點
NSDateFormatter* formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
order.timestamp = [formatter stringFromDate:[NSDate date]];
// NOTE: 支付版本
order.version = @"1.0";
// NOTE: sign_type設置
order.sign_type = @"RSA";
// NOTE: 商品數據
/商品信息=======================
total_amount:商品價格(支付金額)
out_trade_no:訂單ID(商戶訂單號)--這個地方用了隨機的。正常情況下,服務器端會給!
seller_id:收款商戶號
timeout_express:超時時間設置
subject:主題(顯示的數據,自己寫,不影響支付)
body:內容對一筆交易的具體描述信息(自己寫就可以)
===================================/
order.biz_content = [BizContent new];
order.biz_content.body = @"abc";
order.biz_content.subject = @"1";
order.biz_content.out_trade_no = [self generateTradeNO]; //訂單ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超時時間設置
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品價格
order.biz_content.seller_id =@"收款商戶號";// 收款商戶號
/步驟三、將訂單信息拼接成字符串=========================================
訂單信息串中的各個value是否encode
非encode訂單信息串,用于生成簽名
encode訂單信息串 + 簽名,用于最終的支付請求訂單信息串===================================/
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
/步驟四、使用類CreateRSADataSigner(獲取私鑰),調用signString簽名函數做簽名(并將商戶信息簽名)需要遵循RSA簽名規范,并將簽名字符串base64編碼和UrlEncode=========================================/
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加簽成功,則繼續執行支付
if (signedString != nil) {
NSString *appScheme = @"alisdkdemo";//url types設置
/步驟五、把簽名結果賦值給參數sign,并把sign加入之前的待簽名數組中,此時得到的便是要請求給支付寶的全部數據(訂單字符串)。==============================================/
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
NSLog(@"orderString%@",orderString);
/步驟六、調用支付結果開始支付=========================/
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
}
// 產生隨機訂單號
-
(NSString *)generateTradeNO
{
static int kNumber = 15;NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
</pre>
六、開發過程中需要注意的事項
1、URL Types需要設置URL Scheme
URL Scheme是跳轉其他APP的必須設置。
可以在info.plist文件中設置,也可以在info下找到URL Types進行設置
2、需要設置頭文件路徑:點擊“Build Settings”選項卡,在搜索框中,以關鍵字“search”搜索,對“Header Search Paths”增加頭文件路徑:$(SRCROOT)/項目名稱。如果頭文件信息已增加,可不必再增加。
3、官方的demo中會報一個錯誤,私鑰為空
檢查私鑰的正確性后,如果還不能解決,嘗試使用以下方法修改:
對私鑰樣式的拼接中進行修改
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----
修改成
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----
4、支付寶打開失敗,ALI40247錯誤
這個錯誤的原因一般是支付寶的應用配置有問題,解決方法:
4.1、檢查使用的APPID 私鑰是否正確
4.2、檢查支付寶中應用是否添加APP支付功能
4.3、檢查APP支付功能是否已經簽約
如果以上都沒問題,可以在支付寶刪除應用,再重新創建一個新應用進行測試