支付反馈可重入

最近在做支付,支付平台通知支付结果时,可能会重复通知。
为了解决这一问题,有三种思路。 锁,事务,缓存队列。
这里选择用缓存队列结合chan实现支付重复反馈可重入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
var inputTradeno = make(chan string)
var outputStatus = make(chan bool)

func chanLoop(){
hashmap := make(map[string]interface{}, 10000)
var queue common.StringFIFO
queue.Init(10000)
for {
tradeno := <- inputTradeno
if _, ok := hashmap[tradeno]; ok{
outputStatus <- true
}else {
if queue.Full(){
oldestTradeno, _ := queue.Pop()
delete(hashmap, oldestTradeno)
}
queue.Push(tradeno)
hashmap[tradeno] = struct {}{}
outputStatus <- false
}
}
}

func look(tradeno string) bool{
inputTradeno <- tradeno
ret := <- outputStatus
return ret
}

func main() {
go chanLoop()
}

func wftNotify(c * gin.Context){
//检验威富通是否重复通知
if look(notifyReq.Out_trade_no){
//已经缓存当前订单,说明威富通重复通知
common.LogError("该订单已经处理")
c.Writer.WriteString(wxpay.WFT_RETURN_MSG_SUCCESS)
return
}
}