一、問題描述
? ? ? ? 微信小游戲的內(nèi)購支付,接入的是米大師支付。先簡單介紹下通用邏輯:
1)、用戶點擊游戲內(nèi)下單
2)、客戶端構(gòu)造訂單物品等參數(shù)并發(fā)給服務(wù)端
3)、服務(wù)端接收后,生成唯一訂單號等內(nèi)部邏輯處理后,返回客戶端下單需要的參數(shù)
4)、客戶端調(diào)用微信下單接口,wx.requestMidasPayment(Object object) | 微信開放文檔,并將結(jié)果上報給服務(wù)端
5)、服務(wù)端根據(jù)客戶端的支付上報結(jié)果,分時輪詢對應(yīng)訂單的用戶余額
6)、對用戶余額進(jìn)行扣款,并修改對應(yīng)訂單狀態(tài)
7)、通知游戲服務(wù)端訂單狀態(tài),并發(fā)貨給用戶
初看,邏輯很清晰,沒啥問題,但是第4步經(jīng)常會返回錯誤的結(jié)果(客戶端),比如沒有返回(比較多出現(xiàn))或者說用戶支付了但返回支付失?。ㄏ鄬Ρ容^少)。這樣就導(dǎo)致部分用戶支付后沒有得到應(yīng)有的物品,掉單。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-494371.html
二、舊解決方案
? ? ? ? 1)通過上面問題描述,知道靠客戶端返回的結(jié)果不可靠,那為了用戶不掉單,就只能自己想辦法了,曲線救國。首先就是服務(wù)端不依賴于客戶端的返回結(jié)果才去請求驗證用戶余額,或者說沒收到返回的時候依然去請求驗證用戶余額(失敗的如果壓力不大,訂單少也可以請求驗證,成)。這樣就保證了訂單都有輪詢到去驗證。這樣雖然解決了掉單問題,但是衍生出了新的麻煩。
????????2) 麻煩就是,所有訂單都輪詢了,這樣就包含很多用戶實際沒支付的訂單,這樣就容易出現(xiàn)串單問題了。串單原因就是,微信是通過用戶查詢余額的,并沒有訂單啥事。那假如用戶查詢到余額有12塊錢,用戶有兩筆6塊和一筆12塊的訂單。那查詢到的這12塊錢,到底算2筆6塊身上,還是12塊訂單身上呢。要知道用戶支付到輪詢結(jié)果是有時間差的,并不是即時結(jié)果。這樣甚至?xí)霈F(xiàn)先扣了小金額的,比如先扣了1筆6塊,后面的12塊訂單也不夠余額扣款了。
????????3)為了減少串單問題,之前我們這邊的做法就是如果余額不等于訂單金額,就先記錄下來,等用戶所有訂單查詢完,再先扣大金額訂單后扣小金額訂單。這樣雖然能減少部分串單情況,但依然沒徹底解決問題,偶爾也會跑出一兩筆串單的,這時候就得手動折騰處理了,很是麻煩
????????4)這個問題由來已久,最開始18年接入時候詢問的,至今沒找到啥好辦法,一度懷疑是只有我們遇到而已
????????小游戲米大師支付串單 | 微信開放社區(qū)
?三、新方案
1)串單解決思路,就是無法確定哪筆訂單是有實際支付的,以前一直停留在這個思路上,一直沒找到合適方案。后面經(jīng)同事提醒轉(zhuǎn)變了思路,不能區(qū)分訂單,就區(qū)分訂單金額,手動給訂單區(qū)分,比如6塊錢的一類,12塊錢的一類,這樣至少6塊不會串到12塊的來,就是剩下可能的串單也是同金額的串,就問題不大了。
2)重新查看【wx.requestMidasPayment(Object object) | 微信開放文檔】這個接口說明,看到里面有一個zoneId分區(qū)的參數(shù),我們的解決方式就通過這個參數(shù)。我們先按照游戲內(nèi)可能的金額擋位配置分區(qū),或者將微信里面所有擋位都配置上。然后用戶下單請求接口的時候,根據(jù)訂單金額,帶上對應(yīng)的分區(qū)。這樣相當(dāng)于用戶錢包人為區(qū)分成多個小錢包,每個小錢包對應(yīng)不同的訂金額,6塊的就只去6塊的錢包查詢余額,如此就解決了不同金額串單的問題了。
文章來源:http://www.zghlxwxcb.cn/news/detail-494371.html
?
到了這里,關(guān)于微信小游戲內(nèi)購米大師支付,不同金額創(chuàng)單問題處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!