支付寶支付

下載:
https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1web

文檔:
壓縮包裏應該有兩個壓縮文檔
<支付寶錢包支付接口開發包2.0標準版>
<支付寶錢包支付接口開發包2.0標準版接入與使用規則>
iOS 相關內容能夠直接看第一個文檔,第二個文檔名字和裏面寫的不同,內容實際上是一個附錄;
文檔裏面多個平臺都涉及到了,內容有些雜亂。算法

下面我用幾幅圖來給你們展現一下客戶端調起支付的過程:安全

1.買家在手機應用中購買商品或者是服務
服務器

2.買家選擇支付方式
網絡

3.進入支付寶收銀臺進行付款
app

4.支付成功
工具

5.交易完成,買家能夠查看交易信息
加密

在調用支付以前,將商品數據信息生成待簽名的字符串,信息包括:url

{code

}

如何聲明密鑰請看文檔:

http://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docType=1

1.安裝OpenSSL工具

2.RSA私鑰及公鑰生成

RSA加密算法除了能夠加解密外,還能夠用來作簽名校驗。簡單的說,RSA會生成一個私鑰和一個公鑰,私鑰你應該獨自保管,公鑰你能夠分發出去。作簽名驗證時,你能夠用私鑰對須要傳輸的數據作簽名加密,生成一個簽名值,以後分發數據,接收方經過公鑰對簽名值作校驗,若是一致則認爲數據無篡改.

具體到支付寶使用RSA作簽名驗證,就是在生產訂單的時候,須要使用私鑰生成簽名值;在處理返回的支付結果時,須要使用公鑰驗證返回結果是否被篡改了。具體須要對哪些值,怎麼樣生成簽名,對哪些值作簽名驗證,能夠在第一個文檔中找找,後面我會簡單提一下,但仍是以文檔或實踐爲準吧。

訂單簽名:

上面說了,訂單簽名應該使用私鑰,可是把私鑰放在app裏實際上是不安全的,由於你的app是分發到用戶手裏的,私鑰應該放在你的手裏,分發出去的應該是公鑰。因此私鑰最好是放在本身的服務器上,訂單加密這個工做放在服務器來作,服務器將包含簽名的訂單信息返回給app,app再經過SDK發送給支付寶,這樣會更安全一些;並且服務器也能掌握全部的訂單情況。

若是你非要將私鑰集成到app裏,那能夠參考SDK的demo,由於這個demo就是在app本地經過私鑰作的訂單簽名。

支付結果簽名驗證

上面的回調block提到了返回的內容,返回的支付結果中的result字段裏是帶有訂單信息和簽名信息的,因此簽名驗證就是須要這個字段的值。
文檔中有一個這個字段的例子,實際結果沒有換行,我換一行便於閱讀:

partner=」2088101568358171」&seller_id=」xxx@alipay.com」&out_trade_no=」0819145412-6177」&subject= &sign_type=」RSA」 &sign=」hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE」

這個簽名當中分爲三部分

第一部分是訂單信息,每一個字段的具體含義能夠再文檔裏找;
中間sign_type 是簽名所用的算法,文檔中提到,目前只是支持RSA;
最後的sign就是簽名值。

驗證的步驟以下:

首先把訂單信息和簽名值分別提取出來(SDK中並無給進行處理)

訂單信息就是sign_type的連字符&以前的全部字符串

簽名值是sign後面雙引導的內容,注意簽名的結尾也是 = ,因此不要用split字符串的方法提取

支付SDK

若是隻須要發送訂單和處理支付返回結果,只須要添加AlipaySDK.bundle 和 Alipay.framework 就好了。

發送訂單的方法:

  • (void)payOrder:(NSString )orderStr fromScheme:(NSString )schemeStr
    callback:(CompletionBlock)completionBlock

此時須要注意:

若是手機內沒有安裝支付寶的app,會直接展示支付寶web支付頁面,經過callback返回支付結果;

若是手機內安裝了支付寶的app,會跳轉到支付寶的app支付,而後經過openUrl的回調返回支付結果.

支付寶的SDK只給了一個處理返回結果的方法,而不會像其餘的第三方SDK提供一個處理openUrl的方法,因此你須要經過demo或者在第二個文檔裏找處處理openUrl的方式:

if ([url.host isEqualToString:@」safepay」]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
}]; }

SDK也提供了一個處理openUrl返回結果的方法

  • (void)processOrderWithPaymentResult:(NSURL *)resultUrl standbyCallback:(CompletionBlock)completionBlock;

兩個回調block都統必定義爲typedef void(^CompletionBlock)(NSDictionary *resultDic);
返回了一個字典,可是SDK裏徹底沒有提示有哪些Key.

咱們來看一下resultStatus 狀態碼分別代碼什麼意思,這個是在文檔中沒有的

9000 訂單支付成功

8000 正在處理中

4000 訂單支付失敗

6001 用戶中途取消

6002 網絡鏈接出錯

memo 提示信息, 好比說狀態碼爲 6001時,memo就是「用戶中途取消的意思」,可是咱們在開發中絕對不能依賴於這個信息,若是未安裝支付寶的app,採用網頁支付時,取消時狀態碼是 6001,但這個memo是空的。

result 訂單信息,以及簽名驗證信息.若是你不想作簽名驗證,這個字段能夠忽略不計了。

相關文章
相關標籤/搜索