You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.0 KiB
173 lines
4.0 KiB
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) |
|
} else { |
|
values.WithdrawSuccess(values.PayWay(or.PayChannel)) |
|
} |
|
} |
|
|
|
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 |
|
}
|
|
|