日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS之“支付宝支付”开发流程

發布時間:2024/5/17 编程问答 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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是訂單信息,以及簽名驗證信息。

代碼過程展示:

  • 在AppDelegate中:
- (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之“支付宝支付”开发流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。