特別注意:
1. 構造交易數(shù)據(jù)并簽名必須在商戶服務端完成,商戶的應用私鑰絕對不能保存在商戶APP客戶端中,也不能從服務端下發(fā)曹步。
2. 同步返回是的數(shù)據(jù),只是一個簡單的結果通知休讳,商戶確定該筆交易付款是否成功需要依賴服務端收到支付寶異步通知的結果進行判斷讲婚。
3. 商戶系統(tǒng)接收到通知以后,必須通過驗簽(驗證通知中的sign參數(shù))來確保支付通知是由支付寶發(fā)送的俊柔。建議使用支付寶提供的SDK來完成筹麸,詳細驗簽規(guī)則參考異步通知驗簽。
App支付iOS集成流程詳解
- 啟動IDE(如Xcode)雏婶,把iOS包中的壓縮文件中以下文件拷貝到項目文件夾下物赶,并導入到項目工程中。
- 在需要調用AlipaySDK的文件中留晚,增加頭文件引用酵紫。
- 適配iOS9.0
- 組裝請求信息。
//將商品信息賦予AlixPayOrder的成員變量
Order *order = [[Order alloc] init];
order.partner = partner;
order.sellerID = seller;
order.outTradeNO = [self generateTradeNO]; //訂單ID(由商家自行制定)
order.subject = product.subject; //商品標題
order.body = product.body; //商品描述
order.totalFee = [NSString stringWithFormat:@"%.2f",product.price]; //商品價格
order.notifyURL = @"http://www.xxx.com"; //回調URL
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//應用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"alisdkdemo";
//將商品信息拼接成字符串错维、
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
//本地未安裝支付寶客戶端奖地,或未成功調用支付寶客戶端進行支付的情況下(走H5收銀臺),會通過該completionBlock返回支付結果赋焕。相應的結果參考"客戶端[同步返回參數(shù)說明](https://opendocs.alipay.com/open/204/105301/)"鹉动。
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
注意:這一步應在商戶服務端完成苫幢,商戶服務端直接將組裝和簽名后的請求串orderString傳給客戶端懈玻,客戶端直接傳給SDK發(fā)起請求。文檔和Demo是為了示例效果在客戶端實現(xiàn)秉剑。
- 配置支付寶客戶端返回url處理方法
本地安裝了支付寶客戶端蜜氨,通過openURL同步返回結果(結果在URL中)械筛,可以通過支付包的
-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock;
解析結果。
同步通知:支付寶 SDK 對商戶的請求支付數(shù)據(jù)處理完成后飒炎,會將結果同步反饋給商戶 App 端埋哟。
異步通知:對于App支付產生的交易,支付寶會根據(jù)原始支付 API 中傳入的異步通知地址 notify_url,通過 POST 請求的形式將支付結果作為參數(shù)通知到商戶系統(tǒng)赤赊。
同步返回的數(shù)據(jù)闯狱,商戶可以按照支付寶約定的方式在服務端驗證,驗證通過后抛计,可以認為本次用戶付款成功哄孤。有些時候會出現(xiàn)商戶App在支付寶付款階段被關閉導致無法正確收到同步結果,此時支付結果可以完全依賴服務端的異步通知吹截。
由于同步通知和異步通知都可以作為支付完成的憑證瘦陈,且異步通知支付寶一定會確保發(fā)送給商戶服務端。為了簡化集成流程波俄,商戶可以將同步結果僅僅作為一個支付結束的通知(忽略執(zhí)行校驗)晨逝,實際支付是否成功,完全依賴服務端異步通知懦铺。
交易查詢接口提供所有支付寶支付訂單的查詢捉貌,商戶可以通過該接口主動查詢訂單狀態(tài),完成下一步的業(yè)務邏輯冬念。 需要調用查詢接口的情況: 當商戶后臺趁窃、網絡、服務器等出現(xiàn)異常刘急,商戶系統(tǒng)最終未接收到支付通知棚菊; 調用支付接口后浸踩,返回系統(tǒng)錯誤或未知交易狀態(tài)情況叔汁; 調用alipay.trade.pay,返回INPROCESS的狀態(tài)检碗; 調用alipay.trade.cancel之前据块,需確認支付狀態(tài);