曾經做過支付模塊,當時只是考慮了正流程,其他的也沒有太多的考慮,感覺支付也挺簡單的。然而,最近在項目中,全面負責支付這一模塊,瞬間覺得自己曾經思維是多么的不縝密。廢話就不多說了。邊寫邊整理一下這塊邏輯實現。
前提1:支付方式 1.支付寶支付 2.余額支付
前提2:支付返回結果,不以支付寶同步返回結果為準,是以本地服務器為基準的。
前提3:在沒有安裝支付寶的前提下,余額支付與支付寶支付操作方式一樣。
基礎工作1:判斷是否安裝了支付寶APP
當存在支付寶支付方式時,我們需要做的第一件事情就是需要判斷手機是否安裝了支付寶APP。雖然在你拿著支付串去調用支付寶的時候,支付寶自己會識別,但是你自己程序內的邏輯也需要進行判斷,后面寫到的細節會解釋這塊內容。
如何判斷你手機內是否安裝了支付寶APP,見下面代碼:
同時,還需要再plist進行配置白名單,否則iOS9以上這個判斷無效。
基礎工作2:注冊監聽home鍵是否進入前臺。后面寫到的細節會解釋這塊內容。
創建訂單的過程就不說了,直接從拿著p++的訂單NSData串去調支付寶開始。
支付寶支付:
1.手機安裝了支付寶APP時:
(1)調起支付寶時,對于我們自己的APP來說,相當于執行了home鍵。我們的應用進入后臺,支付寶應用進入前臺。此時為了避免重復下單,需要記錄我們APP的支付頁面此時執行到流程的哪一步了。
(2)進入支付寶頁面,我們可能會有4種操作方式。
A:對于iOS9以上系統來說,我們直接點擊左上角返回鍵,直接返回我們自己的應用。
這種情況下返回我們的應用,是不走我們生命周期函數的。也不會走支付寶同步回調的那個方法的,此時是沒有完成支付的。
存在的問題:
如果我們前期不記錄離開我們自己應用時的執行狀態,此時再次點擊支付按鈕,就是重復創建訂單重復獲取p++串,重復調用sdk了。這顯然不是我們想要的結果。
解決方法:
a.在執行下面這段代碼調起支付寶之前,先記錄上次離開APP時這個界面執行到哪一步了,(到這里,應該是執行到獲取p++串進行調用支付寶sdk這個流程了)
b.返回到我們應用時,我們使用home鍵監聽,再監聽的方法里去請求后臺服務器是否支付成功。也就是支付查詢結果協議。當然此時后臺肯定會告訴你支付沒有成功,后續處理方式因需求而異了。比如,重試,直接再次調起支付寶。
c.這里仍然需要注意一個小小的細節就是,home鍵監聽稍微慢了些,也就是說先返回我們應用,之后也就是1s左右,home鍵監聽的方法才執行,此時頁面支付按鈕仍然是可點擊的,為了防止他點擊,我們仍然可以在記錄上次頁面流程執行到哪一步的地方同時將頁面可點擊狀態設置為不可點擊,等到請求回支付查詢結果協議后,變成可點擊狀態。這個處理也是因需求而異了。
B:我們點擊取消,返回我們自己的應用
當我們在支付寶中點擊取消,此時支付寶會同步回調到我們的應用中,告訴我們支付失敗,這里需要注意一個細節。
a.我們的應用先執行回調方法,后home鍵監聽的方法才執行,這個時候產生問題
存在問題:
在回調方法里會查詢一次支付結果請求,在home鍵監聽方法里也會查詢一次支付結果請求。這樣顯然不合理。也會影響后續的操作。
解決方法: 【我的這種解決方法不是最優啦。】
因為調起支付寶進行支付,后續可能存在多種情況返回我們自己的應用,方便統一且不容易出錯,在手機安裝了支付寶APP應用的前提下,不管哪種方式返回我們自己的應用,都已home鍵監聽為主,進行查詢支付結果。這樣就避免查詢2次的可能。如果不以home鍵監聽為主的話,我們會先請求支付查詢結果,后由支付寶再打開我的APP。如果查詢結果很快,當查詢結果這個協議后續還有其他邏輯,比如延遲返回上一頁,這時就會產生時間問題。比如支付寶打開我們的APP慢了些,導致支付寶返回我們APP直接返回到支付頁面的上一頁了
【有看我文章的小伙伴們,幫我一下,怎么實現,同步線程中,執行2個延時方法。也就是說,讓2個延時方法同步執行。我目前測試得到的結果是,同步線程中,存在2個延遲執行的方法,他們兩個并不是同步執行。也就是說存在同步線程異步執行的問題。】
C:我們點擊home鍵,將支付寶應用掛起,此時重新點擊我們自己的應用切換到前臺。
重新點擊我們的應用進入前臺,此時是不走支付頁面的生命周期函數的。
存在問題:與A一樣
解決方法:與A一樣
D:我們正常支付,支付成功或者失敗后,自動返回我們自己的應用。
存在問題:與B一樣。
解決方法:與B一樣。
2.手機沒有安裝支付寶及采用余額支付時
手機沒有安裝支付寶,當我們拿著支付寶串去調支付寶時候,會通過支付寶sdk在我們的應用內直接調起支付寶網頁進行支付。這時候就不會涉及到我們的APP打開支付寶或者支付寶打開我們的APP這些操作,也不會有因為我們應用于支付寶應用相互之間相互打開中間所產生的home鍵監聽問題。
余額支付,直接在應用內完成,不會調起支付寶。所以,余額支付與手機沒有安裝支付寶支付的操作是一樣的。他們只需要在支付回調方法里處理邏輯。
總結:
感覺自己寫的比較固執。大部分是按照項目需求進行寫了。還有些細節可能因需求而異不會那么做,也就沒寫了。但是主流程我覺得還是可以跟大家分享的。有不當的地方,希望看到的朋友們能幫我指出來。重要的是我提的問題,這個很急,有知道的朋友聯系我呀(QQ:702042658)。超級感謝了。