你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 在iOS9上調用支付寶不回調的問題解決,以及支付寶嵌入的流程梳理

在iOS9上調用支付寶不回調的問題解決,以及支付寶嵌入的流程梳理

編輯:IOS開發綜合

又有一段時間沒有經營自己的博客了,這一段有點忙啊!

在最近的一個項目中再一次用到了第三方支付,對,就是支付寶,之前的項目其實已經實現過相應的功能,那是還是在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 
把上邊的處理代碼考到這個方法中一份就可以了^_^

感謝俊哥的幫助,使這篇博客成為了可能,謝謝!也希望對大家有幫助。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved