集成支付寶錢包支付iOS SDK的方法與經驗

下載

首先,你要想找到這個SDK,都得費點功夫。現在的SDK改名叫移動支付集成開發包了。

https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash

Baidu和Googlep排在前面的支付寶開放平臺,里面的SDK已經是2年前的版本了,而且還不支持64位架構。

文檔

?

壓縮包里有兩個相關文檔 :

《支付寶錢包支付接口開發包2.0標準版.pdf》

《支付寶錢包支付接口開發包2.0標準版接入與使用規則.pdf》

iOS相關內容可以主要看第一個文檔,第二個文檔名字和里面寫的不一樣,內容其實是個附錄;文檔里面多個平臺都涉及到了,內容有些雜亂。下面先解釋下整體SDK的流程和要做的事,就好對癥下藥找文檔內相應的內容了。

流程

摘自第一個文檔《支付寶錢包支付接口開發包2.0標準版.pdf》

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

  • 調用支付寶支付接口

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

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

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

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

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

其實對于業務來說,這些步驟已經夠了,但是有一個安全性問題,你肯定不希望你接收到的支付結果被截獲修改,所以,這就需要在生成訂單和處理支付結果的時候做一個安全性校驗:

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

RSA加密算法 除了可加解密外,還可用來作簽名校驗。
簡單的說,RSA會生成一個私鑰和一個公鑰,私鑰你應該獨自保管,公鑰你可以分發出去。
做簽名驗證時,你可以用私鑰對需要傳輸的數據做簽名加密,生成一個簽名值,之后分發數據,接收方通過公鑰對簽名值做校驗,如果一致則認為數據無篡改。

具體到支付寶使用RSA做簽名驗證,就是在生產訂單時,需要使用私鑰生成簽名值;在處理返回的支付結果時,需要使用公鑰驗證返回結果是否被篡改了。

具體需要對哪些值,怎樣生成簽名,對哪些值最簽名驗證,可以在第一個文檔中找找,后面我會簡單提一下,但還是以文檔或實踐為準吧。

集成

清楚了流程后,就好理解怎么集成了。

支付SDK

如果只需要發送訂單和處理支付返回結果,只需要添加AlipaySDK.bundle和AlipaySDK.framework就行了。

這里再吐槽下,之前用的舊版本,和現在的版本相比,還不光是把類名字給改了,原先是用的類方法,現在新版又給改成了單例了。。還真是任性啊,這要是哪家小廠的SDK,估計早被棄用了把。。

發送訂單的方法:

- (void)payOrder:(NSString *)orderStrfromScheme:(NSString *)schemeStrcallback:(CompletionBlock)completionBlock;
  • 如果手機內沒安裝支付寶的app,會直接展現支付寶web支付界面,通過callback返回支付結果;

  • 如果手機內安裝了支付寶的app,會跳轉到支付寶的app支付,然后通過openURL的回調返回支付結果。

支付寶的SDK只給了一個處理返回結果的方法,而不像其他第三方的SDK提供一個處理openURL的方法,所以你需要通過DEMO或者在第二個文檔里找到處理openURL的方式:

 ? ?if ([url.host isEqualToString:@"safepay"]) {[[AlipaySDK defaultService] processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}]; }

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

- (void)processOrderWithPaymentResult:(NSURL *)resultUrlstandbyCallback:(CompletionBlock)completionBlock;

兩個回調block都統一定義為typedef void(^CompletionBlock)(NSDictionary *resultDic);,

返回了一個字典,但是SDK里完全沒有提示有哪些key。。

你可以在文檔里找到,或者自己實際試一下,返回的信息如下:

  • resultStatus,狀態碼,SDK里沒對應信息,第一個文檔里有提到:

     ?9000 訂單支付成功8000 正在處理中4000 訂單支付失敗6001 用戶中途取消6002 網絡連接出錯
  • memo, 提示信息,比如狀態碼為6001時,memo就是“用戶中途取消”。但千萬別完全依賴這個信息,如果未安裝支付寶app,采用網頁支付時,取消時狀態碼是6001,但這個memo是空的。。(當我發現這個問題的時候,我就決定,對于這么不靠譜的SDK,還是盡量靠自己吧。。)

  • result,訂單信息,以及簽名驗證信息。如果你不想做簽名驗證,那這個字段可以忽略了。。

如果你對支付的安全性不那么在意或重視的話,到這里就可以完成支付寶的集成了。

如果想更加安全,還是需要增加下面的簽名驗證的。

簽名驗證

首先,RSA只是一種算法,所以你可以使用任何一種開源的、或者自己去實現這個算法來實現簽名和驗證的目的。

在整個流程當中,因為涉及到了RSA公鑰、私鑰的生產,RSA的簽名、驗證簽名,SHA1值的計算,base64和URL編碼,所以支付寶用了一個開源的代碼來統一解決這些問題,就是openssl(順便再吐槽下,這DEMO里一放openssl,不知道又會引來多少公司的產品里使用openssl了,估計阿里自己也沒少用,什么時候都能跟老羅、華為一樣去贊助點呢。。)

如果你想省事,也用openssl,那你需要把這些東西都加入到項目中:DEMO中的openssl目錄頭文件,兩個庫文件libcrypto.a libssl.a,DEMO里支付寶自己寫的Util目錄

訂單簽名

上面說了,訂單簽名應該用私鑰,但是把私鑰放到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="測試"&body="測試測試"&total_fee="0.01"&notify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&success="true"
&sign_type="RSA"
&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZ gSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="

總共分為三個部分

  • 第一部分是訂單信息,每個字段的具體含義可以在文檔里找;

  • 中間sign_type是簽名用的算法,文檔里說了,目前只支持RSA;

  • 最后的sign就是簽名值。

驗證的步驟如下:

  • 首先把訂單信息和簽名值分別提取出來(SDK居然都不給處理好。。)

     ?訂單信息就是sign_type的連字符&之前的所有字符串簽名值是sign后面雙引號內的內容,注意簽名的結尾也是=,所以不要用split字符串的方式提取
  • 如果你想簡單,可以直接使用Util目錄下的DataVerifier來作簽名驗證

     ?- (BOOL)verifyString:(NSString *)string withSign:(NSString *)signString;第一個參數就是訂單信息,第二個參數就是簽名值。

其實不使用openssl,用其他第三方RSA的開源代碼也是可以的。可以看下DEMO里openssl_wrapper的源碼和SDK的文檔。

  • 對于訂單信息,先做一個base64編碼(DEMO中這個還要調openssl來實現。。),再計算SHA1的值(這個也可以完全不用openssl,蘋果的庫中都有的。。),然后再簽名比對。

  • 對于公鑰,如果使用其他第三方代碼,需要注意格式問題。支付寶的DEMO實現中,是把這個公鑰又轉回成openssl生成的本地文件格式,然后再寫入本地文件,再讓openssl讀取出來使用。。

以上,就是支付寶 iOS SDK的一些介紹。

總體來說,我覺得能靠自己處理的地方還是盡量不要依賴這個不太靠譜的SDK了。

?

轉載于:https://www.cnblogs.com/fengmin/p/5979419.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zabbix 監控項自動發現過濾_【Zabbix監控教程】LLD低級別自動發現配置教程

低級別自動發現簡稱LLD,使用低級別自動發現可以實現根據Agent的實際情況去自動創建監控項,適用于配置不一的環境。比如A主機有3塊硬盤,B主機有5塊硬盤,如果不使用LLD的話就需要人肉去為每個硬盤創建監控項。而有了LLD就可以實現自…

Spring Boot單元測試報錯java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]

一:運行test類方法時候報錯 報錯 java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify BootstrapWiths value attribute or make the default bootstrapper class available.at org.springframework.test.context.BootstrapU…

PHP底層原理分析和底層擴展編寫

運行原理 http://www.phpchina.com/article-40203-1.htmlPHP底層開發 可以理解為就是C的開發,那么簡單地說如果我們要查看某個PHP函數的底層實現怎么看呢?需要PHP源碼包:http://www.php.net/downloads.php主要目錄是Zend 和ext(寫擴展的目錄…

硬件知識:DP接口和HDMI接口對比,看完你就懂了

目錄 一、DP接口 二、HDMI接口 三、總結 電腦顯示器高清傳輸通過會用到兩個接口,就是DP接口和HDMI接口,今天電腦學習小編帶大家對比一下這兩個接口。 一、DP接口 DisplayPort縮寫DP,是一個由PC及芯片制造商聯盟開發,視頻電子標準協…

文治者必有武備不然長大了挨欺負_【博古齋·六月春拍】人文事者必有武備

原標題:【博古齋六月春拍】人文事者必有武備上海博古齋 2017年春季藝術品拍賣會6月24日 中國書畫 文房雅玩6月25日 古籍善本文獻資料上海大劇院八樓宴會廳(上海市黃陂北路200號A1門入口)圖錄已寄出,請各位藏友注意查收人文事者必有武備LOT 1649 武備志二…

@Transactional 使用

1 .添加位置 1)接口實現類或接口實現方法上,而不是接口類中。 2)訪問權限:public 的方法才起作用。Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。 系統設計:將標簽放…

SpringBoot集成JPA用法筆記

今天給大家整理SpringBoot集成JPA用法。希望對大家能有所幫助!搭建SpringBoot項目新建配置文件 application.ymlserver: port: 8090 spring: #通用的數據源配置datasource: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useSSLf…

【轉】有的共享軟件賺了一百萬美元,而為什么你沒有?我的軟件推廣成功之路...

有的共享軟件賺了一百萬美元,而為什么你沒有? 轉自:http://blog.csdn.net/wangjiwei2010/article/details/1267044 譯:DreamGoal 原作:Steve Pavlin 幾個月以前,我決定對共享軟件業進行一項非正式的長期研…

vue全局引入openlayers_vue中使用OpenLayers(一):引入谷歌地圖

vue中使用OpenLayers(一):引入谷歌地圖第一步npm install olpackage.json 中可以看到第二步引入import "ol/ol.css";import Map from "ol/Map";import Feature from "ol/Feature";import View from "ol/View";import XYZ f…

顯示器知識:分辨率1080P、2K、4K、8K相關知識介紹,看完你就懂了

現在各種電視和顯示器都會出現4K、高清等字樣。4K到底意味著什么呢? 它比超高清(Ultra HD)的像素還要多嗎? 如果4K是1080p的四倍,那是否意味著4K就等于4320p? 以上三個問題按順序回答:視情況而定;有時候是這…

c++大文本比較_Excel – 將文本轉換為數值,第二種方法會的請舉左手

工作中經常收到的數據是從系統直接導出的,有的數據看上去是數字,其實是文本格式。這種數字在 Excel 看來就是個文本,無法參與任何計算分析。所以首先就要把它們轉換成真正的數值。案例:下圖 1 中的 B、C 列均為文本格式&#xff0…

網絡知識:整理各種路由器組網方法!網跨段也能訪問

很多朋友問到,針對不同網段的兩個電腦設備如何實現通信?這個通常在企業辦公中會遇到,我們經常會遇到企業隨著員工或部門的增多,增加了一個路由器,分了兩個網段,A子網和B子網就處于不同網段,當網…

bootstrap.yml與application.properties區別?

1. bootstrap.yml先于application.properties被加載。 2. bootstrap.yml被Spring ApplicationContext的父類加載,這個類先于加載application.yml的ApplicatonContext啟動。

hsv 明度的范圍_色彩空間中的 HSL、HSV、HSB 有什么區別?

首先, HSB 和 HSV 是同一個東西,只是名稱不同,本文后面僅使用 HSB,當提到它的時候,也代表 HSV。HSB 和 HSL 在字面意思上是一樣的:H 指的是色相(Hue),就是顏色名稱,例如“紅色”、“…

Java技術:serialVersionUID作用介紹

serialVersionUID概念介紹英文翻譯的意思是序列化版本號。凡是實現Serializable接口的類都會有一個表示序列化版本標識符的靜態變量。serialVersionUID的生成方式默認的1L:比如:private static final long serialVersionUID 1L; 。根據類名、接口名、成…

服務雪崩

假設存在如下調用鏈 而此時,Service A的流量波動很大,流量經常會突然性增加!那么在這種情況下,就算Service A能扛得住請求,Service B和Service C未必能扛得住這突發的請求。 此時,如果Service C因為抗不住…

華為的型號命名規則_華為交換機s2700系列命名規則

華為交換機s2700系列命名規則華為交換機s2700系列命名規則上一篇我們聊到S2700系列機型的命名規則方法。基于要滿足不同用戶的市場需求,S2700系列提供了多款機型。咱們就以S2700-26TP-PWR-EI、S2710-52P-SI-AC、S2700-52P-EI-AC以及S2700-9TP-SI為模板來講解S2700系…

電腦技巧:Win10操作系統關閉這幾個功能,可以大幅度提升電腦的運行速度

目錄 一、禁用Cortana語音助手 二、關閉onedrive自動同步服務 三、關閉微軟自帶的Windows Search服務 四、關閉windows自動更新 五、清理緩存文件 六、減少不必要開機啟動項 今天小編給大家介紹一下Win10操作系統需要關閉的幾個功能,能讓你的電腦飛速運轉&#xff0…