feat(payment): 优化支付成功逻辑并添加回调信息

- 在多个支付回调处理中添加"支付成功"的备注信息
- 更新 SolvePaySuccess 函数以接收 cardReturnData 参数
- 优化部分代码结构以提高可读性
This commit is contained in:
danial
2025-02-15 10:42:15 +08:00
parent 824165866a
commit 3e7dfcd81d
17 changed files with 46 additions and 57 deletions

1
go.mod
View File

@@ -13,6 +13,7 @@ require (
github.com/duke-git/lancet/v2 v2.3.4
github.com/go-sql-driver/mysql v1.8.1
github.com/go-stomp/stomp/v3 v3.1.3
github.com/google/uuid v1.6.0
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
github.com/pkg/profile v1.7.0
github.com/rs/xid v1.6.0

6
go.sum
View File

@@ -6,8 +6,6 @@ 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=
github.com/bytedance/gopkg v0.1.2-0.20240828084325-780ca9ee70fb/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
github.com/bytedance/sonic v1.12.7 h1:CQU8pxOy9HToxhndH0Kx/S1qU/CuS9GnKYrGioDcU1Q=
github.com/bytedance/sonic v1.12.7/go.mod h1:tnbal4mxOMju17EGfknm2XyYcpyCnIROYOEYuemj13I=
github.com/bytedance/sonic v1.12.8 h1:4xYRVRlXIgvSZ4e8iVTlMF5szgpXd4AfvuWgA8I8lgs=
github.com/bytedance/sonic v1.12.8/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
@@ -44,6 +42,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
@@ -115,8 +115,6 @@ 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-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA=
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=

View File

@@ -34,15 +34,17 @@ func (c *OrderController) OrderUpdate() {
solveType := c.GetString("solveType")
orderInfo := order.GetOrderByBankOrderId(bankOrderId)
orderInfo.Operator = c.GetString("operator")
flag := false
if orderInfo.BankOrderId == "" {
logs.Error("该订单不存在,bankOrderId=", bankOrderId)
} else {
switch solveType {
case config.SUCCESS:
flag = service.SolvePaySuccess(bankOrderId, orderInfo.FactAmount, orderInfo.BankTransId)
flag = service.SolvePaySuccess(bankOrderId, orderInfo.FactAmount, orderInfo.BankTransId, "手动修正至成功")
case config.FAIL:
flag = service.SolvePayFail(bankOrderId, orderInfo.BankTransId, "")
flag = service.SolvePayFail(bankOrderId, orderInfo.BankTransId, "手动修正至失败")
case config.FREEZE_AMOUNT:
// 将这笔订单进行冻结
flag = service.SolveOrderFreeze(bankOrderId)

View File

@@ -22,20 +22,15 @@ type PayForGateway struct {
// PayFor 接受下游商户的代付请求
func (c *PayForGateway) PayFor() {
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"))
// params["bankCode"] = strings.TrimSpace(c.GetString("bankCode"))
params["accType"] = strings.TrimSpace(c.GetString("accType"))
// params["province"] = strings.TrimSpace(c.GetString("province"))
// params["city"] = strings.TrimSpace(c.GetString("city"))
// params["bankAccountAddress"] = strings.TrimSpace(c.GetString("bankAccountAddress"))
params["amount"] = strings.TrimSpace(c.GetString("amount"))
// params["mobileNo"] = strings.TrimSpace(c.GetString("mobileNo"))
params["merchantOrderId"] = strings.TrimSpace(c.GetString("merchantOrderId"))
params["sign"] = strings.TrimSpace(c.GetString("sign"))
params := map[string]any{
"merchantKey": strings.TrimSpace(c.GetString("merchantKey")),
"realname": strings.TrimSpace(c.GetString("realname")),
"cardNo": strings.TrimSpace(c.GetString("cardNo")),
"accType": strings.TrimSpace(c.GetString("accType")),
"amount": strings.TrimSpace(c.GetString("amount")),
"merchantOrderId": strings.TrimSpace(c.GetString("merchantOrderId")),
"sign": strings.TrimSpace(c.GetString("sign")),
}
payForResponse := new(response.PayForResponse)
res, msg := checkParams(params)
if !res {
@@ -50,12 +45,12 @@ func (c *PayForGateway) PayFor() {
// PayForQuery 代付结果查询,
func (c *PayForGateway) PayForQuery() {
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"))
params["sign"] = strings.TrimSpace(c.GetString("sign"))
params := map[string]any{
"merchantKey": strings.TrimSpace(c.GetString("merchantKey")),
"timestamp": strings.TrimSpace(c.GetString("timestamp")),
"merchantOrderId": strings.TrimSpace(c.GetString("merchantOrderId")),
"sign": strings.TrimSpace(c.GetString("sign")),
}
c.Data["json"] = pay_for.PayForResultQuery(params)
_ = c.ServeJSON()
}
@@ -106,11 +101,11 @@ func (c *PayForGateway) SolvePayForResult() {
// Balance 商户查找余额
func (c *PayForGateway) Balance() {
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"))
params := map[string]any{
"merchantKey": strings.TrimSpace(c.GetString("merchantKey")),
"timestamp": strings.TrimSpace(c.GetString("timestamp")),
"sign": strings.TrimSpace(c.GetString("sign")),
}
balanceResponse := new(response.BalanceResponse)
res, msg := checkParams(params)
if !res {

View File

@@ -217,7 +217,7 @@ func (c *AppleCardImpl) PayNotify() {
orderInfo.BankTransId = params["merchantId"]
if params["status"] == "1" {
// TODO 订单支付成功
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"])
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"], "支付成功")
if isOk {
c.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -180,7 +180,7 @@ func (c *AppleCardSharkImpl) PayNotify() {
orderInfo.BankTransId = params["merchantId"]
if params["status"] == "1" {
// TODO 订单支付成功
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"])
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"], "支付成功")
if isOk {
c.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -152,7 +152,7 @@ func (c *DaiLiImpl) PayNotify() {
logs.Notice("快付回调该订单还处于等待支付订单id=", orderNo)
} else if tradeStatus == "SUCCESS" {
// 订单支付成功,需要搞很多事情 TODO
service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, c.GetString("trxNo"))
service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, c.GetString("trxNo"), "支付成功")
}
c.Ctx.WriteString("success")
}
@@ -163,7 +163,7 @@ func (c *DaiLiImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo)
factAmount := 100.00
if tradeStatus == "SUCCESS" {
// 调用支付成功的接口,做加款更新操作,需要把实际支付金额传入
if !service.SolvePaySuccess(orderInfo.BankOrderId, factAmount, trxNo) {
if !service.SolvePaySuccess(orderInfo.BankOrderId, factAmount, trxNo, "支付成功") {
return false
}
} else if tradeStatus == "FAILED" {

View File

@@ -186,7 +186,7 @@ func (f *FatSixImpl) PayNotify() {
logs.Error("金额转换失败", err)
f.Ctx.WriteString("fail")
}
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, money, resp.Tid)
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, money, resp.Tid, "支付成功")
if isOk {
f.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -169,21 +169,13 @@ func (c *JDCardImpl) PayNotify() {
params := map[string]string{
"merchantId": strings.TrimSpace(c.GetString("merchantId")),
"amount": strings.TrimSpace(c.GetString("amount")), // 时间戳
//"timestamp": strings.TrimSpace(c.GetString("timestamp")),
"status": strings.TrimSpace(c.GetString("status")),
//"sign": strings.TrimSpace(c.GetString("sign")),
"remark": strings.TrimSpace(c.GetString("remark")),
"status": strings.TrimSpace(c.GetString("status")),
"remark": strings.TrimSpace(c.GetString("remark")),
}
//tmpSign := utils.TmpEncrypt(attach + params["merchantId"] + params["timestamp"])
//if tmpSign != params["sign"] {
// logs.Error("【APPLE】回调签名错误签名=", params["sign"], "计算签名=", tmpSign)
// c.Ctx.WriteString("FAIL")
// return
//}
orderInfo.BankTransId = params["merchantId"]
if params["status"] == "1" {
// TODO 订单支付成功
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"])
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"], "支付成功")
if isOk {
c.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -106,7 +106,7 @@ func (c *KuaiFuImpl) Scan(orderInfo order.OrderInfo, roadInfo road.RoadInfo, mer
return scanData
}
// 支付回调
// PayNotify 支付回调
func (c *KuaiFuImpl) PayNotify() {
orderNo := strings.TrimSpace(c.GetString("orderNo"))
orderInfo := order.GetOrderByBankOrderId(orderNo)
@@ -164,7 +164,7 @@ func (c *KuaiFuImpl) PayNotify() {
logs.Notice("快付回调该订单还处于等待支付订单id=", orderNo)
} else if tradeStatus == "SUCCESS" {
// 订单支付成功,需要搞很多事情 TODO
service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, c.GetString("trxNo"))
service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, c.GetString("trxNo"), "支付成功")
}
c.Ctx.WriteString("success")
}
@@ -208,7 +208,7 @@ func (c *KuaiFuImpl) PayQuery(orderInfo order.OrderInfo, roadInfo road.RoadInfo)
trxNo := gojson.Json(response).Get("trxNo").Tostring()
if tradeStatus == "SUCCESS" {
// 调用支付成功的接口,做加款更新操作,需要把实际支付金额传入
if !service.SolvePaySuccess(orderInfo.BankOrderId, factAmount, trxNo) {
if !service.SolvePaySuccess(orderInfo.BankOrderId, factAmount, trxNo, "支付成功") {
return false
}
} else if tradeStatus == "FAILED" {

View File

@@ -232,7 +232,7 @@ func (c *MFCardV2Impl) PayNotify() {
}
} else if params["status"] == "9" && factAmount == orderInfo.FactAmount {
// TODO 订单支付成功
service.SolvePaySuccess(convertor.ToString(params["order_id"]), factAmount, convertor.ToString(params["order_id"]))
service.SolvePaySuccess(convertor.ToString(params["order_id"]), factAmount, convertor.ToString(params["order_id"]), "支付成功")
}
c.Ctx.WriteString("SUCCESS")
}

View File

@@ -163,7 +163,7 @@ func (c *SelfThirdImpl) PayNotify() {
orderInfo.BankTransId = params["trxNo"].(string)
if params["statusCode"] == "01" {
// TODO 订单支付成功
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["trxNo"].(string))
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["trxNo"].(string), "支付成功")
if isOk {
c.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -144,7 +144,7 @@ func (c *StarSilenceImpl) PayNotify() {
}
//判断实付金额是否与订单金额一致
if params["code"] == "1" && factAmount == orderInfo.OrderAmount {
service.SolvePaySuccess(convertor.ToString(params["supplierOrderId"]), factAmount, "")
service.SolvePaySuccess(convertor.ToString(params["supplierOrderId"]), factAmount, "", "支付成功")
} else if params["code"] == "1" && factAmount != orderInfo.OrderAmount {
service.SolvePayFail(convertor.ToString(params["supplierOrderId"]), "", fmt.Sprintf("实付金额与订单金额不一致,实际金额%.2f,卡面金额:%.2f", factAmount, orderInfo.OrderAmount))
} else {

View File

@@ -187,7 +187,7 @@ func (c *TMAllGameImpl) PayNotify() {
logs.Info("【TMALLGAME】回调参数", params)
if params["status"] == "finished" {
// TODO 订单支付成功
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["orderId"])
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["orderId"], "支付成功")
if isOk {
c.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -238,7 +238,7 @@ func (c *WalMartImpl) PayNotify() {
}
orderInfo.BankTransId = response.Data.BizOrderNo
if WalMartOrderStatus(response.Data.BindState) == WalMartOrderSuccess {
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, response.Data.BizOrderNo)
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, response.Data.BizOrderNo, "支付成功")
if isOk {
c.Ctx.WriteString("success")
} else {

View File

@@ -179,7 +179,7 @@ func (c *WalmartSelfImpl) PayNotify() {
orderInfo.BankTransId = params["merchantId"]
if params["status"] == "1" {
// TODO 订单支付成功
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"])
isOk := service.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, params["merchantId"], "支付成功")
if isOk {
c.Ctx.WriteString("SUCCESS")
} else {

View File

@@ -30,7 +30,7 @@ var (
)
// SolvePaySuccess 处理支付成功的加款等各项操作
func SolvePaySuccess(bankOrderId string, factAmount float64, trxNo string) bool {
func SolvePaySuccess(bankOrderId string, factAmount float64, trxNo string, cardReturnData string) bool {
o := orm.NewOrm()
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
@@ -67,6 +67,7 @@ func SolvePaySuccess(bankOrderId string, factAmount float64, trxNo string) bool
orderInfo.FactAmount = factAmount
orderInfo.Status = config.SUCCESS
orderInfo.BankTransId = trxNo
orderInfo.CardReturnData = cardReturnData
orderInfo.UpdateTime = time.Now()
if _, err := txOrm.Update(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
logs.Error(fmt.Sprintf("solve pay success, update order info fail: %s, bankOrderId = %s", err, bankOrderId))