這幾天在做新版本需求,因?yàn)轫?xiàng)目是面向國(guó)際市場(chǎng)的,隱藏涉及到的支付問(wèn)題,產(chǎn)品除了國(guó)內(nèi)周知的支付寶、微信、銀聯(lián)、apple pay這幾個(gè)主要支付手段之后,為了國(guó)外用戶方便,新需求接入了信用卡支付。關(guān)于信用卡支付的方式,我們產(chǎn)品對(duì)接iPayLinks,具體你可以去搜索,官網(wǎng)查看。
關(guān)于iPayLinks的申請(qǐng)過(guò)程,不在技術(shù)討論范圍,這讓你們公司產(chǎn)品去處理,我們只要知道申請(qǐng)的結(jié)果,比如開發(fā)文檔,實(shí)例demo等。
我從產(chǎn)品那里獲取到的有下面開發(fā)文件:
這里有需要iOS客戶端開發(fā)用到的就
《iPayLinks商戶API收單接口規(guī)范v1.1虛擬商品》.pdf
ios app設(shè)備指紋獲取示例.zip
iPayLinks聯(lián)調(diào)環(huán)境測(cè)試卡.txt
iPayLinks信用卡,它沒(méi)有提供主要的SDK來(lái)調(diào)用,唯一的一個(gè)ios app設(shè)備指紋獲取示例.zip是用來(lái)生成一個(gè)必填的參數(shù),具體可以查看《iPayLinks商戶API收單接口規(guī)范v1.1虛擬商品》.pdf文檔中的API下單接口的提交參數(shù)說(shuō)明。
這里因?yàn)樯婕暗劫Y金方面的安全問(wèn)題,提交參數(shù)里面涉及到API key之列的需要主要參數(shù)都放在后端,客戶端這里只是生產(chǎn)一些商品訂單相關(guān)的參數(shù),提交給后端,后端統(tǒng)一去調(diào)用支付接口,在返回支付信息回調(diào)給客戶端。
總的來(lái)說(shuō)真?zhèn)€支付流程沒(méi)有什么太大的難道,跟著流程來(lái)就行。但是我在獲取需要提交的參數(shù)時(shí)候,碰到一個(gè)坑,問(wèn)題就出在設(shè)備指紋ID這個(gè)參數(shù)的獲取上,讓我坑了一回兒。
這個(gè)參數(shù)需要把訂單號(hào)通過(guò)它提供的ios app設(shè)備指紋獲取示例.zip的Demo里面的SDK去處理請(qǐng)求生成。
主要的請(qǐng)求生成代碼如下:
THMTrustDefender是一個(gè)單例,通過(guò)configure方法來(lái)進(jìn)行初始化的配置。這里的NSDictionary內(nèi)容跟著demo來(lái)就行。
/*!
* Configure the shared instance of TrustDefenderMobile object with the supplied configuration dictionary.
* @code
* [THM configure:@{ THMOrgID: @"my orgid" }];
* @endcode
*
* @return The result of the configuration call.
*
* @remark This method only run once and any following calls to it has no effect.
*/-(BOOL) configure:(NSDictionary *)config;
這里的profileComplete是它的生成指紋識(shí)別id的代理回調(diào)方法。
/*!
* Once profiling is complete, this method is called.
*
* @param profileResults describes the profiling status
*/-(void) profileComplete: (NSDictionary *) profileResults;
到這里的話,跟著demo來(lái)就能生成需要的參數(shù)了(補(bǔ)充,這里還有個(gè)坑爹的地方,文檔沒(méi)有說(shuō)清楚,這里需要的設(shè)備指紋id其實(shí)是要跟訂單id一樣的,所有這里返回的profileResults里面的那個(gè)session_id并不是設(shè)備指紋id,而且這個(gè)請(qǐng)求生成過(guò)程只是一個(gè)驗(yàn)證過(guò)程,只要能成功就行,回調(diào)的信息并不是需要的參數(shù)),但是問(wèn)題就坑在這里的THMDelegate。因?yàn)門HMTrustDefender是一個(gè)單例,然后代理又是當(dāng)前的頁(yè)面控制器對(duì)象。這就出現(xiàn)一個(gè)問(wèn)題,當(dāng)我支付結(jié)束退出這個(gè)界面,然后再繼續(xù)生成新的一個(gè)訂單,又會(huì)來(lái)這個(gè)支付選擇界面,然后在生成設(shè)備指紋id的時(shí)候,回調(diào)一直沒(méi)有進(jìn)入,問(wèn)題就是因?yàn)門HMTrustDefender是一個(gè)單例,可能之前的第一次持有了這個(gè)界面控制器,導(dǎo)致回調(diào)不會(huì)對(duì)新進(jìn)入的界面控制器有反應(yīng)。
然后我想了一下,看了下THMTrustDefender,還好它有一個(gè)block回調(diào),不用THMDelegate采用block的話,就不受單例問(wèn)題影響了。
然后還有一個(gè)解決辦法,只要這指定THMDelegate不是當(dāng)前的界面控制器就行,你可以生產(chǎn)一個(gè)單例類單獨(dú)處理設(shè)備指紋識(shí)別,在回調(diào)給當(dāng)前界面就行。