又有一段時間沒有經營自己的博客了,這一段有點忙啊!
在最近的一個項目中再一次用到了第三方支付,對,就是支付寶,之前的項目其實已經實現過相應的功能,那是還是在ios8的系統下,這不在iOS9下就遇到了一個問題,不回調啊,反正要梳理支付寶的嵌入,那就先說說具體的流程吧。
我使用的支付寶SDK2.0標准版,下載相應的SDK時,除了會附帶支付寶的Demo之外,還有一份文檔“移動支付接口SDK2.0標准版接入和使用規則.pdf”,我們大概分3步來總結一下:
第一步:商戶簽約和秘鑰配置;
第二步:SDK集成及xcode相關配置;
第三部:參數設置及相關調試;
接下來我們一步一步來說:
第一步:商戶簽約和秘要配置;
對於公司的業務一般是由公司申請企業支付寶賬號,同時進行簽約和相應的業務申請,這是公司該做的,作為開發者給我們的就是一組支付寶賬號和密碼,我們登錄進去可以查看簽約管理,示意圖如下(注意一下我們進入之後,查看的是支付寶-商家服務,而不是支付寶-開放平台,商家服務可以理解為你為公司的支付寶簽約的服務配置信息,而開放平台是給自己作為開發者用的,在開放平台中只能看到在商戶服務中配置的信息)
點擊查看 商戶服務->簽約管理->查看更多簽約信息,之後則需要輸入支付寶支付密碼才能看見PID和Key等內容(支付寶付費賬號是單獨設置的,和登錄密碼不一定相同,試了3遍會被鎖定的,最好事先確定一下),之後我們會看到這樣一個界面:
這個界面就是我們獲取PID和設置秘鑰的地方;
接下來就是這個秘鑰怎麼配的問題了,如上圖中所標注的,我們需要添加RSA加密的公鑰,作為支付寶的公鑰;
在我們下載的SDKDemo中有一個openssl的文件夾,其中包含了windows下的生成秘鑰的工具,我是在Mac電腦上操作的,直接在終端上敲命令就行,在根目錄下就會生成一組.pem格式的秘鑰,一個是私鑰,一個是公鑰,再用命令生成PKCS8格式的私鑰,會直接顯示在終端上,保存到一個記事本裡保存好,那現在我們手裡就有了3個秘鑰:
rsa_private_key.pem;
rsa_public_key.pem;
PKCS8編碼之後的私鑰(字符串);
其中,PKCS8編碼之後的私鑰會在app中作為參數privateKey傳入,RSA加密的公鑰就是前面我們說的要添加作為支付寶公鑰的;
好了,第一步就完成了;
第二步:SDK集成及xcode相關配置:
對於繼承的流程,文檔上有很詳盡的描述,一般我的做法就是把Demo中給的這幾個文件拖進應用:
這個order類也是從Demo中拷出來的;
在導入SDK之後,還需要在Header Search Paths增加頭文件路徑,引入支持的系統庫,Info-UIL Types中增加URL Schemes,同時還要進行ios9的適配,在Info plist文件中增加LSApplicationQueriesSchemes數組屬性,增加兩個值:alipay和alipayshare...反正就是正常做就行了;
這裡完成了上述的步驟之後,run一下,發現竟然跑不了,報錯了(是不是很郁悶!)
Undefined symbols for architecture armv7: "_OBJC_CLASS_$_UTDevice", referenced from: objc-class-ref in AlipaySDK ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)具體解決過程就不提了,在鏈接的系統庫中增加CoreMotion.framework就好了。
這下可以編譯通過了,第二步也完成了;
第三部:參數設置及相關調試:
按照Demo中的請求調用支付寶支付,我們需要若干參數:
partner:合作身份者ID,以2088開頭,也就是前面我們提到的PID;
seller:商家的支付寶收款賬號;
privateKey:還記得那個PKCS8格式的秘鑰嗎,對,就是他;
order.tradeNO:這個訂單內容編碼是最終要傳給服務端的,其中根據不同的業務需求可能會傳訂單Id,用戶Id,優惠券Id等信息,支付寶回調服務端之後,進行入庫;
order.productName:可以作為產品業務名;
order.productionDescription:可以作為產品業務描述;
order.amount:這是最重要的“錢”,千萬別算錯了,會出大問題的,別問我是怎麼知道的^_^;
order.notifyURL:這個是支付寶回調服務端的地址,找服務端要就行了;
appScheme:前面配置的URL Schemes中的字符串,寫在這就行了;
這樣參數就基本齊全了,很開心對吧,接下來就要處理回調了,需要在兩個地方處理回調:
一個是進行支付時的callback的block回調,這個是調用SDK時的回調(沒安裝應用的);
另一個是appdelegate中的這個方法中:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation添加如下代碼:
/** 9000 訂單支付成功 8000 正在處理中 4000 訂單支付失敗 6001 用戶中途取消 6002 網絡連接出錯 */ //*支付寶 //如果極簡 SDK 不可用,會跳轉支付寶錢包進行支付,需要將支付寶錢包的支付結果回傳給 SDK if ([url.host isEqualToString:@"safepay"]) { [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic]; }]; [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic]; }]; } if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權返回 authCode [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic]; }]; }這個是跳轉到支付寶應用返回當前應用的回調處理,三個判斷對應三種不同情況:其實正常的情況下只有第二個會走,第三個從url.host就可以看出來,是處理登錄授權的(其他人都有這個判斷,姑且放著吧),至於第一個判斷我記得是如果應用被干掉,也會有回調,但是鑒於我對回調的處理方式是通過通知發回發起支付的界面,所以這個判斷實際上也沒什麼意義;
在具體界面處理具體通知,根據不同的狀態碼處理就行了;
第三步也完成了,按照之前排練的進行付費,之後就等著能華麗麗的收場,結果...你錯了,竟然不回調,對,就是不回調,瞬間好心情全沒了^_^;
終端上只是孤零零的輸出了“retryHandleOpenURL”
3步都完成了,就差回調的處理了,各種搜索,最後在簡書上有個人處理了這個問題(畢竟人家是作者,把鏈接附在這了http://www.jianshu.com/p/3ce4561ae7be)
解決的方法就是在iOS9下,這個方法才是可靠的
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary把上邊的處理代碼考到這個方法中一份就可以了^_^*)options
感謝俊哥的幫助,使這篇博客成為了可能,謝謝!也希望對大家有幫助。