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.
142 lines
3.0 KiB
142 lines
3.0 KiB
package base |
|
|
|
import ( |
|
"encoding/json" |
|
"io" |
|
"net" |
|
"net/http" |
|
"reflect" |
|
"server/call" |
|
"server/common" |
|
"server/db" |
|
"server/modules/pay/values" |
|
"strings" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/liangdas/mqant/log" |
|
iptool "github.com/liangdas/mqant/utils/ip" |
|
) |
|
|
|
func (b *Base) PayCallback(c *gin.Context) { |
|
b.C = c |
|
if len(b.WhiteIPs) > 0 { |
|
ip := iptool.RealIP(c.Request) |
|
if strings.Contains(ip, ":") { |
|
ip, _, _ = net.SplitHostPort(ip) |
|
} |
|
white := false |
|
for _, v := range b.WhiteIPs { |
|
if v == ip { |
|
white = true |
|
break |
|
} |
|
} |
|
if !white { |
|
return |
|
} |
|
} |
|
var str string |
|
var err error |
|
if b.HttpType == HttpTypeJson { |
|
str, err = b.CallbackJson(c) |
|
} else if b.HttpType == HttpTypeForm { |
|
str, err = b.CallbackForm(c) |
|
} |
|
defer func() { |
|
c.String(http.StatusOK, b.CallbackResp.Msg) |
|
}() |
|
if err != nil || !b.CheckSign(str) { |
|
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) { |
|
b.C = c |
|
var str string |
|
var err error |
|
if b.HttpType == HttpTypeJson { |
|
str, err = b.CallbackJson(c) |
|
} else if b.HttpType == HttpTypeForm { |
|
str, err = b.CallbackForm(c) |
|
} |
|
defer func() { |
|
c.String(http.StatusOK, b.CallbackResp.Msg) |
|
}() |
|
if err != nil || !b.CheckSign(str) { |
|
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.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 |
|
} |
|
} |
|
|
|
func (b *Base) CallbackJson(c *gin.Context) (str string, err error) { |
|
log.Debug("CallbackJson:%+v", *c.Request) |
|
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("CallbackJson body:%v", str) |
|
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) { |
|
req := b.CallbackReq |
|
typ := reflect.TypeOf(req).Elem() |
|
val := reflect.ValueOf(req).Elem() |
|
for i := 0; i < typ.NumField(); i++ { |
|
val.Field(i).SetString(c.PostForm(typ.Field(i).Tag.Get("json"))) |
|
} |
|
str = values.GetSignStrForm(c, b.SignPassStr...) |
|
return |
|
}
|
|
|