天天看點

IOS 使用支付寶的注意事項

下載下傳官方sdk要注意很多東西,首先要确認你的軟體是調用支付寶的什麼支付方式,目前,我所知的有調用支付寶,支付寶錢包,支付寶網頁,支付寶快捷支付,每種使用方式的代碼和邏輯都不太一樣,使用時要注意。這裡簡述一下如何使用支付寶接口。

解壓接口壓縮檔案(檔案名是 WS_MOBILE_PAY_SDK_BASE.zip),找到 iOS的壓縮檔案(檔案名是支付寶錢包支付開發包标準版(iOS).zip)。

1. 導入代碼

  1. 步驟1:  啟動IDE(如Xcode),把iOS包中的壓縮檔案中以下檔案拷貝到項目檔案夾下,

    并導入到項目工程中。

  2. 步驟2:  在需要調用AlipaySDK的檔案中,增加頭檔案引用。#import <AlipaySDK/AlipaySDK.h>

步驟3: 配置請求資訊。

AlipaySDK.bundle
AlipaySDK.framework
      

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"; //回調URLorder.service = @"mobile.securitypay.pay";order.paymentType = @"1";

order.inputCharset = @"utf-8";

order.itBPay = @"30m";
      

//應用注冊scheme,在AlixPayDemo-Info.plist定義URL typesNSString *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 = [NSStringstringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",

orderSpec, signedString, @"RSA"];
      

[[AlipaySDK defaultService] payOrder:orderString fromScheme:appSchemecallback:^(NSDictionary *resultDic) {

NSLog(@"reslut = %@",resultDic);
      

}];

[tableView deselectRowAtIndexPath:indexPath animated:YES];} 

步驟4: 配置支付寶用戶端傳回url處理方法。

如示例 AliSDKDemo\APAppDelegate.m 檔案中,增加引用代碼:#import <AlipaySDK/AlipaySDK.h> 

在@implementation AppDelegate 中增加如下代碼:

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

//如果極簡開發包不可用,會跳轉支付寶錢包進行支付,需要将支付寶錢包的支付結果回傳給開發包

if ([url.host isEqualToString:@"safepay"]) {

[[AlipaySDK defaultService] processOrderWithPaymentResult:url

standbyCallback:^(NSDictionary *resultDic) {
          NSLog(@"result = %@",resultDic);
      

}];}

if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權傳回authCode

[[AlipaySDK defaultService] processAuthResult:urlstandbyCallback:^(NSDictionary *resultDic) {

NSLog(@"result = %@",resultDic);
       }];
      

}

return YES;}

2. 針對Demo的運作注意

(1) 關于簽名代碼問題

  •  AliSDKDemo\Util 及下面所有檔案
  •  AliSDKDemo\openssl 及下面所有檔案

    libcrypto.a

    libssl.a

    這些檔案是為示例簽名所在用戶端本地使用。出于安全考慮,請商戶盡量把私鑰儲存在服務端,在服務端進行簽名驗簽。

    (2) 如果遇到運作後報錯,類似于以下提示資訊:

    Cannot find interface declaration for 'NSObject', superclass of 'Base64'

    那麼需要打開報錯了的檔案,增加頭檔案。
          
    #import <Foundation/Foundation.h>
          
    (3) 如果商戶要在某個檔案中使用支付寶的開發包類庫,需增加引用頭檔案。#import <AlipaySDK/AlipaySDK.h> 

(4) 點選項目名稱,點選“Build Settings”頁籤,在搜尋框中,以關鍵字“search”搜尋,對“Header Search Paths”增加頭檔案路徑:$(SRCROOT)/項目名稱。如果頭檔案資訊已增加,可不必再增加。

圖5-1 增加頭檔案資訊

(5) 點選項目名稱,點選“Build Phases”頁籤,在“Link Binary with Librarles”選項中,新增“AlipaySDK.framework”和“SystemConfiguration.framework”兩個系統庫檔案。如果商戶項目中已有這兩個庫檔案,可不必再增加。

圖5-2 增加系統庫檔案 

(6) 點選項目名稱,點選“Info”頁籤,在“URL Types”選項中,點選“+”,在“URL Schemes”中輸入“alisdkdemo”。“alisdkdemo”來自于檔案“APViewController.m”的 NSString *appScheme = @"alisdkdemo";。

圖5-3 配置 URL Schemes

3. 配置基本資訊打開“APViewController.m”檔案,對以下三個參數進行編輯

表5-1 IOS基本資訊配置

NSString *partner = @"";
NSString *seller = @"";
NSString *privateKey = @"";
      
參數 含義
partner 合作身份者ID,以 2088 開頭由 16 位純數字組成的字元串。請參考“7.1 如何獲得PID與密鑰”。
seller
支付寶收款賬号,手機号碼或郵箱格式。
      
private_key 商戶方的私鑰,pkcs8 格式。請參考“7.2 RSA密鑰生成與使用”。

4. 代碼示例運作邏輯

  1. 步驟1:  調用 order.m 裡的函數 description 将商品資訊拼接成字元串作為待簽名字元串,

    如:

  2. 步驟2:  使用類CreateRSADataSigner,調用signString簽名函數做簽名,如:
  3. 步驟3:  把簽名結果指派給參數 sign,并把 sign 加入之前的待簽名數組中,此時得到的便是要請求給支付寶的全部資料。

"partner=\"2088101568353491\"&seller_id=\"2088101568353491\"&out_trade_no=\"YR2VGG3G1I31XDZ\"&subject=\"1\"&body=\" 我 是 測 試 數 據\"&total_fee=\"0.02\"&notify_url=\"http://www.xxx.com\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&show_url=\"m.alipay.com\""

"GsSZgPloF1vn52XAItRAldwQAbzIgkDyByCxMfTZG%2FMapRoyrNIJo4U1LUGjHp6gdBZ7U8jA1kljLPqkeGv8MZigd3kH25V0UK3Jc3C94Ngxm5S%2Fz5QsNr6wnqNY9sx%2Bw6DqNdEQnnks7PKvvU0zgsynip50lAhJmflmfHvp%2Bgk%3D"

"partner=\"2088101568353491\"&seller_id=\"2088101568353491\"&out_trade_no=\"YR2VGG3G1I31XDZ\"&subject=\"1\"&body=\" 我 是 測 試 數 據\"&total_fee=\"0.02\"&notify_url=\"http://www.xxx.com\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&show_url=\"m.alipay.com\"&sign=\"GsSZgPloF1vn52XAItRAldwQAbzIgkDyByCxMfTZG%2FMapRoyrNIJo4U1LUGjHp6gdBZ7U8jA1kljLPqkeGv8MZigd3kH25V0UK3Jc3C94Ngxm5S%2Fz5QsNr6wnqNY9sx%2Bw6DqNdEQnnks7PKvvU0zgsynip50lAhJmflmfHvp%2Bgk%3D\"&sign_type=\"RSA\""

步驟4: 調用(AlipaySDK *)defaultService 類下面的支付接口函數,喚起支付寶支付頁面。

appScheme 為 app 在 info.plist 注冊的 scheme。 

圖5-4 支付寶支付頁面後面的動作全由買家在支付寶收銀台中操作完成。如果裝置中有支付寶用戶端,會

優先調用支付寶用戶端進行支付,支付完成後會重新喚起商戶 app。

步驟5: 當這筆交易被買家支付成功後支付寶收銀台上顯示該筆交易成功,并提示使用者“傳回”。此時在 APAppDelegate.m 的 -

(BOOL)application:(UIApplication )application openURL:(NSURL )urlsourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調用擷取傳回資料的代碼:

拿到傳回資料:

點取消後傳回

對其做 URLDecode

點确認後傳回

"alisdkdemo://safepay/?{"memo":{"result":"","memo":" 用 戶 中 途 取 消","ResultStatus":"6001"},"requestType":"safepay"}"

"alisdkdemo://safepay/?%7B%22memo%22:%7B%22result%22:%22partner=%5C%222088101568353491%5C%22&seller_id=%5C%222088101568353491%5C%22&out_trade_no=%5C%22QU6ZOD85K4HVQFN%5C%22&subject=%5C%221%5C%22&body=%5C%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%5C%22&total_fee=%5C%220.02%5C%22&notify_url=%5C%22http:%5C/%5C/www.xxx.com%5C%22&service=%5C%22mobile.securitypay.pay%5C%22&payment_type=%5C%221%5C%22&_input_charset=%5C%22utf-8%5C%22&it_b_pay=%5C%2230m%5C%22&show_url=%5C%22m.alipay.com%5C%22&success=%5C%22true%5C%22&sign_type=%5C%22RSA%5C%22&sign=%5C%22pg16DPA%5C/cIRg1iUFCl8lYZG54de+kfw+vCj32hGWye97isZ1A4bW6RNaDXHhZXVaI5Vk2YDxhNUl85EHRd+EL7%5C/+ogQTnsaEHl+D13PuZExIXRKGBnkYqaNV6kH6hDygnf5IOtoojHWLQyem7oRBVzB0vlF%5C/+YGFpzFHZyTVpM8=%5C%22%22,%22memo%22:%22%22,%22ResultStatus%22:%229000%22%7D,%22requestType%22:%22safepay%22%7D"

對其做 URLDecode

"alisdkdemo://safepay/?{"memo":{"result":"partner=\"2088101568353491\"&seller_id=\"2088101568353491\"&out_trade_no=\"QU6ZOD85K4HVQFN\"&subject=\"1\"&body=\" 我 是 測 試 數 據\"&total_fee=\"0.02\"&notify_url=\"http:\/\/www.xxx.com\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&show_url=\"m.alipay.com\"&success=\"true\"&sign_type=\"RSA\"&sign=\"pg16DPA\/cIRg1iUFCl8lYZG54de+kfw+vCj32hGWye97isZ1A4bW6RNaDXHhZXVaI5Vk2YDxhNUl85EHRd+EL7\/+ogQTnsaEHl+D13PuZExIXRKGBnkYqaNV6kH6hDygnf5IOtoojHWLQyem7oRBVzB0vlF\/+YGFpzFHZyTVpM8=\"","memo":"","ResultStatus":"9000"},"requestType":"safepay"}"

之後,對這些資料做處理。
      

注意:

  •  由于在跳轉支付寶用戶端支付的過程中,商戶app在背景很可能被系統kill了,是以 pay 接口的 callback 就會失效,請商戶對 standbyCallback 傳回的回調結果進行處理;
  •  同步傳回資料時,建議通過服務端的驗簽功能代碼做驗簽處理,之後再對傳回的資料做業務邏輯處理;
  •  須以伺服器異步通知的結果資料為準,并對其做業務邏輯處理。 

注意事項:1.一定要修改test中info.plist中的url 資訊,且要與自己設定的appScheme相同,否則則支付寶軟體不傳回資料且不退出支付寶,也不傳回原app

                  2.使用前先确認自己的版本是哪一個,是否是最新的

                  3.部分包需要import <Foudation/Foundation.h> 頭檔案

                  4.遇到openssl 報錯時 首先檢查build setting 中的Header   Search Paths 是否設定,然後看看自己的檔案中openssl 和util 是都放在各自的檔案夾中,若是與項目檔案放在一起,則需要将項目中"openssl/ " 删除掉,或者重新整理下openssl ,将器放在檔案夾中

               5.使用時記得對其傳回的resultStatus做處理 

      如下:

-(NSString *)dealWithResultCode

{

    int a =[self intValue];

    switch (a) {

        case 9000:

            return @"訂單支付成功";

            break;

        case 8000:

            return @"正在進行中";

            break;

        case 4000:

            return @"訂單支付失敗";

            break;

        case 6001:

            return @"使用者中途取消";

            break;

        case 6002:

            return @"網絡連接配接出錯";

            break;

        default:

            break;

    }

    return @"不能識别";

}

 以上就是我使用的見解與說明。