fix: 修复BepUsdt配置解析失败导致签名错误(JSON数值类型无法Unmarshal到map[string]string)

This commit is contained in:
2026-05-27 22:43:38 +08:00
parent 081a26c164
commit 6d5305430f
+43 -8
View File
@@ -6,6 +6,7 @@ import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"sort"
"strconv"
@@ -57,8 +58,7 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
}
channel := channels[0]
var config map[string]string
json.Unmarshal([]byte(channel.Config), &config)
config := parseChannelConfig(channel.Config)
apiURL := strings.TrimSuffix(config["bepusdt_api_url"], "/")
apiToken := config["bepusdt_api_token"]
@@ -93,8 +93,8 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
signature := signBepUsdt(params, apiToken)
fmt.Printf("[BepUsdt] signature params: %v\n", params)
fmt.Printf("[BepUsdt] signature: %s, token: %s\n", signature, apiToken)
log.Printf("[BepUsdt] signature params: %v", params)
log.Printf("[BepUsdt] signature: %s, token: %s", signature, apiToken)
reqBody := BepUsdtCreateRequest{
TradeType: tradeType,
@@ -107,7 +107,7 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
}
body, _ := json.Marshal(reqBody)
fmt.Printf("[BepUsdt] request body: %s\n", string(body))
log.Printf("[BepUsdt] request body: %s", string(body))
resp, err := http.Post(apiURL+"/api/v1/order/create-transaction", "application/json", strings.NewReader(string(body)))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to connect payment gateway"})
@@ -117,7 +117,7 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
respBody, _ := io.ReadAll(resp.Body)
fmt.Printf("[BepUsdt] response: %s\n", string(respBody))
log.Printf("[BepUsdt] response: %s", string(respBody))
var result map[string]interface{}
json.Unmarshal(respBody, &result)
@@ -209,8 +209,7 @@ func (h *PaymentHandler) BepUsdtNotify(c *gin.Context) {
}
channel := channels[0]
var config map[string]string
json.Unmarshal([]byte(channel.Config), &config)
config := parseChannelConfig(channel.Config)
apiToken := config["bepusdt_api_token"]
stringParams := make(map[string]string)
@@ -268,3 +267,39 @@ func signBepUsdt(params map[string]string, token string) string {
hash := md5.Sum([]byte(str))
return hex.EncodeToString(hash[:])
}
func parseChannelConfig(configStr string) map[string]string {
result := make(map[string]string)
if configStr == "" {
return result
}
var raw map[string]interface{}
if err := json.Unmarshal([]byte(configStr), &raw); err != nil {
var rawStr map[string]string
if err2 := json.Unmarshal([]byte(configStr), &rawStr); err2 == nil {
return rawStr
}
log.Printf("[BepUsdt] failed to parse channel config: %v", err)
return result
}
for k, v := range raw {
if v == nil {
continue
}
switch val := v.(type) {
case string:
result[k] = val
case float64:
if val == float64(int64(val)) {
result[k] = strconv.FormatInt(int64(val), 10)
} else {
result[k] = strconv.FormatFloat(val, 'f', -1, 64)
}
case bool:
result[k] = strconv.FormatBool(val)
default:
result[k] = fmt.Sprintf("%v", val)
}
}
return result
}