77 lines
2.2 KiB
Go
77 lines
2.2 KiB
Go
package query
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"gateway/internal/models/merchant"
|
||
"gateway/internal/models/order"
|
||
"gateway/internal/otelTrace"
|
||
|
||
"gateway/internal/utils"
|
||
"strings"
|
||
|
||
"github.com/beego/beego/v2/server/web"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
type MerchantQueryController struct {
|
||
web.Controller
|
||
}
|
||
|
||
type OrderQueryFailData struct {
|
||
PayKey string `json:"payKey"`
|
||
StatusCode string `json:"statusCode"`
|
||
Msg string `json:"msg"`
|
||
}
|
||
|
||
// OrderQuery 改接口是为下游商户提供订单查询
|
||
func (c *MerchantQueryController) OrderQuery(ctx context.Context) {
|
||
orderNo := strings.TrimSpace(c.GetString("orderNo"))
|
||
payKey := strings.TrimSpace(c.GetString("payKey"))
|
||
sign := strings.TrimSpace(c.GetString("sign"))
|
||
params := make(map[string]any)
|
||
params["orderNo"] = orderNo
|
||
params["payKey"] = payKey
|
||
|
||
failData := new(OrderQueryFailData)
|
||
failData.StatusCode = "01"
|
||
failData.PayKey = payKey
|
||
|
||
merchantInfo := merchant.GetMerchantByPasskey(ctx, payKey)
|
||
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
|
||
failData.Msg = "商户不存在,请核对payKey字段"
|
||
}
|
||
orderInfo := order.GetOrderByMerchantOrderId(ctx, orderNo)
|
||
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||
failData.Msg = "不存在这样的订单,请核对orderNo字段"
|
||
}
|
||
keys := utils.SortMap(params)
|
||
paySercet := merchantInfo.MerchantSecret
|
||
tmpSign := utils.GetMD5Sign(params, keys, paySercet)
|
||
if tmpSign != sign {
|
||
failData.Msg = "签名错误"
|
||
}
|
||
if failData.Msg != "" {
|
||
c.Data["json"] = failData
|
||
_ = c.ServeJSON()
|
||
return
|
||
}
|
||
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
|
||
p["tradeStatus"] = orderInfo.Status
|
||
p["payKey"] = payKey
|
||
p["orderPrice"] = fmt.Sprintf("%.2f", orderInfo.OrderAmount)
|
||
p["factPrice"] = fmt.Sprintf("%.2f", orderInfo.FactAmount)
|
||
p["statusCode"] = "00"
|
||
keys = utils.SortMap(p)
|
||
p["sign"] = utils.GetMD5Sign(p, keys, paySercet)
|
||
s, err := json.Marshal(p)
|
||
if err != nil {
|
||
otelTrace.Logger.WithContext(ctx).Error("json marshal fail: ", zap.Error(err))
|
||
}
|
||
c.Data["json"] = s
|
||
}
|