(JAVA)最近在做到支付寶的一碼多付支付接口,發(fā)現(xiàn)沒(méi)有異步回調(diào)通知,需要自己輪詢查詢訂單狀態(tài),這個(gè)需要怎么實(shí)現(xiàn)?
問(wèn)題描述
考慮到用線程或者定時(shí)任務(wù),不知道有沒(méi)有人做過(guò)這個(gè)
問(wèn)題解答
回答1:類(lèi)似的異步處理通知接口基本上都需要做這種處理的,因?yàn)楫惒降幕卣{(diào)通知總會(huì)因?yàn)榫W(wǎng)絡(luò)或者處理延時(shí)造成沒(méi)有進(jìn)行回調(diào)通知。具體的做法就是首先在調(diào)用異步接口前,需要先生成一個(gè)待處理的訂單,然后調(diào)用支付寶接口進(jìn)行支付,支付完成后正常情況支付寶會(huì)主動(dòng)請(qǐng)求你的回調(diào)接口,如果沒(méi)有請(qǐng)求的話,你的訂單狀態(tài)將會(huì)保持待處理的狀態(tài)。然后再做一個(gè)定時(shí)任務(wù),每隔一段時(shí)間,查詢一下待處理的訂單,根據(jù)支付寶返回的訂單狀態(tài)來(lái)更新對(duì)應(yīng)的狀態(tài)就可以了,需要注意的是控制訂單查詢的時(shí)間,不建議把所有的訂單找出來(lái)去更新,根據(jù)你的數(shù)據(jù)量來(lái)處理,一般的話遠(yuǎn)程請(qǐng)求支付寶接口同步處理的話也比較耗時(shí),未處理的訂單太多了就根本處理不過(guò)來(lái),建議的做法是直接把查詢請(qǐng)求發(fā)送到MQ上,然后根據(jù)數(shù)據(jù)量大小開(kāi)多個(gè)消費(fèi)者服務(wù),來(lái)處理查詢請(qǐng)求。另外還有一種簡(jiǎn)單粗暴的方式也可以,直接對(duì)待處理的訂單不做處理,但是給用戶提供一個(gè)功能,讓用戶主動(dòng)發(fā)起請(qǐng)求,用戶點(diǎn)擊重試按鈕后直接調(diào)用支付寶查詢接口查詢訂單支付狀態(tài)。
回答2:訂單的幾個(gè)狀態(tài): 待支付,已支付到支付寶,支付寶支付完成。主要應(yīng)對(duì)的是:已支付到支付寶。考慮的幾個(gè)點(diǎn): 實(shí)時(shí)性,冪等性
實(shí)時(shí)性:根據(jù)你具體的業(yè)務(wù)場(chǎng)景,單進(jìn)程多線程,多進(jìn)程處理。多進(jìn)程的話需要分區(qū)段處理數(shù)據(jù),保證數(shù)據(jù)的不重復(fù)冪等:每個(gè)訂單必須有唯一的標(biāo)識(shí),每個(gè)環(huán)節(jié)處理的時(shí)候,保證這個(gè)訂單已經(jīng)被處理過(guò)了。
