iOS開發之支付寶集成

項目中要用到支付功能,需要支付寶,微信,銀聯三大支付,所以打算總結一下,寫兩篇文章,方便以后的查閱, 大家在做的時候也能稍微參考下,用到的地方避免再次被坑。這是第二篇支付寶集成,第一篇銀聯支付在這里。本來要用那個ping++的神器,可以集成各種支付手段,異常的方便,但是考慮到安全性問題的話,支付的渠道還是不讓第三方參與的好,不然會不安全,于是就苦逼地慢慢的一個一個集成了。。。。這里就代理支付寶的集成過程:

剛開始以為支付寶集成還是比較簡單的,看了幾個文章,網上的各位大神也是各種秀操作,說集成很簡單,但是,真正做起來就不是那回事了, 特別是新版的1月11號更新的,我正好是這一天開始看的,網上的經驗什么的 大都是比較老的,比較新的能用到的文章不多(但是好文章還是有的,對我幫助也很大),現在我就來一步一步說一下自己集成支付寶的血淚史!

下載支付寶SDK

首先是開發包下載,還是比較難發現的,網上以前文章中的鏈接都打不開,我找了好久才找到的。最新的地址在這里(注意的是下載出來的SDK包里面并沒有傳說中的開發文檔,需要其他地方找或者看網頁上的)。
公鑰、私鑰、PID、sellerID、key這些東西的用途和獲取方式在文檔上都有詳細的說明,這里不再贅述,一定要把概念分清楚再去做,不然一會就亂了。如果遇到問題的話咱們可以再一起探討。

支付流程理解

開發文檔、開發文檔、開發文檔,重要的事情一定要說三遍!!!建議先把開發文檔仔仔細細看一遍,一定要看,本小白剛開始的時候沒有老老實實地看完,結果遇到很多很多的坑,以血和淚勸解大家,浪費的挺多的時間的,所以建議一定要好好看看,特別是交互流程這一部分

交互流程
交互流程

流程就是跟咱們平時在手機上買東西是一樣的:
1.用戶選好了商品后,點擊提交訂單(一般是這樣),選擇使用支付寶付款。
2.手機客戶端(你做的APP)把用戶選擇的商品的信息傳給你們后臺服務器。
3.后臺的服務器將各種數據拼接簽名后生成一個簽名后的字符串,回傳到客戶端APP上。
4.用戶點擊確認支付按鈕,調用手機支付寶客戶端(在你手機上裝的那個),利用后臺傳過來的那個參數調起支付寶,讓支付寶客戶端傳給他們服務器交互,進行付款。(這一步是支付寶自己完成的,安全性高)
5.支付寶的服務器將支付的結果(可能成功也可能不成功)返回給手機支付寶客戶端和你們公司的后臺服務器。
6.你們公司后臺服務器收到后一般是更新下數據信息(這個咱們不用管),手機支付寶客戶端會顯示一下支付成功,咱們的客戶端也可以顯示一個訂單支付成功之類的東西(就像在手機12306訂票,用支付寶支付后支付寶客戶端會說一次支付成功,12306也會說一次支付成功,咱們就像12306客戶端一樣,需要再說一次訂單支付成功)。

到這里就完成了支付的過程了。我覺得這個流程還是很容易理解的。
其中咱們就是商戶客戶端需要做的就是:
? 調用支付寶支付接口
? 處理支付寶返回的支付結果
支付寶文檔上的應用范例:

ps:簽名部分為了安全起見都放在了后臺,如果你們執意要在手機客戶端做簽名,不怕被攔截那就再加上一步簽名。也才三步,還是很簡單。

調用支付接口

在調用支付寶支付接口前,我們需要先生成一個訂單,文檔中描述時,是將這步也放在客戶端來做了,但這個最好是 放在服務器端來做,后臺生成訂單然后拼接,簽名,然后服務器端直接給客戶端傳一個加密簽名過的參數就可以了,這樣比較安全,官方demo上放在客戶端生成訂單并且簽名是因為沒有服務給你用啊,所以就客戶端上生成了~~~。
我做的時候,為了安全,生成訂單,拼接字符串,簽名,都是在服務器上做的,所有的訂單信息,商戶信息等都掌握在自己的手中,這樣的話APP端就不怕被攔截數據,并且調用起來也就特別簡單了,只需要調用支付的接口,打開支付寶APP客戶端進行支付就行了,沒有用戶的手機上沒有安裝支付寶客戶端的話會調用網頁來支付,也是一樣的。
如果只需要發送訂單和處理支付返回結果,只需要添加AlipaySDK.bundle和AlipaySDK.framework這兩個就行了,下載的SDK中很容易發現。
快捷支付方法是這個:

-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;

在支付的按鈕中,試用支付寶這個類,再調用這個方法就行啦!如下如:

調用這個方法

在調用支付寶接口的時候,我們需要兩個參數,orderStringAPPScheme, APPScheme是app在info.plist注冊的scheme。
orderstring 這個是一個訂單的字符串,由后臺拼接生成的,還需要簽名的。例如:
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_bpay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA".

流程就這么簡單,接下來是集成SDK的時間,這部分很坑,因為是我們是商品的數據簽名什么的都在后臺做的,所以客戶端做的時候遇到的坑就不多說了,可以參考這篇文章,基本上遇到的坑都能找到。
還有這篇是有人對這個進行的一個簡單的封裝,如果簽名,數據部分需要在APP上做的話,可以直接用這個,封裝很簡單,也是加了個類目進行做出來的,實現很簡單。大家可以參考一下。

支付寶的SDK給了一個處理返回結果的方法,就是那個openURL的那個,在demo的appdelegate里面有。

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

關于簽名(主要是在客戶端簽名時候注意的)

支付寶上要用那個RSA,這是個算法,所以為了方便,可以使用第三方的方法,或者找demo上的代碼粘貼上去!不過還是那句話,為了安全,最好還是后臺的做,不怕被攔截了 。
簽名的時候,涉及到了RSA公鑰、私鑰的生產,RSA的簽名、驗證簽名,SHA1值的計算,base64和URL編碼等等等等煩人的東西,估計支付的程序猿也不想麻煩,就用了一個開源的代碼來統一解決這些問題,就是openssl這個文件夾。
如果你執意要在客戶端上簽名(前面說過,并不安全),也可以用demo中的openssl這個文件夾,那你需要導入這幾個文件夾:DEMO中的openssl目錄頭文件,兩個庫文件libcrypto.a libssl.a,DEMO里支付寶自己寫的Util目錄,如下圖:


用到的文件

支付寶文檔上的集成流程詳解,寫的很詳細了,一般遇到的問題都有提到。

推薦幾篇好文章,可以參考下,減少點坑(1、4、5務必看看,很有啟發的):
1.集成支付寶錢包支付iOS SDK的方法與經驗
2.IOS集成到支付寶的步驟及問題
3.這個也是遇到的一些問題和解決方法
4.iOS應用之支付寶集成總結
5.iOS 集成支付寶


這篇文章是在客戶端做簽名的,寫的也很詳細


今天又遇到個問題:調起了支付寶客戶端,但是支付不了。


支付失敗

這個是因為,如果訂單來自服務器此錯誤表示后臺返回的簽名訂單含有特殊字符 ,需要編碼。
由于RSA簽名機制每次生成的簽名都不一樣,也就是是二進制數,后臺返回簽名的訂單時,是基于base64位編碼的 。可能基于base64位編碼生成帶有+=/等在url序列中不被允許的字符。當我們拿著后臺不進行特殊字符處理的訂單作為參數去調用支付寶的接口時,便會出現由于支付寶客戶端吊起支付寶服務器是URL有問題,導致錯誤ALI64 。
解決辦法是 讓后臺處理一下參數中的特殊字符,具體的這里有示例.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容