鍍金池/ 問答/HTML/ 聚合支付對(duì)接支付寶h5和微信h5的收款,如何保證流水號(hào)的唯一性?

聚合支付對(duì)接支付寶h5和微信h5的收款,如何保證流水號(hào)的唯一性?

聚合支付,接了通道(第三方支付,包含支付寶h5和微信h5支付),兩個(gè)用戶掃碼支付,把一樣的流水號(hào)(假設(shè)流水號(hào)規(guī)則是日期時(shí)間 + 商家id + 6位隨機(jī)數(shù)字,因?yàn)楦犊畹挠脩粜畔⒛貌坏?,所以還是可能出現(xiàn)流水號(hào)相同的情況)傳給了通道,通道回調(diào)聚合支付,聚合支付校驗(yàn)這筆交易時(shí),發(fā)現(xiàn)金額不對(duì),這時(shí)會(huì)支付失敗。但是通道已經(jīng)把錢收了,而聚合支付卻顯示狀態(tài)收款失敗,并且聚合支付記賬也會(huì)出現(xiàn)錯(cuò)誤。如果不能百分之百保證流水號(hào)的唯一性,高并發(fā)時(shí)肯定會(huì)出問題的。

類似這樣的設(shè)計(jì):日期時(shí)間 + 商家id + 6位隨機(jī)數(shù)字,似乎不能保證流水號(hào)的唯一性,高并發(fā)情況下,如何保證流水號(hào)的唯一性呢?

------ 分割線 -----------------
目前的解決方案:
1.隨機(jī)數(shù)字
獲取隨機(jī)數(shù)字的算法,必須確保隨機(jī)數(shù)字的唯一性。

具體細(xì)節(jié),歡迎補(bǔ)充。

2.其他解決方案
歡迎補(bǔ)充。

----- 分割線 --------
參考文章
http://www.jianshu.com/p/331b...

回答
編輯回答
墨染殤

既然樓主更新了問題,我也更新一下回答
我正好以前看到過相關(guān)回答,哪里看到忘記了,說個(gè)大概意思吧

正成訂單編號(hào)最簡(jiǎn)單的方案應(yīng)該是通過自增ID了來編號(hào)了,性能也不錯(cuò),最大的問題再于,容易暴露交易量,競(jìng)爭(zhēng)對(duì)手只要一看你的訂單編號(hào),就可以知道你一天大概有多少交易量了,如果對(duì)這方面無所謂的小型網(wǎng)站,個(gè)人蠻推薦這種方法的,因?yàn)樾阅芤膊诲e(cuò),

隨機(jī)數(shù)字,不用擔(dān)心暴露交易量了,鬼知道你最后幾位數(shù)字什么意思,
但是有一個(gè)性能上的隱患,假如你用6位隨機(jī)數(shù),理論上最大值是 999999 也就是 99萬,假如你的網(wǎng)站生意特別好,今天已經(jīng)產(chǎn)生了90w訂單了(除了淘寶,京東,12306還有誰?),這個(gè)時(shí)候你要做重復(fù)性檢測(cè)性能就會(huì)相當(dāng)差了。

所以這個(gè)時(shí)候你會(huì)相到,如果我預(yù)先生成好 100w的隨機(jī)數(shù)放redis里,要用的時(shí)候取一個(gè),性能和并發(fā)都不存在問題了。
但是這個(gè)方案還有問題,如果這天生意特別好,100w的隨機(jī)數(shù)用完了,接下來的人下不了單了,怎么辦,(樓主到底什么公司,這么好生意)

所以可以在這個(gè)解決方案之上再加一個(gè)系統(tǒng),用來檢測(cè)redis中的隨機(jī)數(shù)余量,當(dāng)少于多少條的時(shí)候,增加一批新的進(jìn)去。
=========更新分割線,以下是原回答
日期時(shí)間 + 商家id + 6位隨機(jī)數(shù)字 一般來說夠了,如是不夠,升能位數(shù)唄8位隨機(jī)數(shù),9位?
你注意到了嗎,雙11支付寶交易號(hào)16位升至28位了

2017年6月1日 05:54