1. 程式人生 > >iOS整合支付寶支付流程詳解

iOS整合支付寶支付流程詳解

接入前期準備工作

接入前期準備工作包括商戶簽約和金鑰配置。

開發包整合流程:(這裡只是講述iOS)

  1. 將我們下載的sdk壓縮包解壓,找到客戶端demo(PS:sdk下載連結:支付寶SDK下載)
  2. 匯入程式碼。
    步驟一:啟動Xcode,把剛剛解壓的壓縮檔案中的以下檔案拷貝到專案資料夾下,並匯入工程專案中,
    這裡寫圖片描述

在專案的Build Phases選項卡的Link Binary With Libraries中,新增以下依賴庫:
這裡寫圖片描述

其中,需要注意的是:
* 如果是Xcode7.0之後的版本,需要新增libc++.tbd、libz.tbd;
* 如果是Xcode7.0之前的版本,需要新增libc++.dylib、libz.dylib。

步驟二:在需要呼叫AlipaySDK的檔案中,匯入標頭檔案

#import <AlipaySDK/AlipaySDK.h>

步驟三:如果你的app基於9.0編譯,那麼為了適配在iOS9.0中的網路請求對http的限制,這裡需要對支付寶的請求地址alipay.com、alipayobjects.com做li例外,在app對應的info.plist中新增如下配置(文中以XML格式描述,PS:你可以採用open source code 開啟info.plist檔案,然後將如下程式碼新增到裡面)

<key>NSAppTransportSecurity</key>
<dict> <key>NSExceptionDomains</key> <dict> <key>alipay.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key
>
<true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>alipayobjects.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict>

說明:
如果商戶配置瞭如下的配置

<key>NSAppTransportSecurity</key>
    <dict>    
        <key>NSAllowsArbitraryLoads</key><true/>
    </dict>

則上面說得步驟三可以不用配置。
步驟四:配置請求資訊(ps:此處的order資訊中,一個都不能缺少)

Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = [self generateTradeNO]; //訂單ID(由商家?自?行制定)
order.productName = product.subject; //商品標題
order.productDescription = product.body; //商品描述
order.amount = [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";

//應用註冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"alisdkdemo";

//將商品資訊拼接成字串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);

//獲取私鑰並將商戶資訊簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規範,並將簽名字串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"];

   [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
//【callback處理支付結果】
            NSLog(@"reslut = %@",resultDic);
   }];

步驟五:配置支付寶客戶端返回url處理方法。
在 AppDelegate中增加如下程式碼:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{

    //如果極簡開發包不可用,會跳轉支付寶錢包進行支付,需要將支付寶錢包的支付結果回傳給開發包
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    //【由於在跳轉支付寶客戶端支付的過程中,商戶app在後臺很可能被系統kill了,所以pay介面的callback就會失效,請商戶對standbyCallback返回的回撥結果進行處理,就是在這個方法裡面處理跟callback一樣的邏輯】
            NSLog(@"result = %@",resultDic);
        }];
    }
    if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權返回authCode

        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【由於在跳轉支付寶客戶端支付的過程中,商戶app在後臺很可能被系統kill了,所以pay介面的callback就會失效,請商戶對standbyCallback返回的回撥結果進行處理,就是在這個方法裡面處理跟callback一樣的邏輯】
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}