package handlers import ( "fusenapi/constants" "fusenapi/utils/pay" "github.com/zeromicro/go-zero/core/mr" ) type ( PayInfo struct { TradeNo string `json:"trade_no"` PaymentMethod int64 `json:"payment_method"` Key string `json:"key"` } PayRefundHandlerReq struct { PayInfoList []PayInfo } PayRefundHandlerRes struct { } ) // 申请第三方退款 func PayRefundHandler(req *PayRefundHandlerReq) (res PayRefundHandlerRes, err error) { _, err = mr.MapReduce(func(source chan<- interface{}) { for _, payInfo := range req.PayInfoList { source <- payInfo } }, func(item interface{}, writer mr.Writer[interface{}], cancel func(error)) { payConfig := new(pay.Config) payInfo := item.(PayInfo) switch payInfo.PaymentMethod { case int64(constants.PAYMETHOD_STRIPE): // stripe 支付 payConfig.Stripe.Key = payInfo.Key } payDriver := pay.NewPayDriver(payInfo.PaymentMethod, payConfig) _, err = payDriver.PayRefund(&pay.PayRefundReq{ TradeNo: payInfo.TradeNo, }) if err != nil { // Notice 如果不加 cancel(err),会返回校验成功的id; 如果加上cancel(err),返回的结果会是一个空列表 // Notice 实际上,如果这里返回错误,其他协程直接就退出了! // Notice 看实际中业务的需求情况来定了... cancel(err) } // Notice 这个必须加! writer.Write(payInfo) }, func(pipe <-chan interface{}, writer mr.Writer[interface{}], cancel func(error)) { var payInfoList []PayInfo for p := range pipe { payInfoList = append(payInfoList, p.(PayInfo)) } // Notice 这个必须加! writer.Write(payInfoList) }) if err != nil { return res, err } return res, nil }