iOS 支付寶集成

使用支付寶進行一個完整的支付功能大概需要以下幾個步驟:

1.向支付寶申請,與支付寶簽約,獲得商戶ID (partner) 和賬號ID (seller)

2.下載相應的公鑰私鑰文件(加密簽名使用)

3.下載支付寶的SDK

4.生成訂單信息,簽名加密

5.調用支付寶客戶端,由支付寶客戶端跟支付寶完全服務器打交道

6.支付完畢後,支付寶客戶端會跳回到原來的應用程序

7.在原來的應用程序中顯示支付結果給用戶看


首先是下載SDK (https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash)

圖中的商戶客戶端就是我們iOS 客戶端需要做的事情:

*調用支付寶支付接口

*處理支付寶返回的支付結果

在調用支付寶支付接口前,我們還需要先生成一個訂單,文檔中描述時,是將這步放在客戶端做了,但也可以在服務器端生成這個訂單(圖中支付寶會在支付成功後通知服務器端,所以在服務器端生成訂單的話,可以掌握所有的訂單,而且也會更加的安全):

*生成訂單(可以在iOS 客戶端內生成,也可以在服務器端生成)

*調用支付寶支付接口,發送訂單

*處理支付寶返回的支付結果

業務大致就是這樣的,但是還有一個安全性的問題,你肯定不希望接收到的支付結果被截取修改,所以需要生成訂單和處理支付結果的時候做一個安全性的校驗:

生成訂單時對數據簽名,收到支付結果時對數據進行簽名驗證,以校驗數據是否被篡改過。支付寶目前只支持採用RSA 加密方式做簽名驗證。

注:RSA 加密算法除了可加解密外,還可以用來作爲簽名校驗,簡單的說就是RSA 會生成一個私鑰和一個公鑰,私鑰應該改由我們獨立保管,公鑰分發出去,做簽名驗證時,可以用私鑰對需要傳輸的數據做簽名加密,生成一個簽名值,之後分發數據,接收方通過公鑰對簽名值做校驗,如果一致則認爲數據沒有篡改。具體到支付寶使用RSA 做簽名驗證,就是在生成訂單的時候,需要使用私鑰生成簽名值,在處理返回的支付結果時,需要使用公鑰驗證返回的結果是否被篡改。具體對哪些值,怎樣生成簽名,對哪些值做簽名驗證文檔中都有。

//0:導入框架及資源包
//1:生成訂單信息  -> Order
//2:配置URLScheme
//3:簽名 --> 兩個文件夾 / 兩個.a文件 / 增加Foundation頭文件 / 配置搜索頭文件的路徑$(PROJECT_DIR)/Alipay / 增加框架
//4:使用支付寶支付
//5:處理回調信息 >1.在當前的頁面中處理一次  2. 在AppDeleagte中配置一次
- (void)btnClick:(UIButton *)button {
    //1.生成訂單信息
    Order *order = [[Order alloc] init];
    /*
     *商戶的唯一的parnter和seller。
     *簽約後,支付寶會爲每個商戶分配一個唯一的 parnter 和 seller。
     */
    //合夥人
    order.partner = PartnerID;
    //賣家
    order.seller = SellerID;
    //商品號
    order.tradeNO = @"123456";
    //商品名
    order.productName = @"商品名稱";
    //商品描述
    order.productDescription = @"上平描述";
    //商品價格
    order.amount = @"0.01";
    order.notifyURL = @"http://www.baidu.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 = @"zhifuTest";
    //將商品信息拼接成字符串
    NSString *ordeSpec = [order description];
    
     //2. 簽名
    //獲取私鑰並將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循 RSA 簽名規範, 並將簽名字符串 base64 編碼和 UrlEncode
    //使用私鑰簽名
    id<DataSigner> signer = CreateRSADataSigner(PartnerPrivKey);
    //簽名訂單描述
    NSString *signedString = [signer signString:ordeSpec];
    //將簽名成功字符串格式化爲訂單字符串,請嚴格按照該格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",ordeSpec,signedString,@"RSA"];
        
    }
     //3. 支付成功的回調 --> 在當前程序中完成付款的回調 
     [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
        
        NSLog(@"支付寶測試");
        
        NSLog(@"restlut = %@",resultDic);
    }];

}
//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) {
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}
resultStatus,狀態碼,SDK裏沒對應信息,第一個文檔裏有提到:
9000 訂單支付成功
8000 正在處理中
4000 訂單支付失敗
6001 用戶中途取消

6002 網絡連接出錯

上面說了,訂單簽名應該用私鑰,但是把私鑰放到app裏其實本身就不安全,因爲你的app是分發到用戶手裏的,私鑰應該放在自己的手裏,分發出去的應該是公鑰。
所以私鑰最好是放在自己的服務器上,訂單加密這個工作放在服務器端來做,服務器將包含簽名的訂單信息返回給app,app再通過SDK發送給支付寶,這樣會更安全些;而且服務器也能掌握所有的訂單狀況。
如果你非要將私鑰集成到app裏,那可以參考SDK的DEMO,因爲這個DEMO就是在app本地通過私鑰做的訂單簽名。

參考文章:http://www.jianshu.com/p/fe56e122663e


發佈了84 篇原創文章 · 獲贊 23 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章