fix: 修复BepUsdt配置解析失败导致签名错误(JSON数值类型无法Unmarshal到map[string]string)
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -57,8 +58,7 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
channel := channels[0]
|
channel := channels[0]
|
||||||
var config map[string]string
|
config := parseChannelConfig(channel.Config)
|
||||||
json.Unmarshal([]byte(channel.Config), &config)
|
|
||||||
|
|
||||||
apiURL := strings.TrimSuffix(config["bepusdt_api_url"], "/")
|
apiURL := strings.TrimSuffix(config["bepusdt_api_url"], "/")
|
||||||
apiToken := config["bepusdt_api_token"]
|
apiToken := config["bepusdt_api_token"]
|
||||||
@@ -93,8 +93,8 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
|
|||||||
|
|
||||||
signature := signBepUsdt(params, apiToken)
|
signature := signBepUsdt(params, apiToken)
|
||||||
|
|
||||||
fmt.Printf("[BepUsdt] signature params: %v\n", params)
|
log.Printf("[BepUsdt] signature params: %v", params)
|
||||||
fmt.Printf("[BepUsdt] signature: %s, token: %s\n", signature, apiToken)
|
log.Printf("[BepUsdt] signature: %s, token: %s", signature, apiToken)
|
||||||
|
|
||||||
reqBody := BepUsdtCreateRequest{
|
reqBody := BepUsdtCreateRequest{
|
||||||
TradeType: tradeType,
|
TradeType: tradeType,
|
||||||
@@ -107,7 +107,7 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
body, _ := json.Marshal(reqBody)
|
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)))
|
resp, err := http.Post(apiURL+"/api/v1/order/create-transaction", "application/json", strings.NewReader(string(body)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to connect payment gateway"})
|
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)
|
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{}
|
var result map[string]interface{}
|
||||||
json.Unmarshal(respBody, &result)
|
json.Unmarshal(respBody, &result)
|
||||||
@@ -209,8 +209,7 @@ func (h *PaymentHandler) BepUsdtNotify(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
channel := channels[0]
|
channel := channels[0]
|
||||||
var config map[string]string
|
config := parseChannelConfig(channel.Config)
|
||||||
json.Unmarshal([]byte(channel.Config), &config)
|
|
||||||
apiToken := config["bepusdt_api_token"]
|
apiToken := config["bepusdt_api_token"]
|
||||||
|
|
||||||
stringParams := make(map[string]string)
|
stringParams := make(map[string]string)
|
||||||
@@ -268,3 +267,39 @@ func signBepUsdt(params map[string]string, token string) string {
|
|||||||
hash := md5.Sum([]byte(str))
|
hash := md5.Sum([]byte(str))
|
||||||
return hex.EncodeToString(hash[:])
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user