feat(epay): support type selectors and preserve callback type

This commit is contained in:
line-6000
2026-06-28 11:56:58 +08:00
parent b4d1a4d8d4
commit 2dc538c0e1
12 changed files with 546 additions and 25 deletions
+11 -1
View File
@@ -71,6 +71,16 @@ func ResolveOrderApiKey(order *mdb.Orders) (*mdb.ApiKey, error) {
return row, nil
}
func epayResultType(order *mdb.Orders) string {
if order == nil {
return "alipay"
}
if epayType := strings.TrimSpace(order.EpayType); epayType != "" {
return epayType
}
return "alipay"
}
func BuildEPayResultParams(order *mdb.Orders, apiKeyRow *mdb.ApiKey) (map[string]string, error) {
if order == nil || apiKeyRow == nil {
return nil, constant.EPayReturnSignatureErr
@@ -85,7 +95,7 @@ func BuildEPayResultParams(order *mdb.Orders, apiKeyRow *mdb.ApiKey) (map[string
PID: pidInt,
TradeNo: order.TradeId,
OutTradeNo: order.OrderId,
Type: "alipay",
Type: epayResultType(order),
Name: order.Name,
Money: fmt.Sprintf("%.4f", order.Amount),
TradeStatus: "TRADE_SUCCESS",
+25 -6
View File
@@ -40,12 +40,13 @@ func TestBuildPublicRedirectURLRewritesOnlyEpayOrders(t *testing.T) {
}
}
func TestBuildEPayResultParamsMatchesLegacyFields(t *testing.T) {
func TestBuildEPayResultParamsUsesOriginalType(t *testing.T) {
params, err := BuildEPayResultParams(&mdb.Orders{
TradeId: "trade_epay_params",
OrderId: "order_epay_params",
Name: "VIP",
Amount: 1,
TradeId: "trade_epay_params",
OrderId: "order_epay_params",
Name: "VIP",
Amount: 1,
EpayType: "usdt.tron",
}, &mdb.ApiKey{
Pid: "1001",
SecretKey: "epay-secret",
@@ -58,7 +59,7 @@ func TestBuildEPayResultParamsMatchesLegacyFields(t *testing.T) {
"pid": "1001",
"trade_no": "trade_epay_params",
"out_trade_no": "order_epay_params",
"type": "alipay",
"type": "usdt.tron",
"name": "VIP",
"money": "1.0000",
"trade_status": "TRADE_SUCCESS",
@@ -88,6 +89,24 @@ func TestBuildEPayResultParamsMatchesLegacyFields(t *testing.T) {
}
}
func TestBuildEPayResultParamsFallsBackToAlipayWhenTypeMissing(t *testing.T) {
params, err := BuildEPayResultParams(&mdb.Orders{
TradeId: "trade_epay_fallback",
OrderId: "order_epay_fallback",
Name: "VIP",
Amount: 1,
}, &mdb.ApiKey{
Pid: "1001",
SecretKey: "epay-secret",
})
if err != nil {
t.Fatalf("BuildEPayResultParams(): %v", err)
}
if got := params["type"]; got != "alipay" {
t.Fatalf("type = %q, want alipay", got)
}
}
func TestBuildEPayResultParamsRejectsNonNumericPid(t *testing.T) {
_, err := BuildEPayResultParams(&mdb.Orders{
TradeId: "trade_bad_pid",
+8
View File
@@ -116,6 +116,10 @@ func CreateTransaction(req *request.CreateTransactionRequest, apiKey *mdb.ApiKey
if strings.EqualFold(req.PaymentType, mdb.PaymentTypeEpay) {
paymentType = mdb.PaymentTypeEpay
}
epayType := ""
if paymentType == mdb.PaymentTypeEpay {
epayType = strings.TrimSpace(req.EpayType)
}
gCreateTransactionLock.Lock()
defer gCreateTransactionLock.Unlock()
@@ -146,6 +150,7 @@ func CreateTransaction(req *request.CreateTransactionRequest, apiKey *mdb.ApiKey
NotifyUrl: notifyURL,
RedirectUrl: req.RedirectUrl,
Name: req.Name,
EpayType: epayType,
PaymentType: paymentType,
PayProvider: mdb.PaymentProviderOnChain,
ApiKeyID: apiKeyID(apiKey),
@@ -205,6 +210,7 @@ func CreateTransaction(req *request.CreateTransactionRequest, apiKey *mdb.ApiKey
NotifyUrl: notifyURL,
RedirectUrl: req.RedirectUrl,
Name: req.Name,
EpayType: epayType,
PaymentType: paymentType,
PayProvider: mdb.PaymentProviderOnChain,
ApiKeyID: apiKeyID(apiKey),
@@ -637,6 +643,7 @@ func SwitchNetwork(req *request.SwitchNetworkRequest) (*response.CheckoutCounter
NotifyUrl: "",
RedirectUrl: parent.RedirectUrl,
Name: parent.Name,
EpayType: parent.EpayType,
CallBackConfirm: mdb.CallBackConfirmOk, // don't trigger callback on sub-order
PaymentType: parent.PaymentType,
PayProvider: mdb.PaymentProviderOnChain,
@@ -916,6 +923,7 @@ func switchToOkPay(parent *mdb.Orders, token string) (*response.CheckoutCounterR
NotifyUrl: "",
RedirectUrl: parent.RedirectUrl,
Name: parent.Name,
EpayType: parent.EpayType,
CallBackConfirm: mdb.CallBackConfirmOk,
PaymentType: parent.PaymentType,
PayProvider: mdb.PaymentProviderOkPay,