生活随笔
收集整理的這篇文章主要介紹了
iOS之“支付宝支付”开发流程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
支付寶快捷支付的主要步驟:
- 先與支付寶簽約,獲得商戶ID(partner)和賬號ID(seller);
- 下載相應的公鑰私鑰文件(加密簽名用);
- 下載支付寶SDK;
- 生成訂單信息;
- 調用支付寶客戶端,由支付寶客戶端跟支付寶安全服務器打交道;
- 支付完畢后返回支付結果給商戶客戶端和服務。
而iOS客戶端需要做的是:
在調用支付寶支付接口前,還需要先生成一個訂單,下載的支付寶文檔中描述時,是將這步也放在客戶端來做了,但也可以在服務器端生成這個訂單(支付寶會在支付成功后通知服務器端,所以在服務器端生成訂單的話,開發者掌握所有訂單,而且也會更安全)。
- 生成訂單(可以在iOS客戶端內生成,也可以在服務器端生成);
- 調用支付寶支付接口,發送訂單;
- 處理支付寶返回的支付結果。
支付寶支付的安全問題,需要在生成訂單和處理支付結果的時候做一個安全性校驗:即生成訂單時對數據簽名,收到支付結果時對數據進行簽名驗證,以檢驗數據是否被篡改過(支付寶目前只支持采用RSA加密方式做簽名驗證)。簡單地說,就是在生產訂單時,需要使用私鑰生成簽名值;在處理返回的支付結果時,需要使用公鑰驗證返回結果是否被篡改。
支付寶iOS SDK的官方下載地址:
https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash
壓縮包里有兩個相關文檔:
《支付寶錢包支付接口開發包2.0標準版.pdf》
《支付寶錢包支付接口開發包2.0標準版接入與使用規則.pdf》
集成支付寶支付的主要流程:
- 將需要的文件,靜態庫等拖入工程中,這里有include,libs,Utilities,libcrypto.a,libssl.a文件(如果只需要發送訂單和處理支付返回結果,只需要添加AlipaySDK.bundle和AlipaySDK.framework)。如下圖:
- 設置Head Search Paths 和 Library Search Paths
即:targets->Build Setting ->Search Paths->Always Search User Paths和 Library Search Paths,注意:Always Search User Paths 和 Library Search Paths的路徑一定要根據這個地址能找到對應的頭文件。
- 設置partner、seller、RSA private key、RSA public key 一般是設置在-info文件中。
- 支付成功后,回到應用程序中,需要設置回調的標示,同樣在-info文件中,添加個節點:
- (void)payOrder:(NSString *)orderStrfromScheme:(NSString *)schemeStrcallback:(CompletionBlock)completionBlock;
如果手機內沒安裝支付寶的app,會直接展現支付寶web支付界面,通過callback返回支付結果;如果手機內安裝了支付寶的app,會跳轉到支付寶的app支付,然后通過openURL的回調返回支付結果。
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {if ([resultDic[@"resultStatus"] intValue] == 9000) {//支付成功}else{NSString *resultMes = resultDic[@"memo"];resultMes = (resultMes.length<=0?@"支付失敗":resultMes);NSLog(@"%@",resultMes); }}];
支付寶的SDK只給了一個處理返回結果的方法,沒有提供處理openURL的方法:
if ([url.host isEqualToString:@"safepay"]) {[[AlipaySDK defaultService] processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}]; }
SDK提供了處理openURL返回結果的方法:
- (void)processOrderWithPaymentResult:(NSURL *)resultUrl standbyCallback:(CompletionBlock)completionBlock;
兩個回調block都統一定義為typedef void(^CompletionBlock)(NSDictionary *resultDic)。
resultStatus狀態碼對應的信息:
- 9000:訂單支付成功
- 8000:正在處理中
- 4000:訂單支付失敗
- 6001:用戶中途取消
- 6002:網絡連接出錯
result是訂單信息,以及簽名驗證信息。
代碼過程展示:
- (BOOL)application:(UIApplication *)applicationopenURL:(NSURL *)urlsourceApplication:(NSString *)sourceApplicationannotation:(id)annotation {//跳轉支付寶錢包進行支付,處理支付結果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}];return YES;
}- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {[self parseURL:url application:application];return YES;
}//簽名驗證
- (void)parseURL:(NSURL *)url application:(UIApplication *)application {AlixPay *alixpay = [AlixPay shared];AlixPayResult *result = [alixpay handleOpenURL:url];if (result) {//是否支付成功if (9000 == result.statusCode) {/**用公鑰驗證簽名*/id<DataVerifier> verifier = CreateRSADataVerifier([[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA public key"]);if ([verifier verifyString:result.resultString withSign:result.signString]) {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:result.statusMessage delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil];[alertView show];}//驗簽錯誤else {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"簽名錯誤" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil];[alertView show];}}//如果支付失敗,可以通過result.statusCode查詢錯誤碼else {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:result.statusMessage delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil];[alertView show];}}
}
- (void)payTreasurePay {/**商戶的唯一的parnter和seller。*簽約后,支付寶會為每個商戶分配一個唯一的 parnter 和 seller。*///如果partner和seller數據存于其他位置,請改寫下面兩行代碼NSString *partner = @"商戶的parnter";NSString *seller = @"商戶的seller";//partner和seller獲取失敗,提示if ([partner length] == 0 || [seller length] == 0){UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"message:@"缺少partner或者seller"delegate:selfcancelButtonTitle:@"確定"otherButtonTitles:nil];[alert show];return;}/**生成訂單信息及簽名*///將商品信息賦予AlixPayOrder的成員變量AlixPayOrder *order = [[AlixPayOrder alloc] init];order.partner = partner;order.seller = seller;order.tradeNO = @"訂單ID"; //訂單ID(由商家自行制定)order.productName = @"商品標題"; //商品標題order.productDescription = @"商品描述"; //商品描述order.amount = [NSString stringWithFormat:@"%.2f",2.5]; //商品價格order.notifyURL = @"http://www.xxx.com"; //回調URLorder.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 = URLScheme;//將商品信息拼接成字符串NSString *orderSpec = [order description];NSLog(@"orderSpec = %@",orderSpec);//獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規范,并將簽名字符串base64編碼和UrlEncodeNSString *privateKey = @"私鑰";id<DataSigner> signer = CreateRSADataSigner(privateKey);NSLog(@"prikey = %@",privateKey);NSString *signedString = [signer signString:orderSpec];//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式NSString *orderString = nil;if (signedString != nil) {orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec, signedString, @"RSA"];//調用支付寶[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {NSString *resultStatus=resultDic[@"resultStatus"];if([resultStatus isEqualToString: @"9000"]){[self alert:@"恭喜" msg:@"您已成功支付啦!"];}else{[self alert:@"提示" msg:@"支付失敗,可在待付款訂單中查看"];}[self.navigationController popToRootViewControllerAnimated:YES];}];/*//獲取安全支付單例并調用安全支付接口AlixPay * alixpay = [AlixPay shared];int ret = [alixpay pay:orderString applicationScheme:appScheme];if(ret == 9000){[self alert:@"恭喜" msg:@"您已成功支付啦!"];}else{[self alert:@"提示" msg:@"支付失敗,可在待付款訂單中查看"];}[self.navigationController popToRootViewControllerAnimated:YES];if (ret == kSPErrorAlipayClientNotInstalled) {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"message:@"您還沒有安裝支付寶快捷支付,請先安裝。"delegate:selfcancelButtonTitle:@"確定"otherButtonTitles:nil];[alertView show];}else if (ret == kSPErrorSignError) {NSLog(@"簽名錯誤!");} */}
}- (void)alert:(NSString *)title msg:(NSString *)msg
{UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];[alter show];
}
注:
RSA加密算法,除了可加解密外,還可用來作簽名校驗。簡單的說,RSA會生成一個私鑰和一個公鑰,私鑰應該獨自保管,公鑰可以分發出去。做簽名驗證時,可以用私鑰對需要傳輸的數據做簽名加密,生成一個簽名值,之后分發數據,接收方通過公鑰對簽名值做校驗,如果一致則認為數據無篡改。
支付寶demo(包括ios,android,wp)下載地址:
http://download.csdn.net/download/pearlhuzhu/5736965
解決在iOS9上調用支付寶不可回調的問題以及支付寶的嵌入流程:
http://blog.csdn.net/baby_hua/article/details/51004405
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的iOS之“支付宝支付”开发流程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。