refactor(gateway): 重构参数处理逻辑
- 将字符串参数改为任意类型参数,提高代码通用性和可维护性 - 优化参数处理逻辑,使用更简洁的语法 - 更新相关函数以适应新的参数类型
This commit is contained in:
10
go.mod
10
go.mod
@@ -2,9 +2,9 @@ module gateway
|
||||
|
||||
go 1.22.0
|
||||
|
||||
toolchain go1.22.8
|
||||
toolchain go1.22.11
|
||||
|
||||
require github.com/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee
|
||||
require github.com/beego/beego/v2 v2.3.4
|
||||
|
||||
require (
|
||||
github.com/bytedance/gopkg v0.1.2-0.20240828084325-780ca9ee70fb
|
||||
@@ -41,7 +41,7 @@ require (
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/prometheus/client_golang v1.20.5 // indirect
|
||||
github.com/prometheus/client_model v0.6.1 // indirect
|
||||
github.com/prometheus/common v0.61.0 // indirect
|
||||
github.com/prometheus/common v0.62.0 // indirect
|
||||
github.com/prometheus/procfs v0.15.1 // indirect
|
||||
github.com/rogpeppe/go-internal v1.11.0 // indirect
|
||||
github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect
|
||||
@@ -49,10 +49,10 @@ require (
|
||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
golang.org/x/arch v0.13.0 // indirect
|
||||
golang.org/x/crypto v0.32.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a // indirect
|
||||
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
|
||||
golang.org/x/net v0.34.0 // indirect
|
||||
golang.org/x/sys v0.29.0 // indirect
|
||||
golang.org/x/text v0.21.0 // indirect
|
||||
google.golang.org/protobuf v1.36.2 // indirect
|
||||
google.golang.org/protobuf v1.36.3 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
16
go.sum
16
go.sum
@@ -1,7 +1,7 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee h1:j+mbzD7idTH1ktHDtFIqh//640NcsQ1k5ltwpKuWLTU=
|
||||
github.com/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4=
|
||||
github.com/beego/beego/v2 v2.3.4 h1:HurQEOGIEhLlPFCTR6ZDuQkybrUl2Ag2i6CdVD2rGiI=
|
||||
github.com/beego/beego/v2 v2.3.4/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bytedance/gopkg v0.1.2-0.20240828084325-780ca9ee70fb h1:glte+Ka6C5efXn/QlEAE/wwNrvE+3mYo/ce69fpvtrE=
|
||||
@@ -96,8 +96,8 @@ github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+
|
||||
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
|
||||
github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
|
||||
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
|
||||
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
||||
@@ -131,8 +131,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
|
||||
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
|
||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw=
|
||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA=
|
||||
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
@@ -163,8 +163,8 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU=
|
||||
google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
|
||||
google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
|
||||
@@ -95,3 +95,8 @@ func GetConfig() *Config {
|
||||
func (c *Config) GetForbiddenBackendHost() string {
|
||||
return web.AppConfig.DefaultString("forbidden::host", "http://kami_backend:12401")
|
||||
}
|
||||
|
||||
// ShopAddr 获取shop的地址
|
||||
func (c *Config) ShopAddr() string {
|
||||
return web.AppConfig.DefaultString("shopAddr", "http://127.0.0.1:12309")
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ type BaseGateway struct {
|
||||
// PayPrepare 获取商户请求过来的基本参数参数
|
||||
func (c *BaseGateway) PayPrepare() *response.PayBaseResp {
|
||||
// 获取客户端的ip
|
||||
p := service.GetMerchantInfo(map[string]string{
|
||||
p := service.GetMerchantInfo(map[string]any{
|
||||
"exValue": strings.TrimSpace(c.GetString("exValue")),
|
||||
"orderNo": strings.TrimSpace(c.GetString("orderNo")),
|
||||
"orderPeriod": strings.TrimSpace(c.GetString("orderPeriod")),
|
||||
|
||||
@@ -93,7 +93,7 @@ func (c *OrderController) MerchantQuery() {
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
tmpSign := utils.GetMD5SignMF(map[string]string{
|
||||
tmpSign := utils.GetMD5SignMF(map[string]any{
|
||||
"appKey": appKey,
|
||||
"orderNo": orderNo,
|
||||
"timestamp": timestamp,
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"gateway/internal/schema/response"
|
||||
"gateway/internal/service/pay_for"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strings"
|
||||
|
||||
"github.com/beego/beego/v2/server/web"
|
||||
@@ -21,7 +22,7 @@ type PayForGateway struct {
|
||||
|
||||
// PayFor 接受下游商户的代付请求
|
||||
func (c *PayForGateway) PayFor() {
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
|
||||
params["realname"] = strings.TrimSpace(c.GetString("realname"))
|
||||
params["cardNo"] = strings.TrimSpace(c.GetString("cardNo"))
|
||||
@@ -49,7 +50,7 @@ func (c *PayForGateway) PayFor() {
|
||||
|
||||
// PayForQuery 代付结果查询,
|
||||
func (c *PayForGateway) PayForQuery() {
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
|
||||
params["timestamp"] = strings.TrimSpace(c.GetString("timestamp"))
|
||||
params["merchantOrderId"] = strings.TrimSpace(c.GetString("merchantOrderId"))
|
||||
@@ -105,7 +106,7 @@ func (c *PayForGateway) SolvePayForResult() {
|
||||
|
||||
// Balance 商户查找余额
|
||||
func (c *PayForGateway) Balance() {
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
|
||||
params["timestamp"] = strings.TrimSpace(c.GetString("timestamp"))
|
||||
params["sign"] = strings.TrimSpace(c.GetString("sign"))
|
||||
@@ -122,9 +123,9 @@ func (c *PayForGateway) Balance() {
|
||||
_ = c.ServeJSON()
|
||||
}
|
||||
|
||||
func checkParams(params map[string]string) (bool, string) {
|
||||
func checkParams(params map[string]any) (bool, string) {
|
||||
for k, v := range params {
|
||||
if v == "" || len(v) == 0 {
|
||||
if v == "" || len(convertor.ToString(v)) == 0 {
|
||||
return false, fmt.Sprintf("字段: %s 为必填!", k)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"gateway/internal/config"
|
||||
"gateway/internal/dto"
|
||||
"gateway/internal/entities/backend"
|
||||
"gateway/internal/entities/supplier"
|
||||
"gateway/internal/entities/supplier/t_mall_game"
|
||||
@@ -21,12 +22,15 @@ import (
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/beego/beego/v2/core/validation"
|
||||
"github.com/bytedance/gopkg/util/gopool"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"github.com/duke-git/lancet/v2/structs"
|
||||
"github.com/rs/xid"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
delayPool = gopool.NewPool("delayHandle", 20, gopool.NewConfig())
|
||||
delayPool = gopool.NewPool("delayHandler", 20, gopool.NewConfig())
|
||||
)
|
||||
|
||||
type ScanController struct {
|
||||
@@ -60,7 +64,7 @@ func (c *ScanController) Scan() {
|
||||
c.SolveFailJSON(p)
|
||||
return
|
||||
}
|
||||
orderPrice, err := strconv.ParseFloat(p.Params["orderPrice"], 64)
|
||||
orderPrice, err := strconv.ParseFloat(convertor.ToString(p.Params["orderPrice"]), 64)
|
||||
if err != nil {
|
||||
p.Code = -1
|
||||
p.Msg = fmt.Sprintf("订单金额转换失败:%v", err.Error())
|
||||
@@ -74,14 +78,14 @@ func (c *ScanController) Scan() {
|
||||
c.SolveFailJSON(p)
|
||||
return
|
||||
}
|
||||
p.Params["exValue"], err = service.CompleteRedeemExValue(p.Params["exValue"], strconv.FormatFloat(pm.ShowLabel, 'f', 0, 64))
|
||||
p.Params["exValue"], err = service.CompleteRedeemExValue(convertor.ToString(p.Params["exValue"]), strconv.FormatFloat(pm.ShowLabel, 'f', 0, 64))
|
||||
if err != nil {
|
||||
p.Code = -1
|
||||
p.Msg = fmt.Sprintf("订单金额转换失败:%v", err.Error())
|
||||
c.SolveFailJSON(p)
|
||||
return
|
||||
}
|
||||
// 生成订单记录
|
||||
// TODO: 生成订单记录
|
||||
orderInfo, _, err := service.GenerateRecord(p)
|
||||
if err != nil {
|
||||
p.Msg = fmt.Sprintf("生成订单失败:%v", err.Error())
|
||||
@@ -118,7 +122,7 @@ func (c *ScanController) Scan() {
|
||||
p.Msg = fmt.Sprintf("格式化数据失败:%v", orderInfo.ExValue)
|
||||
c.SolveFailJSON(p)
|
||||
}
|
||||
isAllowed, err := backend.GetIPIsRestricted(p.ClientIP, mt.Id, orderInfo.BankOrderId, cdata.Data, p.Params["deviceId"])
|
||||
isAllowed, err := backend.GetIPIsRestricted(p.ClientIP, mt.Id, orderInfo.BankOrderId, cdata.Data, convertor.ToString(p.Params["deviceId"]))
|
||||
order.UpdateIpRestricted(orderInfo.BankOrderId, isAllowed)
|
||||
|
||||
logs.Info("IP是否允许:%v", isAllowed)
|
||||
@@ -131,7 +135,7 @@ func (c *ScanController) Scan() {
|
||||
}
|
||||
logs.Info("获取商户部署信息:%+v", mt)
|
||||
if mt.AutoSettle == config.NO {
|
||||
params := map[string]string{
|
||||
params := map[string]any{
|
||||
"orderNo": orderInfo.BankOrderId,
|
||||
"orderPrice": strconv.FormatFloat(orderInfo.OrderAmount, 'f', 2, 64),
|
||||
"statusCode": "00",
|
||||
@@ -182,50 +186,63 @@ func (c *ScanController) Scan() {
|
||||
|
||||
// SolveFailJSON 处理错误的返回
|
||||
func (c *ScanController) SolveFailJSON(p *response.PayBaseResp) {
|
||||
scanFailJSON := new(response.ScanFailData)
|
||||
scanFailJSON.StatusCode = "01"
|
||||
scanFailJSON.PayKey = p.Params["payKey"]
|
||||
scanFailJSON.Msg = p.Msg
|
||||
scanFailJSON.Code = -1
|
||||
c.Data["json"] = scanFailJSON
|
||||
c.Data["json"] = response.ScanFailData{
|
||||
StatusCode: "01",
|
||||
PayKey: convertor.ToString(p.Params["payKey"]),
|
||||
Msg: p.Msg,
|
||||
Code: -1,
|
||||
}
|
||||
_ = c.ServeJSON()
|
||||
c.StopRun()
|
||||
}
|
||||
|
||||
func (c *ScanController) GetAllowedMM() {
|
||||
payKey := strings.TrimSpace(c.GetString("payKey"))
|
||||
showMMValue, err := c.GetFloat("showMMValue")
|
||||
productCode := strings.TrimSpace(c.GetString("productCode"))
|
||||
if payKey == "" || showMMValue == 0 || productCode == "" {
|
||||
res := response.CommonErr(-1, "获取面额失败,参数缺失")
|
||||
type Request struct {
|
||||
PayKey string `json:"payKey" valid:"Required"`
|
||||
ShowMMValue float64 `json:"showMMValue" valid:"Required"`
|
||||
ProductCode string `json:"productCode" valid:"Required"`
|
||||
}
|
||||
|
||||
req := Request{}
|
||||
err := c.BindJSON(&req)
|
||||
if err != nil {
|
||||
res := response.CommonErr(-1, "参数校验失败")
|
||||
c.Data["json"] = res
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
c.Data["json"] = response.CommonErr(-1, err.Error())
|
||||
|
||||
valid := validation.Validation{}
|
||||
b, err := valid.Valid(&req)
|
||||
if err != nil || !b {
|
||||
res := response.CommonErr(-1, "参数校验失败")
|
||||
c.Data["json"] = res
|
||||
_ = c.ServeJSON()
|
||||
c.StopRun()
|
||||
return
|
||||
}
|
||||
merchantInfo, err := service.GetMerchantInfoByPayKey(payKey)
|
||||
|
||||
merchantInfo, err := service.GetMerchantInfoByPayKey(req.PayKey)
|
||||
if err != nil || merchantInfo.Id == 0 {
|
||||
c.Data["json"] = response.CommonErr(-1, "获取面额失败,获取商户信息出错")
|
||||
_ = c.ServeJSON()
|
||||
c.StopRun()
|
||||
}
|
||||
merchantDeployInfo := service.GerMerchantDeployInfoByUidAndProductCode(merchantInfo.MerchantUid, productCode)
|
||||
|
||||
merchantDeployInfo := service.GerMerchantDeployInfoByUidAndProductCode(merchantInfo.MerchantUid, req.ProductCode)
|
||||
if merchantDeployInfo.Id == 0 {
|
||||
res := response.CommonErr(-1, "获取面额失败,当前通道不存在")
|
||||
c.Data["json"] = res
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
profitMarginList, err := merchantDeployInfo.GetFactMMValue(showMMValue)
|
||||
|
||||
profitMarginList, err := merchantDeployInfo.GetFactMMValue(req.ShowMMValue)
|
||||
if err != nil {
|
||||
c.Data["json"] = response.CommonErr(-1, err.Error())
|
||||
_ = c.ServeJSON()
|
||||
c.StopRun()
|
||||
}
|
||||
|
||||
type profitMarginStruct struct {
|
||||
Sort int `json:"sort" description:"排序"`
|
||||
FactLabel float64 `json:"factLabel" description:"实际面值"`
|
||||
@@ -235,10 +252,10 @@ func (c *ScanController) GetAllowedMM() {
|
||||
LinkID string `json:"linkID" description:"链接"`
|
||||
}
|
||||
logs.Info("当前请求面额数据:%+v", profitMarginList)
|
||||
resData := make([]profitMarginStruct, 0)
|
||||
resData := make([]*profitMarginStruct, 0)
|
||||
for _, v := range profitMarginList {
|
||||
if v.ShowLabel != 0 || v.FactLabel != 0 {
|
||||
resData = append(resData, profitMarginStruct{
|
||||
resData = append(resData, &profitMarginStruct{
|
||||
FactLabel: v.FactLabel,
|
||||
ShowLabel: v.ShowLabel,
|
||||
PlatformLabel: v.PlatformLabel,
|
||||
@@ -248,6 +265,7 @@ func (c *ScanController) GetAllowedMM() {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
logs.Info("转换后的面额数据:%+v", resData)
|
||||
c.Data["json"] = response.Ok(resData)
|
||||
_ = c.ServeJSON()
|
||||
@@ -260,20 +278,14 @@ func (c *ScanController) CreateOrder() {
|
||||
|
||||
valid := validation.Validation{}
|
||||
b, err := valid.Valid(&createdOrder)
|
||||
if err != nil {
|
||||
if err != nil || !b {
|
||||
logs.Error("创建订单错误:", err)
|
||||
res := response.CommonErr(-1, "创建订单错误,参数错误")
|
||||
c.Data["json"] = res
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
if !b {
|
||||
logs.Error("创建订单错误:", valid.Errors)
|
||||
res := response.CommonErr(-1, "创建订单错误,参数验证错误")
|
||||
c.Data["json"] = res
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
merchantInfo := merchant.GetMerchantByPasskey(createdOrder.PayKey)
|
||||
if merchantInfo.Id == 0 {
|
||||
logs.Error("创建订单错误:", err)
|
||||
@@ -282,6 +294,7 @@ func (c *ScanController) CreateOrder() {
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
if !utils.Md5MFVerify(createdOrder.ToMap(), merchantInfo.MerchantSecret) {
|
||||
res := response.CommonErr(-1, "sign验证错误")
|
||||
logs.Error("sign验证错误")
|
||||
@@ -289,6 +302,7 @@ func (c *ScanController) CreateOrder() {
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
orderInfo := order.GetOrderByMerchantOrderId(createdOrder.OrderNo)
|
||||
roadInfo := road.GetRoadInfoByProductCode(createdOrder.ProductCode)
|
||||
if orderInfo.Id != 0 {
|
||||
@@ -305,6 +319,7 @@ func (c *ScanController) CreateOrder() {
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
// 获取到对应的上游
|
||||
supplierCode := roadInfo.ProductUid
|
||||
supplierByCode := third_party.GetPaySupplierByCode(supplierCode)
|
||||
@@ -318,17 +333,27 @@ func (c *ScanController) CreateOrder() {
|
||||
c.StopRun()
|
||||
return
|
||||
}
|
||||
//if supplierByCode.HasDependencyHTML() {
|
||||
// logs.Error("获取上游渠道失败,请联系客服", supplierCode)
|
||||
// err = errors.New("三方支付渠道,请勿使用此接口")
|
||||
// c.Data["json"] = response.CommonErr(-1, err.Error())
|
||||
// _ = c.ServeJSON()
|
||||
// c.StopRun()
|
||||
// return
|
||||
//}
|
||||
|
||||
payUrl := ""
|
||||
//TODO: 区分自有渠道和三方渠道
|
||||
if supplierByCode.HasDependencyHTML() {
|
||||
scanData := supplierByCode.Scan(orderInfo, roadInfo, merchantInfo)
|
||||
payUrl = scanData.PayUrl
|
||||
} else {
|
||||
orderParams := dto.Params{
|
||||
PayKey: createdOrder.PayKey,
|
||||
GeneratedTime: time.Now().Unix(),
|
||||
OrderNo: xid.New().String(),
|
||||
Duration: 24,
|
||||
ProductCode: createdOrder.ProductCode,
|
||||
ShowMMValue: createdOrder.OrderPrice,
|
||||
NotifyUrl: fmt.Sprintf("%s", "shop/notify"),
|
||||
}
|
||||
payUrl += config.GetConfig().ShopAddr() + "?sign=" + orderParams.Encrypt()
|
||||
}
|
||||
|
||||
// 创建订单记录
|
||||
roadInfo, err = service.CreateOrderInfoAndOrderProfitInfo(createdOrder, merchantInfo)
|
||||
if err != nil {
|
||||
if err = service.CreateOrderInfoAndOrderProfitInfo(createdOrder, merchantInfo, payUrl); err != nil {
|
||||
res := response.CommonErr(-1, err.Error())
|
||||
logs.Info("创建订单错误:", err)
|
||||
c.Data["json"] = res
|
||||
@@ -336,35 +361,28 @@ func (c *ScanController) CreateOrder() {
|
||||
return
|
||||
}
|
||||
logs.Info("获取供应商信息:%+v", supplierCode)
|
||||
payUrl := ""
|
||||
//if supplierByCode.HasDependencyHTML() {
|
||||
// //scanData := supplierByCode.Scan(orderInfo, roadInfo, merchantInfo)
|
||||
// //if scanData
|
||||
//} else {
|
||||
// orderParams := dto.Params{
|
||||
// PayKey: createdOrder.PayKey,
|
||||
// GeneratedTime: time.Now().Unix(),
|
||||
// OrderNo: xid.New().String(),
|
||||
// Duration: 24,
|
||||
// ProductCode: createdOrder.ProductCode,
|
||||
// ShowMMValue: createdOrder.OrderPrice,
|
||||
// NotifyUrl: fmt.Sprintf("%s%s", "shop/notify"),
|
||||
// }
|
||||
// payLink + "?sign=" + orderParams.Encrypt()
|
||||
//}
|
||||
c.Data["json"] = response.Ok(struct {
|
||||
ProductCode string `json:"productCode"`
|
||||
PaymentName string `json:"paymentName"`
|
||||
TransactionType string `json:"TransactionType"`
|
||||
HasDependencyHTML bool `json:"HasDependencyHTML"`
|
||||
PayUrl string `json:"PayUrl"`
|
||||
|
||||
resp := struct {
|
||||
ProductCode string `json:"productCode"`
|
||||
PaymentName string `json:"paymentName"`
|
||||
TransactionType string `json:"TransactionType"`
|
||||
PayUrl string `json:"PayUrl"`
|
||||
}{
|
||||
ProductCode: createdOrder.ProductCode,
|
||||
PaymentName: roadInfo.PaymentHtml,
|
||||
TransactionType: roadInfo.TransactionType,
|
||||
HasDependencyHTML: supplierByCode.HasDependencyHTML(),
|
||||
PayUrl: payUrl,
|
||||
})
|
||||
ProductCode: createdOrder.ProductCode,
|
||||
PaymentName: roadInfo.PaymentHtml,
|
||||
TransactionType: roadInfo.TransactionType,
|
||||
PayUrl: payUrl,
|
||||
}
|
||||
respMap, err := structs.New(resp).ToMap()
|
||||
if err != nil {
|
||||
res := response.CommonErr(-1, err.Error())
|
||||
logs.Info("创建订单错误:", err)
|
||||
c.Data["json"] = res
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
utils.GetMD5SignMF(respMap, merchantInfo.MerchantSecret)
|
||||
//c.Data["json"] = response.Ok()
|
||||
_ = c.ServeJSON()
|
||||
}
|
||||
|
||||
|
||||
18
internal/entities/supplier/third_party/apple.go
vendored
18
internal/entities/supplier/third_party/apple.go
vendored
@@ -237,7 +237,6 @@ func (c *AppleCardImpl) PayNotify() {
|
||||
}
|
||||
|
||||
func (c *AppleCardImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -249,9 +248,11 @@ func (c *AppleCardImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadIn
|
||||
return false
|
||||
}
|
||||
|
||||
params["order_id"] = orderId
|
||||
params["app_key"] = gojson.Json(roadInfo.Params).Get("appKey").Tostring()
|
||||
params["timestamp"] = strconv.FormatInt(time.Now().Unix(), 10)
|
||||
params := map[string]any{
|
||||
"order_id": orderId,
|
||||
"app_key": gojson.Json(roadInfo.Params).Get("appKey").Tostring(),
|
||||
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
|
||||
}
|
||||
params["sign"] = utils.GetMD5SignMF(params, gojson.Json(roadInfo.Params).Get("appSecret").Tostring())
|
||||
|
||||
cfg := config.Config{}
|
||||
@@ -300,7 +301,6 @@ func (c *AppleCardImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadIn
|
||||
}
|
||||
|
||||
func (c *AppleCardImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -312,9 +312,11 @@ func (c *AppleCardImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.Road
|
||||
return supply_model.CardMsgErr
|
||||
}
|
||||
|
||||
params["order_id"] = orderId
|
||||
params["app_key"] = gojson.Json(roadInfo.Params).Get("appKey").Tostring()
|
||||
params["timestamp"] = strconv.FormatInt(time.Now().Unix(), 10)
|
||||
params := map[string]any{
|
||||
"order_id": orderId,
|
||||
"app_key": gojson.Json(roadInfo.Params).Get("appKey").Tostring(),
|
||||
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
|
||||
}
|
||||
params["sign"] = utils.GetMD5SignMF(params, gojson.Json(roadInfo.Params).Get("appSecret").Tostring())
|
||||
|
||||
cfg := config.Config{}
|
||||
|
||||
@@ -199,7 +199,7 @@ func (c *AppleCardSharkImpl) PayNotify() {
|
||||
}
|
||||
|
||||
func (c *AppleCardSharkImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -262,7 +262,7 @@ func (c *AppleCardSharkImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.R
|
||||
}
|
||||
|
||||
func (c *AppleCardSharkImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
|
||||
14
internal/entities/supplier/third_party/daili.go
vendored
14
internal/entities/supplier/third_party/daili.go
vendored
@@ -21,6 +21,7 @@ import (
|
||||
"gateway/internal/utils"
|
||||
"github.com/beego/beego/v2/client/httplib"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
@@ -45,12 +46,12 @@ func (c *DaiLiImpl) HasDependencyHTML() bool {
|
||||
|
||||
func (c *DaiLiImpl) Scan(orderInfo order.OrderInfo, roadInfo road.RoadInfo, merchantInfo merchant.MerchantInfo) supplier.ScanData {
|
||||
// 从boss后台获取数据
|
||||
service := gojson.Json(roadInfo.Params).Get("service").Tostring()
|
||||
service2 := gojson.Json(roadInfo.Params).Get("service2").Tostring()
|
||||
apiKey := gojson.Json(roadInfo.Params).Get("apikey").Tostring()
|
||||
signKey := gojson.Json(roadInfo.Params).Get("signkey").Tostring()
|
||||
|
||||
params := make(map[string]string)
|
||||
params["service"] = service
|
||||
params := make(map[string]any)
|
||||
params["service2"] = service2
|
||||
params["apikey"] = apiKey
|
||||
params["money"] = strconv.FormatFloat(orderInfo.OrderAmount, 'f', 2, 32)
|
||||
params["nonce_str"] = xid.New().String()
|
||||
@@ -93,7 +94,6 @@ func (c *DaiLiImpl) Scan(orderInfo order.OrderInfo, roadInfo road.RoadInfo, merc
|
||||
}
|
||||
|
||||
func (c *DaiLiImpl) PayNotify() {
|
||||
params := make(map[string]string)
|
||||
orderNo := strings.TrimSpace(c.GetString("orderNo"))
|
||||
orderInfo := order.GetOrderByBankOrderId(orderNo)
|
||||
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||
@@ -112,6 +112,8 @@ func (c *DaiLiImpl) PayNotify() {
|
||||
c.StopRun()
|
||||
}
|
||||
paySecret := merchantInfo.MerchantSecret
|
||||
|
||||
params := make(map[string]any)
|
||||
params["orderNo"] = orderNo
|
||||
params["orderPrice"] = strings.TrimSpace(c.GetString("orderPrice"))
|
||||
params["orderTime"] = strings.TrimSpace(c.GetString("orderTime"))
|
||||
@@ -129,12 +131,12 @@ func (c *DaiLiImpl) PayNotify() {
|
||||
// c.StopRun()
|
||||
}
|
||||
// 实际支付金额
|
||||
factAmount, err := strconv.ParseFloat(params["orderPrice"], 64)
|
||||
factAmount, err := strconv.ParseFloat(convertor.ToString(params["orderPrice"]), 64)
|
||||
if err != nil {
|
||||
orderInfo.FactAmount = 0
|
||||
}
|
||||
orderInfo.FactAmount = factAmount
|
||||
orderInfo.BankTransId = params["trxNo"]
|
||||
orderInfo.BankTransId = convertor.ToString(params["trxNo"])
|
||||
tradeStatus := params["tradeStatus"]
|
||||
|
||||
// paySolveController := new(service.PaySolveController)
|
||||
|
||||
4
internal/entities/supplier/third_party/jd.go
vendored
4
internal/entities/supplier/third_party/jd.go
vendored
@@ -202,7 +202,7 @@ func (c *JDCardImpl) PayNotify() {
|
||||
}
|
||||
|
||||
func (c *JDCardImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -265,7 +265,7 @@ func (c *JDCardImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo)
|
||||
}
|
||||
|
||||
func (c *JDCardImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
|
||||
41
internal/entities/supplier/third_party/kuaifu.go
vendored
41
internal/entities/supplier/third_party/kuaifu.go
vendored
@@ -11,6 +11,9 @@ import (
|
||||
"gateway/internal/models/supply_model"
|
||||
"gateway/internal/service"
|
||||
"gateway/internal/utils"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"github.com/duke-git/lancet/v2/maputil"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -58,7 +61,7 @@ func (c *KuaiFuImpl) Scan(orderInfo order.OrderInfo, roadInfo road.RoadInfo, mer
|
||||
}
|
||||
// 将金额转为带有2位小数点的float
|
||||
order := fmt.Sprintf("%0.2f", orderInfo.OrderAmount)
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["orderNo"] = orderInfo.BankOrderId
|
||||
params["productName"] = orderInfo.ShopName
|
||||
params["orderPeriod"] = orderInfo.OrderPeriod
|
||||
@@ -74,14 +77,14 @@ func (c *KuaiFuImpl) Scan(orderInfo order.OrderInfo, roadInfo road.RoadInfo, mer
|
||||
|
||||
req := httplib.Post(KF_SCAN_HOST)
|
||||
for k, v := range params {
|
||||
req.Param(k, v)
|
||||
req.Param(k, convertor.ToString(v))
|
||||
}
|
||||
var scanData supplier.ScanData
|
||||
scanData.Supplier = orderInfo.PayProductCode
|
||||
scanData.PayType = orderInfo.PayTypeCode
|
||||
scanData.OrderNo = orderInfo.MerchantOrderId
|
||||
scanData.BankNo = orderInfo.BankOrderId
|
||||
scanData.OrderPrice = params["orderPrice"]
|
||||
scanData.OrderPrice = convertor.ToString(params["orderPrice"])
|
||||
response, err := req.String()
|
||||
if err != nil {
|
||||
logs.Error("KF 请求失败:", err)
|
||||
@@ -105,7 +108,6 @@ func (c *KuaiFuImpl) Scan(orderInfo order.OrderInfo, roadInfo road.RoadInfo, mer
|
||||
|
||||
// 支付回调
|
||||
func (c *KuaiFuImpl) PayNotify() {
|
||||
params := make(map[string]string)
|
||||
orderNo := strings.TrimSpace(c.GetString("orderNo"))
|
||||
orderInfo := order.GetOrderByBankOrderId(orderNo)
|
||||
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||
@@ -123,6 +125,7 @@ func (c *KuaiFuImpl) PayNotify() {
|
||||
logs.Error("快付回调失败,该商户不存在或者已经删除,商户uid=", merchantUid)
|
||||
c.StopRun()
|
||||
}
|
||||
params := make(map[string]any)
|
||||
paySecret := merchantInfo.MerchantSecret
|
||||
params["orderNo"] = orderNo
|
||||
params["orderPrice"] = strings.TrimSpace(c.GetString("orderPrice"))
|
||||
@@ -141,13 +144,13 @@ func (c *KuaiFuImpl) PayNotify() {
|
||||
c.StopRun()
|
||||
}
|
||||
// 实际支付金额
|
||||
factAmount, err := strconv.ParseFloat(params["orderPrice"], 64)
|
||||
factAmount, err := strconv.ParseFloat(convertor.ToString(params["orderPrice"]), 64)
|
||||
if err != nil {
|
||||
logs.Error("快付回调实际金额有误, factAmount=", params["orderPrice"])
|
||||
c.StopRun()
|
||||
}
|
||||
orderInfo.FactAmount = factAmount
|
||||
orderInfo.BankTransId = params["trxNo"]
|
||||
orderInfo.BankTransId = convertor.ToString(params["trxNo"])
|
||||
tradeStatus := params["tradeStatus"]
|
||||
if tradeStatus == "FAILED" {
|
||||
if !service.SolvePayFail(orderInfo.BankOrderId, "") {
|
||||
@@ -171,7 +174,7 @@ func (c *KuaiFuImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo)
|
||||
logs.Error("订单已经被处理,不需要查询,bankOrderId:", orderInfo.BankOrderId)
|
||||
return false
|
||||
}
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["orderNo"] = orderInfo.BankOrderId
|
||||
params["payKey"] = KF_PAY_KEY
|
||||
paySecret := KF_PAY_SECRET
|
||||
@@ -179,7 +182,7 @@ func (c *KuaiFuImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo)
|
||||
params["sign"] = utils.GetMD5Sign(params, keys, paySecret)
|
||||
req := httplib.Get(KF_ORDER_QUERY)
|
||||
for k, v := range params {
|
||||
req.Param(k, v)
|
||||
req.Param(k, convertor.ToString(v))
|
||||
}
|
||||
response, err := req.String()
|
||||
if err != nil {
|
||||
@@ -223,7 +226,7 @@ func (c *KuaiFuImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInf
|
||||
}
|
||||
|
||||
func (c *KuaiFuImpl) PayFor(payFor payfor.PayforInfo) string {
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["merchantKey"] = KF_PAY_KEY
|
||||
params["realname"] = payFor.BankAccountName
|
||||
params["cardNo"] = payFor.BankAccountNo
|
||||
@@ -245,7 +248,7 @@ func (c *KuaiFuImpl) PayFor(payFor payfor.PayforInfo) string {
|
||||
params["sign"] = sign
|
||||
req := httplib.Post(KF_PAYFOR_HOST)
|
||||
for k, v := range params {
|
||||
req.Param(k, v)
|
||||
req.Param(k, convertor.ToString(v))
|
||||
}
|
||||
response, err := req.String()
|
||||
if err != nil {
|
||||
@@ -273,16 +276,17 @@ func (c *KuaiFuImpl) PayForNotify() string {
|
||||
}
|
||||
|
||||
func (c *KuaiFuImpl) PayForQuery(payFor payfor.PayforInfo) (string, string) {
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["merchantKey"] = KF_PAY_KEY
|
||||
params["timestamp"] = utils.GetNowTimesTamp()
|
||||
params["merchantOrderId"] = payFor.BankOrderId
|
||||
keys := utils.SortMap(params)
|
||||
keys := maputil.Keys(params)
|
||||
sort.Strings(keys)
|
||||
sign := utils.GetMD5Sign(params, keys, KF_PAY_SECRET)
|
||||
params["sign"] = sign
|
||||
req := httplib.Get(KF_PAYFOR_QUERY)
|
||||
for k, v := range params {
|
||||
req.Param(k, v)
|
||||
req.Param(k, convertor.ToString(v))
|
||||
}
|
||||
response, err := req.String()
|
||||
if err != nil {
|
||||
@@ -325,16 +329,17 @@ func (c *KuaiFuImpl) PayForQuery(payFor payfor.PayforInfo) (string, string) {
|
||||
}
|
||||
|
||||
func (c *KuaiFuImpl) BalanceQuery(roadInfo road.RoadInfo) float64 {
|
||||
params := make(map[string]string)
|
||||
params["merchantKey"] = KF_PAY_KEY
|
||||
params["timestamp"] = utils.GetNowTimesTamp()
|
||||
params["merchantOrderId"] = xid.New().String()
|
||||
params := map[string]any{
|
||||
"merchantKey": KF_PAY_KEY,
|
||||
"timestamp": utils.GetNowTimesTamp(),
|
||||
"merchantOrderId": xid.New().String(),
|
||||
}
|
||||
keys := utils.SortMap(params)
|
||||
sign := utils.GetMD5Sign(params, keys, KF_PAY_SECRET)
|
||||
params["sign"] = sign
|
||||
req := httplib.Get(KF_BALANCE_QUERY)
|
||||
for k, v := range params {
|
||||
req.Param(k, v)
|
||||
req.Param(k, convertor.ToString(v))
|
||||
}
|
||||
|
||||
response, err := req.String()
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"gateway/internal/utils"
|
||||
"github.com/beego/beego/v2/client/httplib"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -44,7 +45,7 @@ func (c *MFCardV2Impl) SendCard(jsonStr string, cardInfo supplier.RedeemCardInfo
|
||||
}
|
||||
cfg := config.Config{}
|
||||
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["app_key"] = appKey
|
||||
params["goods_sku"] = goodsSku // 卡片类型
|
||||
params["face_val"] = cardInfo.FaceType // 提交面值
|
||||
@@ -171,7 +172,7 @@ func (c *MFCardV2Impl) kMEncrypt(kf, appSecret string) (string, error) {
|
||||
|
||||
func (c *MFCardV2Impl) PayNotify() {
|
||||
logs.Info("消息回调成功!!!")
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
attach := strings.TrimSpace(c.GetString("attach"))
|
||||
orderInfo := order.GetOrderByBankOrderId(attach) // OrderId
|
||||
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||
@@ -220,24 +221,24 @@ func (c *MFCardV2Impl) PayNotify() {
|
||||
return
|
||||
}
|
||||
// 实际支付金额
|
||||
factAmount, err := strconv.ParseFloat(params["amount"], 64)
|
||||
factAmount, err := strconv.ParseFloat(convertor.ToString(params["amount"]), 64)
|
||||
if err != nil {
|
||||
orderInfo.FactAmount = 0
|
||||
}
|
||||
if params["status"] == "8" { // 失败
|
||||
logs.Info("【MF178】回调失败,订单信息", params)
|
||||
if !service.SolvePayFail(params["order_id"], "") {
|
||||
if !service.SolvePayFail(convertor.ToString(params["order_id"]), "") {
|
||||
logs.Error("solve order fail fail")
|
||||
}
|
||||
} else if params["status"] == "9" && factAmount == orderInfo.FactAmount {
|
||||
// TODO 订单支付成功
|
||||
service.SolvePaySuccess(params["order_id"], factAmount, params["order_id"])
|
||||
service.SolvePaySuccess(convertor.ToString(params["order_id"]), factAmount, convertor.ToString(params["order_id"]))
|
||||
}
|
||||
c.Ctx.WriteString("SUCCESS")
|
||||
}
|
||||
|
||||
func (c *MFCardV2Impl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -300,7 +301,7 @@ func (c *MFCardV2Impl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInf
|
||||
}
|
||||
|
||||
func (c *MFCardV2Impl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
//"attach":"6666clcqg5u5n2ns7394hm3g","callback_url":"http://121.37.253.228:12309/mfcard/notifyV2","card_no":"123456","card_pwd":"7Bnu42gE1aUi/eDzruO7Rw==","face_val":"100","goods_sku":"SK000116","sign":"c94152fc05772c4510b3f097f9d70519","timestamp":"1700374551"}
|
||||
|
||||
func TestMFCardV3Impl_Scan(t *testing.T) {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
params["goods_sku"] = "SK000116"
|
||||
params["card_no"] = "2326992090143908695" // 卡号
|
||||
params["card_pwd"] = "Shyk7ZQNLPB39DH3FvX34w==" // 时间戳
|
||||
|
||||
@@ -205,7 +205,7 @@ func (c *TMAllGameImpl) PayNotify() {
|
||||
}
|
||||
|
||||
func (c *TMAllGameImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -268,7 +268,7 @@ func (c *TMAllGameImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadIn
|
||||
}
|
||||
|
||||
func (c *TMAllGameImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
|
||||
@@ -251,7 +251,7 @@ func (c *WalMartImpl) PayNotify() {
|
||||
}
|
||||
|
||||
func (c *WalMartImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -314,7 +314,7 @@ func (c *WalMartImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo
|
||||
}
|
||||
|
||||
func (c *WalMartImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
|
||||
@@ -202,7 +202,7 @@ func (c *WalmartSelfImpl) PayNotify() {
|
||||
}
|
||||
|
||||
func (c *WalmartSelfImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo) bool {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
@@ -260,7 +260,7 @@ func (c *WalmartSelfImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.Road
|
||||
}
|
||||
|
||||
func (c *WalmartSelfImpl) PayQueryV2(orderInfo order.OrderInfo, roadInfo road.RoadInfo) supply_model.MsgModel {
|
||||
params := map[string]string{}
|
||||
params := map[string]any{}
|
||||
|
||||
cardData, err := sonic.GetFromString(orderInfo.CardReturnData)
|
||||
if err != nil {
|
||||
|
||||
@@ -20,13 +20,11 @@ func TestAppleCardImpl_BalanceQuery(t *testing.T) {
|
||||
type args struct {
|
||||
roadInfo road.RoadInfo
|
||||
}
|
||||
tests := []struct {
|
||||
var tests []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want float64
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
@@ -71,12 +69,10 @@ func TestAppleCardImpl_PayForNotify(t *testing.T) {
|
||||
type fields struct {
|
||||
Controller web.Controller
|
||||
}
|
||||
tests := []struct {
|
||||
var tests []struct {
|
||||
name string
|
||||
fields fields
|
||||
want string
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
@@ -270,14 +266,12 @@ func TestAppleCardImpl_kMEncrypt(t *testing.T) {
|
||||
kf string
|
||||
appSecret string
|
||||
}
|
||||
tests := []struct {
|
||||
var tests []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
||||
@@ -51,6 +51,7 @@ type OrderInfo struct {
|
||||
Ip string
|
||||
TransactionType string
|
||||
IsIpRestricted int
|
||||
PayUrl string
|
||||
}
|
||||
|
||||
const ORDER_INFO = "order_info"
|
||||
|
||||
@@ -27,7 +27,7 @@ func (c *MerchantQueryController) OrderQuery() {
|
||||
orderNo := strings.TrimSpace(c.GetString("orderNo"))
|
||||
payKey := strings.TrimSpace(c.GetString("payKey"))
|
||||
sign := strings.TrimSpace(c.GetString("sign"))
|
||||
params := make(map[string]string)
|
||||
params := make(map[string]any)
|
||||
params["orderNo"] = orderNo
|
||||
params["payKey"] = payKey
|
||||
|
||||
@@ -54,7 +54,7 @@ func (c *MerchantQueryController) OrderQuery() {
|
||||
_ = c.ServeJSON()
|
||||
return
|
||||
}
|
||||
p := make(map[string]string)
|
||||
p := make(map[string]any)
|
||||
p["orderNo"] = orderNo
|
||||
p["orderTime"] = strings.TrimSpace(strings.Replace("-", "", orderInfo.UpdateTime.Format("2006-01-02 15:04:05"), -1))
|
||||
p["trxNo"] = orderInfo.BankOrderId
|
||||
|
||||
@@ -17,8 +17,8 @@ type CreatedOrder struct {
|
||||
}
|
||||
|
||||
// ToMap 转换为map类型
|
||||
func (c *CreatedOrder) ToMap() map[string]string {
|
||||
data := map[string]string{
|
||||
func (c *CreatedOrder) ToMap() map[string]any {
|
||||
data := map[string]any{
|
||||
"payKey": c.PayKey,
|
||||
"orderNo": c.OrderNo,
|
||||
"orderPrice": strconv.FormatFloat(c.OrderPrice, 'g', -1, 64),
|
||||
@@ -33,7 +33,7 @@ func (c *CreatedOrder) ToMap() map[string]string {
|
||||
keyList = append(keyList, key)
|
||||
}
|
||||
sort.Strings(keyList)
|
||||
sortedData := map[string]string{}
|
||||
sortedData := map[string]any{}
|
||||
for _, key := range keyList {
|
||||
sortedData[key] = data[key]
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
)
|
||||
|
||||
type PayBaseResp struct {
|
||||
Params map[string]string // 请求的基本参数
|
||||
Params map[string]any // 请求的基本参数
|
||||
ClientIP string // 商户ip
|
||||
MerchantInfo merchant.MerchantInfo // 商户信息
|
||||
Msg string // 信息
|
||||
|
||||
@@ -8,15 +8,16 @@ import (
|
||||
"gateway/internal/models/merchant"
|
||||
"gateway/internal/schema/response"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// GetMerchantInfoByUID 获取商户信息
|
||||
func GetMerchantInfoByUID(params map[string]string) *response.PayBaseResp {
|
||||
func GetMerchantInfoByUID(params map[string]any) *response.PayBaseResp {
|
||||
c := new(response.PayBaseResp)
|
||||
c.Params = make(map[string]string)
|
||||
c.Params = make(map[string]any)
|
||||
c.Params = params
|
||||
merchantInfo := merchant.GetMerchantByUid(params["MerchantUid"])
|
||||
merchantInfo := merchant.GetMerchantByUid(convertor.ToString(params["MerchantUid"]))
|
||||
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "商户不存在,或者paykey有误,请联系管理员"
|
||||
@@ -43,11 +44,11 @@ func GetMerchantInfoByPayKey(payKey string) (merchantInfo merchant.MerchantInfo,
|
||||
}
|
||||
|
||||
// GetMerchantInfo 获取商户信息
|
||||
func GetMerchantInfo(params map[string]string) *response.PayBaseResp {
|
||||
func GetMerchantInfo(params map[string]any) *response.PayBaseResp {
|
||||
c := new(response.PayBaseResp)
|
||||
c.Params = make(map[string]string)
|
||||
c.Params = make(map[string]any)
|
||||
c.Params = params
|
||||
merchantInfo := merchant.GetMerchantByPasskey(params["payKey"])
|
||||
merchantInfo := merchant.GetMerchantByPasskey(convertor.ToString(params["payKey"]))
|
||||
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "商户不存在,或者paykey有误,请联系管理员"
|
||||
@@ -70,13 +71,13 @@ func JudgeParams(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
}
|
||||
|
||||
func ExValueIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
if c.Params["exValue"] == "" || len(c.Params["exValue"]) == 0 {
|
||||
if c.Params["exValue"] == "" || len(convertor.ToString(c.Params["exValue"])) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "扩展参数不能为空"
|
||||
}
|
||||
isRedeemValid := true
|
||||
exRedeemValue := supplier.RedeemCardInfo{}
|
||||
if err := json.Unmarshal([]byte(c.Params["exValue"]), &exRedeemValue); err != nil {
|
||||
if err := json.Unmarshal([]byte(convertor.ToString(c.Params["exValue"])), &exRedeemValue); err != nil {
|
||||
logs.Error("提交卡密格式错误,请检查", c.Params["exValue"], err)
|
||||
isRedeemValid = false
|
||||
}
|
||||
@@ -121,7 +122,7 @@ func CompleteRechargeExValue(exValueStr string, faceValue string) (string, error
|
||||
|
||||
// NotifyUrlIsValid 判断回调地址是否符合规则
|
||||
func NotifyUrlIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
if c.Params["notifyUrl"] == "" || len(c.Params["notifyUrl"]) == 0 {
|
||||
if c.Params["notifyUrl"] == "" || len(convertor.ToString(c.Params["notifyUrl"])) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "订单回调不能为空"
|
||||
}
|
||||
@@ -130,7 +131,7 @@ func NotifyUrlIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
|
||||
// OsTypeIsValid 判断设备类型是否符合规则
|
||||
func OsTypeIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
if c.Params["osType"] == "" || len(c.Params["osType"]) == 0 {
|
||||
if c.Params["osType"] == "" || len(convertor.ToString(c.Params["osType"])) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "支付设备系统类型不能为空,默认填写\"1\"即可"
|
||||
}
|
||||
@@ -138,7 +139,7 @@ func OsTypeIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
}
|
||||
|
||||
func OrderPeriodIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
if c.Params["orderPeriod"] == "" || len(c.Params["orderPeriod"]) == 0 {
|
||||
if c.Params["orderPeriod"] == "" || len(convertor.ToString(c.Params["orderPeriod"])) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "订单过期时间不能为空,默认填写\"1\"即可"
|
||||
}
|
||||
@@ -148,13 +149,13 @@ func OrderPeriodIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
|
||||
// OrderPriceIsValid 判断订单金额
|
||||
func OrderPriceIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
if c.Params["orderPrice"] == "" || len(c.Params["orderPrice"]) == 0 {
|
||||
if c.Params["orderPrice"] == "" || len(convertor.ToString(c.Params["orderPrice"])) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "订单金额不能为空"
|
||||
return c
|
||||
}
|
||||
|
||||
a, err := strconv.ParseFloat(c.Params["orderPrice"], 64)
|
||||
a, err := strconv.ParseFloat(convertor.ToString(c.Params["orderPrice"]), 64)
|
||||
if err != nil {
|
||||
logs.Error("order price is invalid: ", c.Params["orderPrice"])
|
||||
c.Code = -1
|
||||
@@ -167,7 +168,7 @@ func OrderPriceIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
|
||||
// OrderIsValid 判断金额订单号是否为空或者有重复
|
||||
func OrderIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
if c.Params["orderNo"] == "" || len(c.Params["orderNo"]) == 0 {
|
||||
if c.Params["orderNo"] == "" || len(convertor.ToString(c.Params["orderNo"])) == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "商户订单号不能为空"
|
||||
return c
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"gateway/internal/models/road"
|
||||
"gateway/internal/schema/response"
|
||||
"gateway/internal/utils"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -24,17 +25,17 @@ import (
|
||||
)
|
||||
|
||||
// AutoPayFor 程序自动代付
|
||||
func AutoPayFor(params map[string]string, giveType string) *response.PayForResponse {
|
||||
func AutoPayFor(params map[string]any, giveType string) *response.PayForResponse {
|
||||
payForResponse := new(response.PayForResponse)
|
||||
|
||||
merchantInfo := merchant.GetMerchantByPasskey(params["merchantKey"])
|
||||
merchantInfo := merchant.GetMerchantByPasskey(convertor.ToString(params["merchantKey"]))
|
||||
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
|
||||
logs.Error(fmt.Sprintf("下游商户代付请求,签名失败,商户信息: %+v", merchantInfo))
|
||||
payForResponse.ResultCode = "01"
|
||||
payForResponse.ResultMsg = "下游商户代付请求,签名失败。"
|
||||
return payForResponse
|
||||
} else {
|
||||
res, msg := checkSettAmount(params["amount"])
|
||||
res, msg := checkSettAmount(convertor.ToString(params["amount"]))
|
||||
if !res {
|
||||
payForResponse.ResultCode = "01"
|
||||
payForResponse.ResultMsg = msg
|
||||
@@ -42,7 +43,7 @@ func AutoPayFor(params map[string]string, giveType string) *response.PayForRespo
|
||||
return payForResponse
|
||||
}
|
||||
|
||||
exist := payfor.IsExistPayForByMerchantOrderId(params["merchantOrderId"])
|
||||
exist := payfor.IsExistPayForByMerchantOrderId(convertor.ToString(params["merchantOrderId"]))
|
||||
if exist {
|
||||
logs.Error(fmt.Sprintf("代付订单号重复:merchantOrderId = %s", params["merchantOrderId"]))
|
||||
payForResponse.ResultMsg = "商户订单号重复"
|
||||
@@ -51,7 +52,7 @@ func AutoPayFor(params map[string]string, giveType string) *response.PayForRespo
|
||||
return payForResponse
|
||||
}
|
||||
|
||||
settAmount, err := strconv.ParseFloat(params["amount"], 64)
|
||||
settAmount, err := strconv.ParseFloat(convertor.ToString(params["amount"]), 64)
|
||||
if err != nil {
|
||||
logs.Error("代付的金额错误:", err)
|
||||
payForResponse.ResultMsg = "代付金额错误"
|
||||
@@ -63,16 +64,16 @@ func AutoPayFor(params map[string]string, giveType string) *response.PayForRespo
|
||||
PayforUid: "pppp" + xid.New().String(),
|
||||
MerchantUid: merchantInfo.MerchantUid,
|
||||
MerchantName: merchantInfo.MerchantName,
|
||||
MerchantOrderId: params["merchantOrderId"],
|
||||
MerchantOrderId: convertor.ToString(params["merchantOrderId"]),
|
||||
BankOrderId: "4444" + xid.New().String(),
|
||||
PayforAmount: settAmount,
|
||||
Status: config.PAYFOR_COMFRIM,
|
||||
BankAccountName: params["realname"],
|
||||
BankAccountNo: params["cardNo"],
|
||||
BankAccountType: params["accType"],
|
||||
City: params["city"],
|
||||
Ares: params["province"] + params["city"],
|
||||
PhoneNo: params["mobileNo"],
|
||||
BankAccountName: convertor.ToString(params["realname"]),
|
||||
BankAccountNo: convertor.ToString(params["cardNo"]),
|
||||
BankAccountType: convertor.ToString(params["accType"]),
|
||||
City: convertor.ToString(params["city"]),
|
||||
Ares: convertor.ToString(params["province"]) + convertor.ToString(params["city"]),
|
||||
PhoneNo: convertor.ToString(params["mobileNo"]),
|
||||
GiveType: giveType,
|
||||
CreateTime: time.Now(),
|
||||
UpdateTime: time.Now(),
|
||||
@@ -89,8 +90,8 @@ func AutoPayFor(params map[string]string, giveType string) *response.PayForRespo
|
||||
} else {
|
||||
payForResponse.ResultMsg = "代付订单已生成"
|
||||
payForResponse.ResultCode = "00"
|
||||
payForResponse.SettAmount = params["amount"]
|
||||
payForResponse.MerchantOrderId = params["MerchantOrderId"]
|
||||
payForResponse.SettAmount = convertor.ToString(params["amount"])
|
||||
payForResponse.MerchantOrderId = convertor.ToString(params["MerchantOrderId"])
|
||||
|
||||
p = payfor.GetPayForByBankOrderId(p.BankOrderId)
|
||||
|
||||
@@ -264,16 +265,16 @@ func RequestPayFor(p payfor.PayforInfo) {
|
||||
}
|
||||
|
||||
// PayForResultQuery 代付结果查询
|
||||
func PayForResultQuery(params map[string]string) string {
|
||||
query := make(map[string]string)
|
||||
func PayForResultQuery(params map[string]any) string {
|
||||
query := make(map[string]any)
|
||||
query["merchantOrderId"] = params["merchantOrderId"]
|
||||
merchantInfo := merchant.GetMerchantByPasskey(params["merchantKey"])
|
||||
merchantInfo := merchant.GetMerchantByPasskey(convertor.ToString(params["merchantKey"]))
|
||||
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
|
||||
query["resultMsg"] = "签名错误"
|
||||
query["settStatus"] = "03"
|
||||
query["sign"] = utils.GetMD5Sign(params, utils.SortMap(params), merchantInfo.MerchantSecret)
|
||||
} else {
|
||||
payForInfo := payfor.GetPayForByMerchantOrderId(params["merchantOrderId"])
|
||||
payForInfo := payfor.GetPayForByMerchantOrderId(convertor.ToString(params["merchantOrderId"]))
|
||||
if payForInfo.BankOrderId == "" {
|
||||
query["resultMsg"] = "不存在这样的代付订单"
|
||||
query["settStatus"] = "03"
|
||||
@@ -312,10 +313,10 @@ func PayForResultQuery(params map[string]string) string {
|
||||
}
|
||||
|
||||
// BalanceQuery 商户查询余额
|
||||
func BalanceQuery(params map[string]string) string {
|
||||
func BalanceQuery(params map[string]any) string {
|
||||
balanceResponse := new(response.BalanceResponse)
|
||||
str := ""
|
||||
merchantInfo := merchant.GetMerchantByPasskey(params["merchantKey"])
|
||||
merchantInfo := merchant.GetMerchantByPasskey(convertor.ToString(params["merchantKey"]))
|
||||
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
|
||||
balanceResponse.ResultCode = "-1"
|
||||
balanceResponse.ResultMsg = "签名错误"
|
||||
@@ -323,7 +324,7 @@ func BalanceQuery(params map[string]string) string {
|
||||
str = string(mJson)
|
||||
} else {
|
||||
accountInfo := accounts.GetAccountByUid(merchantInfo.MerchantUid)
|
||||
tmp := make(map[string]string)
|
||||
tmp := make(map[string]any)
|
||||
tmp["resultCode"] = "00"
|
||||
tmp["balance"] = strconv.FormatFloat(accountInfo.Balance, 'f', 2, 64)
|
||||
tmp["availableAmount"] = strconv.FormatFloat(accountInfo.SettleAmount, 'f', 2, 64)
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"gateway/internal/schema/request"
|
||||
"gateway/internal/schema/response"
|
||||
"gateway/internal/utils"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
@@ -22,13 +23,13 @@ import (
|
||||
|
||||
// ChooseRoadV2 选择通道,通过productCode选择对应的通道
|
||||
func ChooseRoadV2(c *response.PayBaseResp) *response.PayBaseResp {
|
||||
orderPrice, err := strconv.ParseFloat(c.Params["orderPrice"], 64)
|
||||
orderPrice, err := strconv.ParseFloat(convertor.ToString(c.Params["orderPrice"]), 64)
|
||||
if err != nil {
|
||||
c.Code = -1
|
||||
c.Msg = "输入金额错误!"
|
||||
return c
|
||||
}
|
||||
roadInfo := road.GetRoadInfoByProductCode(c.Params["productCode"])
|
||||
roadInfo := road.GetRoadInfoByProductCode(convertor.ToString(c.Params["productCode"]))
|
||||
if roadInfo.Id == 0 {
|
||||
c.Code = -1
|
||||
c.Msg = "未配置支付通道!"
|
||||
@@ -114,7 +115,7 @@ func GenerateOrderInfo(c *response.PayBaseResp) order.OrderInfo {
|
||||
orderInfo := order.OrderInfo{
|
||||
MerchantUid: c.MerchantInfo.MerchantUid,
|
||||
MerchantName: c.MerchantInfo.MerchantName,
|
||||
MerchantOrderId: c.Params["orderNo"],
|
||||
MerchantOrderId: convertor.ToString(c.Params["orderNo"]),
|
||||
BankOrderId: bankOrderNo,
|
||||
OrderAmount: c.OrderAmount,
|
||||
FactAmount: c.OrderAmount,
|
||||
@@ -124,18 +125,18 @@ func GenerateOrderInfo(c *response.PayBaseResp) order.OrderInfo {
|
||||
RoadUid: c.RoadInfo.RoadUid,
|
||||
RoadName: c.RoadInfo.RoadName,
|
||||
PayProductName: c.RoadInfo.ProductName,
|
||||
ShopName: c.Params["productName"],
|
||||
ShopName: convertor.ToString(c.Params["productName"]),
|
||||
Freeze: config.NO,
|
||||
Refund: config.NO,
|
||||
Unfreeze: config.NO,
|
||||
Ip: c.ClientIP,
|
||||
PayProductCode: c.RoadInfo.ProductUid,
|
||||
Status: config.WAIT,
|
||||
NotifyUrl: c.Params["notifyUrl"],
|
||||
OrderPeriod: c.Params["orderPeriod"],
|
||||
NotifyUrl: convertor.ToString(c.Params["notifyUrl"]),
|
||||
OrderPeriod: convertor.ToString(c.Params["orderPeriod"]),
|
||||
CreateTime: time.Now(),
|
||||
UpdateTime: time.Now(),
|
||||
ExValue: c.Params["exValue"],
|
||||
ExValue: convertor.ToString(c.Params["exValue"]),
|
||||
}
|
||||
|
||||
if c.MerchantInfo.BelongAgentUid != "" || c.AgentRate > config.ZERO {
|
||||
@@ -146,7 +147,7 @@ func GenerateOrderInfo(c *response.PayBaseResp) order.OrderInfo {
|
||||
}
|
||||
|
||||
// CreateOrderInfo 创建订单
|
||||
func CreateOrderInfo(createdOrder request.CreatedOrder, info merchant.MerchantInfo, roadPoolInfo road.RoadPoolInfo, roadInfo road.RoadInfo) (orderInfo order.OrderInfo, err error) {
|
||||
func CreateOrderInfo(createdOrder request.CreatedOrder, info merchant.MerchantInfo, roadPoolInfo road.RoadPoolInfo, roadInfo road.RoadInfo, payUrl string) (orderInfo order.OrderInfo, err error) {
|
||||
// 6666是自己系统订单号
|
||||
// 获取支付类型的名称,例如支付宝扫码等
|
||||
orderInfo = order.OrderInfo{
|
||||
@@ -172,6 +173,7 @@ func CreateOrderInfo(createdOrder request.CreatedOrder, info merchant.MerchantIn
|
||||
OrderPeriod: createdOrder.OrderPeriod,
|
||||
CreateTime: time.Now(),
|
||||
TransactionType: roadInfo.TransactionType,
|
||||
PayUrl: payUrl,
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -206,7 +208,7 @@ func GenerateOrderProfit(orderInfo order.OrderInfo, c *response.PayBaseResp) ord
|
||||
PayProductCode: c.RoadInfo.ProductUid,
|
||||
PayProductName: c.RoadInfo.ProductName,
|
||||
Status: config.WAIT,
|
||||
MerchantOrderId: c.Params["orderNo"],
|
||||
MerchantOrderId: convertor.ToString(c.Params["orderNo"]),
|
||||
BankOrderId: orderInfo.BankOrderId,
|
||||
OrderAmount: c.OrderAmount,
|
||||
FactAmount: c.OrderAmount,
|
||||
@@ -296,8 +298,8 @@ func CreateOrderProfitInfo(createdOrder request.CreatedOrder, merchantInfo merch
|
||||
// GenerateRecord 生成订单一系列的记录
|
||||
func GenerateRecord(c *response.PayBaseResp) (order.OrderInfo, order.OrderProfitInfo, error) {
|
||||
// 获取订单和订单利润表
|
||||
orderInfo := order.GetOrderByMerchantOrderId(c.Params["orderNo"])
|
||||
orderProfitInfo := order.GetOrderProfitByMerchantOrderId(c.Params["orderNo"])
|
||||
orderInfo := order.GetOrderByMerchantOrderId(convertor.ToString(c.Params["orderNo"]))
|
||||
orderProfitInfo := order.GetOrderProfitByMerchantOrderId(convertor.ToString(c.Params["orderNo"]))
|
||||
if orderProfitInfo.Id == 0 || orderInfo.MerchantOrderId == "" {
|
||||
//生成订单记录,订单利润利润
|
||||
orderInfo = GenerateOrderInfo(c)
|
||||
@@ -317,25 +319,25 @@ func GenerateRecord(c *response.PayBaseResp) (order.OrderInfo, order.OrderProfit
|
||||
err := errors.New("当前订单已存在,请等待处理结果或手动查询")
|
||||
return orderInfo, orderProfitInfo, err
|
||||
}
|
||||
if !order.InsertOrderExValue(c.Params["orderNo"], c.Params["exValue"]) {
|
||||
if !order.InsertOrderExValue(convertor.ToString(c.Params["orderNo"]), convertor.ToString(c.Params["exValue"])) {
|
||||
err := errors.New("订单数据插入失败")
|
||||
return orderInfo, orderProfitInfo, err
|
||||
}
|
||||
if !order.InsertPayTime(c.Params["orderNo"]) {
|
||||
if !order.InsertPayTime(convertor.ToString(c.Params["orderNo"])) {
|
||||
err := errors.New("订单数据插入失败")
|
||||
return orderInfo, orderProfitInfo, err
|
||||
}
|
||||
if !order.SwitchOrderAndOrderProfitStatus(c.Params["orderNo"], config.WAIT) {
|
||||
if !order.SwitchOrderAndOrderProfitStatus(convertor.ToString(c.Params["orderNo"]), config.WAIT) {
|
||||
err := errors.New("订单状态转换失败")
|
||||
return orderInfo, orderProfitInfo, err
|
||||
}
|
||||
orderInfo = order.GetOrderByMerchantOrderId(c.Params["orderNo"])
|
||||
orderInfo = order.GetOrderByMerchantOrderId(convertor.ToString(c.Params["orderNo"]))
|
||||
logs.Info("插入支付订单记录和支付利润记录成功")
|
||||
return orderInfo, orderProfitInfo, nil
|
||||
}
|
||||
|
||||
func GenerateSuccessData(scanData supplier.ScanData, c *response.PayBaseResp) *response.ScanSuccessData {
|
||||
params := map[string]string{
|
||||
params := map[string]any{
|
||||
"statusCode": "00",
|
||||
"orderNo": scanData.BankNo,
|
||||
"orderPrice": scanData.OrderPrice,
|
||||
@@ -358,8 +360,9 @@ func GenerateSuccessData(scanData supplier.ScanData, c *response.PayBaseResp) *r
|
||||
return scanSuccessData
|
||||
}
|
||||
|
||||
func CreateOrderInfoAndOrderProfitInfo(createdOrder request.CreatedOrder, info merchant.MerchantInfo) (roadInfo road.RoadInfo, err error) {
|
||||
roadInfo = road.GetRoadInfoByProductCode(createdOrder.ProductCode)
|
||||
func CreateOrderInfoAndOrderProfitInfo(createdOrder request.CreatedOrder, info merchant.MerchantInfo, payUrl string) (err error) {
|
||||
roadInfo := road.GetRoadInfoByProductCode(createdOrder.ProductCode)
|
||||
|
||||
if roadInfo.Id == 0 {
|
||||
err = errors.New("未配置支付方式")
|
||||
return
|
||||
@@ -370,6 +373,7 @@ func CreateOrderInfoAndOrderProfitInfo(createdOrder request.CreatedOrder, info m
|
||||
err = errors.New(msg)
|
||||
return
|
||||
}
|
||||
|
||||
merchantDeploy := merchant_deploy.GetMerchantDeployByUidAndRoadUid(
|
||||
info.MerchantUid,
|
||||
roadInfo.RoadUid,
|
||||
@@ -378,25 +382,30 @@ func CreateOrderInfoAndOrderProfitInfo(createdOrder request.CreatedOrder, info m
|
||||
err = errors.New("当前用户未配置支付方式")
|
||||
return
|
||||
}
|
||||
|
||||
roadPoolInfo := road.GetRoadPoolByRoadPoolCode(merchantDeploy.RollRoadCode)
|
||||
if roadPoolInfo.Id == 0 {
|
||||
err = errors.New("当前用户未配置支付方式")
|
||||
return
|
||||
}
|
||||
orderInfo, err := CreateOrderInfo(createdOrder, info, roadPoolInfo, roadInfo)
|
||||
|
||||
orderInfo, err := CreateOrderInfo(createdOrder, info, roadPoolInfo, roadInfo, payUrl)
|
||||
if err != nil {
|
||||
err = errors.Join(err, errors.New("创建订单失败"))
|
||||
return
|
||||
}
|
||||
|
||||
orderProfitInfo, err := CreateOrderProfitInfo(createdOrder, info, *merchantDeploy, orderInfo, roadInfo)
|
||||
if err != nil {
|
||||
err = errors.Join(err, errors.New("创建订单失败"))
|
||||
return
|
||||
}
|
||||
|
||||
if !order.InsertOrderAndOrderProfit(orderInfo, orderProfitInfo) {
|
||||
err = errors.Join(err, errors.New("创建订单失败"))
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"gateway/internal/models/road"
|
||||
"gateway/internal/utils"
|
||||
"github.com/bytedance/gopkg/util/gopool"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"time"
|
||||
@@ -470,28 +471,26 @@ func CreateOrderNotifyInfo(orderInfo order.OrderInfo, tradeStatus string) {
|
||||
|
||||
merchantInfo := merchant.GetMerchantByUid(orderInfo.MerchantUid)
|
||||
|
||||
params := make(map[string]string)
|
||||
params["orderNo"] = orderInfo.MerchantOrderId
|
||||
params["orderPrice"] = strconv.FormatFloat(orderInfo.OrderAmount, 'f', 2, 64)
|
||||
params["factPrice"] = strconv.FormatFloat(orderInfo.FactAmount, 'f', 2, 64)
|
||||
params["orderTime"] = utils.GetDateTimeNot()
|
||||
if orderInfo.BankTransId != "" {
|
||||
params["trxNo"] = orderInfo.BankTransId
|
||||
} else {
|
||||
params["trxNo"] = orderInfo.BankOrderId
|
||||
}
|
||||
statusCode := ""
|
||||
if tradeStatus == "success" {
|
||||
params["statusCode"] = "01"
|
||||
statusCode = "01"
|
||||
} else {
|
||||
params["statusCode"] = "00"
|
||||
statusCode = "00"
|
||||
}
|
||||
params := map[string]any{
|
||||
"orderNo": orderInfo.MerchantOrderId,
|
||||
"orderPrice": strconv.FormatFloat(orderInfo.OrderAmount, 'f', 2, 64),
|
||||
"factPrice": strconv.FormatFloat(orderInfo.FactAmount, 'f', 2, 64),
|
||||
"orderTime": utils.GetDateTimeNot(),
|
||||
"trxNo": orderInfo.BankOrderId,
|
||||
"payKey": merchantInfo.MerchantKey,
|
||||
"statusCode": statusCode,
|
||||
"tradeStatus": tradeStatus,
|
||||
}
|
||||
params["tradeStatus"] = tradeStatus
|
||||
params["payKey"] = merchantInfo.MerchantKey
|
||||
params["sign"] = utils.GetMD5SignMF(params, merchantInfo.MerchantSecret)
|
||||
logs.Info("商户回调地址:", orderInfo.NotifyUrl, "商户回调参数", params)
|
||||
u := url.Values{}
|
||||
for k, v := range params {
|
||||
u.Add(k, v)
|
||||
u.Add(k, convertor.ToString(v))
|
||||
}
|
||||
notifyInfo.Url = orderInfo.NotifyUrl + "?" + u.Encode()
|
||||
if notify.InsertNotifyInfo(*notifyInfo) {
|
||||
|
||||
@@ -1,49 +1,22 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"gateway/internal/models/order"
|
||||
"gateway/internal/utils"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestCreateOrderNotifyInfo(t *testing.T) {
|
||||
CreateOrderNotifyInfo(order.OrderInfo{
|
||||
Id: 0,
|
||||
ShopName: "",
|
||||
OrderPeriod: "",
|
||||
MerchantOrderId: "S2024060321271410851",
|
||||
BankOrderId: "",
|
||||
BankTransId: "",
|
||||
OrderAmount: 100.00,
|
||||
ShowAmount: 0,
|
||||
FactAmount: 0,
|
||||
RollPoolCode: "",
|
||||
RollPoolName: "",
|
||||
RoadUid: "",
|
||||
RoadName: "",
|
||||
PayProductName: "",
|
||||
PayProductCode: "",
|
||||
PayTypeCode: "",
|
||||
PayTypeName: "",
|
||||
OsType: "",
|
||||
Status: "",
|
||||
Refund: "",
|
||||
RefundTime: "",
|
||||
Freeze: "",
|
||||
FreezeTime: "",
|
||||
Unfreeze: "",
|
||||
UnfreezeTime: "",
|
||||
NotifyUrl: "",
|
||||
MerchantUid: "",
|
||||
MerchantName: "",
|
||||
AgentUid: "",
|
||||
AgentName: "",
|
||||
ExValue: "",
|
||||
CardData: "",
|
||||
CreateTime: time.Time{},
|
||||
UpdateTime: time.Time{},
|
||||
PayTime: time.Time{},
|
||||
Operator: "",
|
||||
CardReturnData: "",
|
||||
}, "success")
|
||||
params := map[string]any{
|
||||
"orderNo": "P1898889438818340872",
|
||||
"orderPrice": "100.00",
|
||||
"factPrice": "100.00",
|
||||
"orderTime": "2025011822:34:13",
|
||||
"trxNo": "6666cu5rl70gdv0c7385t0t0",
|
||||
"payKey": "kkkkcu5go30gdv0c73fo7g8g",
|
||||
"statusCode": "01",
|
||||
"tradeStatus": "success",
|
||||
}
|
||||
sign := utils.GetMD5SignMF(params, "sssscu5go30gdv0c73fo7g90")
|
||||
logs.Info("签名结果:", sign)
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ package utils
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -29,10 +30,10 @@ func GetMD5Upper(s string) string {
|
||||
}
|
||||
|
||||
// MapToString 将map数据变成key=value形式的字符串
|
||||
func MapToString(m map[string]string) string {
|
||||
func MapToString(m map[string]any) string {
|
||||
res := ""
|
||||
for k, v := range m {
|
||||
res = res + k + "=" + v + "&"
|
||||
res = res + k + "=" + convertor.ToString(v) + "&"
|
||||
}
|
||||
|
||||
suffix := strings.TrimSuffix(res, "&")
|
||||
|
||||
@@ -1,43 +1,29 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func GetMD5Sign(params map[string]string, keys []string, paySecret string) string {
|
||||
func GetMD5Sign(params map[string]any, keys []string, paySecret string) string {
|
||||
str := ""
|
||||
for i := 0; i < len(keys); i++ {
|
||||
k := keys[i]
|
||||
if len(params[k]) == 0 || k == "sign" {
|
||||
if len(convertor.ToString(params[k])) == 0 || k == "sign" {
|
||||
continue
|
||||
}
|
||||
str += k + "=" + params[k] + "&"
|
||||
str += k + "=" + convertor.ToString(params[k]) + "&"
|
||||
}
|
||||
str += "paySecret=" + paySecret
|
||||
sign := GetMD5Upper(str)
|
||||
return sign
|
||||
}
|
||||
|
||||
func GetMD5SignLower(params map[string]string, keys []string, paySecret string) string {
|
||||
func GetMD5SignLower(params map[string]any, keys []string, paySecret string) string {
|
||||
return strings.ToLower(GetMD5Sign(params, keys, paySecret))
|
||||
}
|
||||
|
||||
func GetMD5SignMF(params map[string]string, paySecret string) string {
|
||||
strArr := SortMap(params)
|
||||
signStr := ""
|
||||
for i := 0; i < len(strArr); i++ {
|
||||
k := strArr[i]
|
||||
if len(params[k]) == 0 {
|
||||
signStr += k
|
||||
} else {
|
||||
signStr += k + params[k]
|
||||
}
|
||||
}
|
||||
signStr += paySecret
|
||||
return GetMD5LOWER(signStr)
|
||||
}
|
||||
|
||||
func Md5Verify(params map[string]string, paySecret string) bool {
|
||||
func Md5Verify(params map[string]any, paySecret string) bool {
|
||||
sign := params["sign"]
|
||||
if sign == "" {
|
||||
return false
|
||||
@@ -52,7 +38,7 @@ func Md5Verify(params map[string]string, paySecret string) bool {
|
||||
}
|
||||
}
|
||||
|
||||
func Md5MFVerify(params map[string]string, paySecret string) bool {
|
||||
func Md5MFVerify(params map[string]any, paySecret string) bool {
|
||||
sign := params["sign"]
|
||||
if sign == "" {
|
||||
return false
|
||||
@@ -66,3 +52,18 @@ func Md5MFVerify(params map[string]string, paySecret string) bool {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func GetMD5SignMF(params map[string]any, paySecret string) string {
|
||||
strArr := SortMap(params)
|
||||
signStr := ""
|
||||
for i := 0; i < len(strArr); i++ {
|
||||
k := strArr[i]
|
||||
if len(convertor.ToString(params[k])) == 0 {
|
||||
signStr += k
|
||||
} else {
|
||||
signStr += k + convertor.ToString(params[k])
|
||||
}
|
||||
}
|
||||
signStr += paySecret
|
||||
return GetMD5LOWER(signStr)
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/duke-git/lancet/v2/convertor"
|
||||
"sort"
|
||||
)
|
||||
|
||||
// SortMap 对map的key值进行排序
|
||||
func SortMap(m map[string]string) []string {
|
||||
func SortMap(m map[string]any) []string {
|
||||
var arr []string
|
||||
for k := range m {
|
||||
arr = append(arr, k)
|
||||
@@ -15,12 +16,11 @@ func SortMap(m map[string]string) []string {
|
||||
}
|
||||
|
||||
// SortMapByKeys 按照key的ascii值从小到大给map排序
|
||||
func SortMapByKeys(m map[string]string) map[string]string {
|
||||
func SortMapByKeys(m map[string]any) map[string]any {
|
||||
keys := SortMap(m)
|
||||
tmp := make(map[string]string)
|
||||
tmp := make(map[string]any)
|
||||
for _, key := range keys {
|
||||
tmp[key] = m[key]
|
||||
tmp[key] = convertor.ToString(m[key])
|
||||
}
|
||||
|
||||
return tmp
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user