在記錄支付寶支付的開頭,只想感嘆一句,支付寶的文檔寫的是真真好呀!非常仔細(xì)。。。。(__) 嘻嘻……
一、在支付中添加應(yīng)用
https://open.alipay.com/platform/home.htm?from=zhuzhan20160818
登錄支付寶賬戶,
1.1 創(chuàng)建一個新的應(yīng)用

1.2 按照開發(fā)文檔設(shè)置應(yīng)用信息,可以修改,也可以在上線時再設(shè)置

1.3配置應(yīng)用環(huán)境(生成器生成的公鑰在這進(jìn)行設(shè)置,iOS使用原始私鑰,andriod使用pkcs8私鑰)
在這部分對應(yīng)的支付寶文檔對公鑰私鑰有相應(yīng)的解釋。

1.3.1 私鑰生成器的長這個樣子

1.3.2私鑰生成器的使用

1.3.3 生成公鑰私鑰后,將公鑰粘貼進(jìn)應(yīng)用環(huán)境的,應(yīng)用公鑰中(這一步需要發(fā)送手機(jī)號驗(yàn)證碼確認(rèn)后,才能進(jìn)行公鑰設(shè)置)
1.4 給應(yīng)用配置相應(yīng)的功能
添加功能->選擇相應(yīng)功能—>添加完成


注釋:
上線:這里的上線只是在支付寶平臺的上線,并不是我們的app在應(yīng)用商店上線
是否需簽約:簽約是指應(yīng)用是否簽約購買了這項(xiàng)服務(wù)。
1、如果是已經(jīng)購買的服務(wù),上線后,接口可以直接使用;如果是沒有購買的服務(wù),需要購買后才可以使用;
2、不需要簽約的服務(wù),應(yīng)用上線就可以用了
沙箱環(huán)境:沙箱環(huán)境是一個不需要上線可以直接調(diào)用接口測試的環(huán)境
1、安卓可以不用上線,使用沙箱環(huán)境測試。
2、iOS目前是無法使用沙箱環(huán)境測試APP支付的,只能先讓應(yīng)用上線,上線時間1天,非???,一般用不了1天。
1.5 應(yīng)用上線,如果在1.2中沒有設(shè)置應(yīng)用信息,需要在這里進(jìn)行修改
二、查看支付寶的集成文檔
2.1了解支付寶支付架構(gòu)

2.2支付寶支付的流程圖

2.3具體的接口調(diào)用在支付寶的文檔中寫的非常詳細(xì)!
2.4 注意事項(xiàng)
2.4.1構(gòu)造交易數(shù)據(jù)并簽名必須在商戶服務(wù)端完成,
2.4.2商戶的應(yīng)用私鑰絕對不能保存在商戶APP客戶端中,也不能從服務(wù)端下發(fā)。
2.4.3同步返回的數(shù)據(jù),只是一個簡單的結(jié)果通知,商戶確定該筆交易付款是否成功需要依賴服務(wù)端收到支付寶異步通知的結(jié)果進(jìn)行判斷。
2.4.4商戶系統(tǒng)接收到通知以后,必須通過驗(yàn)簽(驗(yàn)證通知中的sign參數(shù))來確保支付通知是由支付寶發(fā)送的。建議使用支付寶提供的SDK來完成,詳細(xì)驗(yàn)簽規(guī)則參考異步通知驗(yàn)簽。
三、集成過程
支付寶集成流程詳解
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.mCFv8i&treeId=193&articleId=105295&docType=1
步驟1:調(diào)用order.m里的函數(shù)description將商品信息拼接成字符串作為待簽名字符串
<code>NSString *authInfoStr = [authInfo description];
</code>
步驟2:使用類CreateRSADataSigner,調(diào)用signString簽名函數(shù)做簽名
<code>id<DataSigner> signer = CreateRSADataSigner(privateKey);</code>
步驟3:把簽名結(jié)果賦值給參數(shù)sign,并把sign加入之前的待簽名數(shù)組中,此時得到的便是要請求給支付寶的全部數(shù)據(jù)。
<code>authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, @"RSA"];</code>
*步驟4:調(diào)用(AlipaySDK )defaultService類下面的支付接口函數(shù),喚起支付寶支付頁面。
<code>[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];</code>
步驟5:當(dāng)這筆交易被買家支付成功后支付寶收銀臺上顯示該筆交易成功,并提示用戶返回。
此時在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調(diào)用獲取返回數(shù)據(jù)的代碼【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中執(zhí)行 】:
<code>[[AlipaySDK defaultService]
processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);//返回的支付結(jié)果
}];</code>
五、官方demo
<pre>
點(diǎn)擊訂單模擬支付行為==============
-
(void)doAlipayPay
{
/步驟一、需要填寫商戶app申請的APPID和私鑰===================================/NSString *appID = @"支付寶應(yīng)用的APPID";
NSString *privateKey = @"支付寶應(yīng)用公鑰對應(yīng)的私鑰";//partner和seller獲取失敗,提示
if ([appID length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少appId或者私鑰。"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
return;
}
//生成訂單信息及簽名
/步驟二、訂單信息設(shè)置===================================/
//將商品信息賦予AlixPayOrder的成員變量
Order* order = [Order new];
// NOTE: app_id設(shè)置
order.app_id = appID;
// NOTE: 支付接口名稱
order.method = @"alipay.trade.app.pay";
// NOTE: 參數(shù)編碼格式
order.charset = @"utf-8";
// NOTE: 當(dāng)前時間點(diǎn)
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設(shè)置
order.sign_type = @"RSA";
// NOTE: 商品數(shù)據(jù)
/商品信息=======================
total_amount:商品價格(支付金額)
out_trade_no:訂單ID(商戶訂單號)--這個地方用了隨機(jī)的。正常情況下,服務(wù)器端會給!
seller_id:收款商戶號
timeout_express:超時時間設(shè)置
subject:主題(顯示的數(shù)據(jù),自己寫,不影響支付)
body:內(nèi)容對一筆交易的具體描述信息(自己寫就可以)
===================================/
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"; //超時時間設(shè)置
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(獲取私鑰),調(diào)用signString簽名函數(shù)做簽名(并將商戶信息簽名)需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode=========================================/
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加簽成功,則繼續(xù)執(zhí)行支付
if (signedString != nil) {
NSString *appScheme = @"alisdkdemo";//url types設(shè)置
/步驟五、把簽名結(jié)果賦值給參數(shù)sign,并把sign加入之前的待簽名數(shù)組中,此時得到的便是要請求給支付寶的全部數(shù)據(jù)(訂單字符串)。==============================================/
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
NSLog(@"orderString%@",orderString);
/步驟六、調(diào)用支付結(jié)果開始支付=========================/
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
}
// 產(chǎn)生隨機(jī)訂單號
-
(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>

六、開發(fā)過程中需要注意的事項(xiàng)
1、URL Types需要設(shè)置URL Scheme
URL Scheme是跳轉(zhuǎn)其他APP的必須設(shè)置。
可以在info.plist文件中設(shè)置,也可以在info下找到URL Types進(jìn)行設(shè)置

2、需要設(shè)置頭文件路徑:點(diǎn)擊“Build Settings”選項(xiàng)卡,在搜索框中,以關(guān)鍵字“search”搜索,對“Header Search Paths”增加頭文件路徑:$(SRCROOT)/項(xiàng)目名稱。如果頭文件信息已增加,可不必再增加。

3、官方的demo中會報一個錯誤,私鑰為空
檢查私鑰的正確性后,如果還不能解決,嘗試使用以下方法修改:
對私鑰樣式的拼接中進(jìn)行修改
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----
修改成
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----
4、支付寶打開失敗,ALI40247錯誤
這個錯誤的原因一般是支付寶的應(yīng)用配置有問題,解決方法:
4.1、檢查使用的APPID 私鑰是否正確
4.2、檢查支付寶中應(yīng)用是否添加APP支付功能
4.3、檢查APP支付功能是否已經(jīng)簽約
如果以上都沒問題,可以在支付寶刪除應(yīng)用,再重新創(chuàng)建一個新應(yīng)用進(jìn)行測試