最近在做支付,支付平台通知支付结果时,可能会重复通知。
为了解决这一问题,有三种思路。 锁,事务,缓存队列。
这里选择用缓存队列结合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 } }
|