package base import ( "encoding/json" "io" "net/http" "net/url" "reflect" "server/call" "server/common" "server/db" "server/modules/pay/values" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" ) func (b *Base) PayCallback(c *gin.Context) { str, err := b.Callback(c) defer func() { c.String(http.StatusOK, b.CallbackResp.Msg) }() if err != nil { log.Error("err:%v", err) b.CallbackResp.Msg = "callback fail" return } b.C = c if !b.CheckSign(str) { log.Error("check sign fail") b.CallbackResp.Msg = "callback fail" return } orderID := b.CallbackResp.OrderID or := &common.RechargeOrder{OrderID: orderID} db.Mysql().Get(or) if or.ID == 0 { log.Error("order:%v not exist", orderID) return } if or.Status == common.StatusROrderPay { log.Error("order:%v exec done", orderID) return } success := b.CallbackResp.Success if err := call.RechargeCallback(or, success, "", ""); err != nil { b.CallbackResp.Msg = "callback fail" return } if success { values.PayCallback(b.Channel) } } func (b *Base) WithdrawCallback(c *gin.Context) { str, err := b.Callback(c) defer func() { c.String(http.StatusOK, b.CallbackResp.Msg) }() if err != nil { log.Error("err:%v", err) b.CallbackResp.Msg = "callback fail" return } b.C = c if !b.CheckSign(str) { log.Error("check sign fail") b.CallbackResp.Msg = "callback fail" return } orderID := b.CallbackResp.OrderID or := &common.WithdrawOrder{OrderID: orderID} db.Mysql().Get(or) if or.ID == 0 { log.Error("order:%v not exist", orderID) return } if or.PayChannel != int(b.Channel) { log.Error("order:%v,pay channel:%v,this channel:%v", orderID, or.PayChannel, b.Channel) return } if or.APIPayID == "" { or.APIPayID = b.CallbackResp.APIOrderID } success := b.CallbackResp.Success or.FailReason = b.CallbackResp.FailMessage if success { or.Status = common.StatusROrderFinish } else { or.Status = common.StatusROrderFail } if err := call.WithdrawCallback(or); err != nil { b.CallbackResp.Msg = "callback fail" return } if !success { values.WithdrawAmount(values.PayWay(or.PayChannel), false, or.Amount*100) } } func (b *Base) Callback(c *gin.Context) (str string, err error) { if b.HttpType == HttpTypeJson { str, err = b.CallbackJson(c) } else if b.HttpType == HttpTypeForm { str, err = b.CallbackForm(c) } else if b.HttpType == HttpTypeGet { str, err = b.CallbackGet(c) } return } func (b *Base) CallbackJson(c *gin.Context) (str string, err error) { var tmp []byte tmp, err = io.ReadAll(c.Request.Body) defer func() { c.Request.Body.Close() }() if err != nil { log.Error("err:%v", err) return } str = string(tmp) log.Debug("Callback body:%v", str) if b.SubCallbackDecode != nil { return b.SubCallbackDecode(tmp) } err = json.Unmarshal(tmp, b.CallbackReq) if err != nil { log.Error("err:%v", err) return } return } func (b *Base) CallbackForm(c *gin.Context) (str string, err error) { if err = c.ShouldBind(b.CallbackReq); err != nil { return "", err } // req := b.CallbackReq // typ := reflect.TypeOf(req).Elem() // val := reflect.ValueOf(req).Elem() // for i := 0; i < typ.NumField(); i++ { // if val.Field(i).Kind() == reflect.Int64 { // tmp, _ := strconv.ParseInt(c.Query(typ.Field(i).Tag.Get("json")), 10, 64) // val.Field(i).SetInt(tmp) // } else { // val.Field(i).SetString(c.Query(typ.Field(i).Tag.Get("json"))) // } // } str = values.GetSignStrForm(c, b.SignPassStr...) return } func (b *Base) CallbackGet(c *gin.Context) (str string, err error) { raw, err := url.ParseQuery(c.Request.URL.RawQuery) if err != nil { log.Error("err:%v", err) } b.GetResp = raw req := b.CallbackReq typ := reflect.TypeOf(req).Elem() val := reflect.ValueOf(req).Elem() for i := 0; i < typ.NumField(); i++ { if val.Field(i).Kind() != reflect.String { continue } val.Field(i).SetString(b.GetResp.Get(typ.Field(i).Tag.Get("json"))) } str = GetSignStrGet(b.GetResp, "sign") return }