在記錄支付寶支付的開頭另患,只想感嘆一句纽乱,支付寶的文檔寫的是真真好呀!非常仔細昆箕。鸦列。租冠。。(__) 嘻嘻……
一薯嗤、在支付中添加應用
https://open.alipay.com/platform/home.htm?from=zhuzhan20160818
登錄支付寶賬戶肺稀,
1.1 創(chuàng)建一個新的應用
1.2 按照開發(fā)文檔設置應用信息,可以修改应民,也可以在上線時再設置
1.3配置應用環(huán)境(生成器生成的公鑰在這進行設置话原,iOS使用原始私鑰,andriod使用pkcs8私鑰)
在這部分對應的支付寶文檔對公鑰私鑰有相應的解釋诲锹。
1.3.1 私鑰生成器的長這個樣子
1.3.2私鑰生成器的使用
1.3.3 生成公鑰私鑰后繁仁,將公鑰粘貼進應用環(huán)境的,應用公鑰中(這一步需要發(fā)送手機號驗證碼確認后归园,才能進行公鑰設置)
1.4 給應用配置相應的功能
添加功能->選擇相應功能—>添加完成
注釋:
上線:這里的上線只是在支付寶平臺的上線黄虱,并不是我們的app在應用商店上線
是否需簽約:簽約是指應用是否簽約購買了這項服務。
1庸诱、如果是已經購買的服務捻浦,上線后,接口可以直接使用桥爽;如果是沒有購買的服務朱灿,需要購買后才可以使用;
2钠四、不需要簽約的服務盗扒,應用上線就可以用了
沙箱環(huán)境:沙箱環(huán)境是一個不需要上線可以直接調用接口測試的環(huán)境
1、安卓可以不用上線缀去,使用沙箱環(huán)境測試侣灶。
2、iOS目前是無法使用沙箱環(huán)境測試APP支付的缕碎,只能先讓應用上線褥影,上線時間1天,非秤酱疲快凡怎,一般用不了1天。
1.5 應用上線处嫌,如果在1.2中沒有設置應用信息栅贴,需要在這里進行修改
二斟湃、查看支付寶的集成文檔
2.1了解支付寶支付架構
2.2支付寶支付的流程圖
2.3具體的接口調用在支付寶的文檔中寫的非常詳細熏迹!
2.4 注意事項
2.4.1構造交易數據并簽名必須在商戶服務端完成,
2.4.2商戶的應用私鑰絕對不能保存在商戶APP客戶端中凝赛,也不能從服務端下發(fā)注暗。
2.4.3同步返回的數據坛缕,只是一個簡單的結果通知,商戶確定該筆交易付款是否成功需要依賴服務端收到支付寶異步通知的結果進行判斷捆昏。
2.4.4商戶系統(tǒng)接收到通知以后赚楚,必須通過驗簽(驗證通知中的sign參數)來確保支付通知是由支付寶發(fā)送的。建議使用支付寶提供的SDK來完成骗卜,詳細驗簽規(guī)則參考異步通知驗簽宠页。
三、集成過程
支付寶集成流程詳解
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 中執(zhí)行 】:
<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簽名規(guī)范漆羔,并將簽名字符串base64編碼和UrlEncode=========================================/
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加簽成功,則繼續(xù)執(zhí)行支付
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>
六、開發(fā)過程中需要注意的事項
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支付功能是否已經簽約
如果以上都沒問題庄拇,可以在支付寶刪除應用癞尚,再重新創(chuàng)建一個新應用進行測試