fix: 参照company项目重写BepUsdt支付:amount用%.2f格式化,请求体直接序列化map

This commit is contained in:
2026-05-27 23:02:50 +08:00
parent 6d5305430f
commit 632fff3b49
+14 -29
View File
@@ -25,16 +25,6 @@ func NewPaymentHandler() *PaymentHandler {
return &PaymentHandler{} return &PaymentHandler{}
} }
type BepUsdtCreateRequest struct {
TradeType string `json:"trade_type,omitempty"`
OrderID string `json:"order_id"`
Amount float64 `json:"amount"`
NotifyURL string `json:"notify_url"`
RedirectURL string `json:"redirect_url,omitempty"`
Signature string `json:"signature"`
Timestamp int64 `json:"timestamp"`
}
func (h *PaymentHandler) CreatePayment(c *gin.Context) { func (h *PaymentHandler) CreatePayment(c *gin.Context) {
userID := c.GetUint("user_id") userID := c.GetUint("user_id")
orderID, _ := strconv.Atoi(c.Param("id")) orderID, _ := strconv.Atoi(c.Param("id"))
@@ -76,39 +66,35 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
notifyURL := fmt.Sprintf("%s/api/payment/bepusdt/notify", baseURL) notifyURL := fmt.Sprintf("%s/api/payment/bepusdt/notify", baseURL)
redirectURL := fmt.Sprintf("%s/orders/%d", baseURL, order.ID) redirectURL := fmt.Sprintf("%s/orders/%d", baseURL, order.ID)
timestamp := time.Now().Unix()
amountStr := fmt.Sprint(order.TotalAmount)
params := map[string]string{ params := map[string]string{
"order_id": strconv.Itoa(int(order.ID)), "order_id": strconv.Itoa(int(order.ID)),
"amount": amountStr, "amount": fmt.Sprintf("%.2f", order.TotalAmount),
"notify_url": notifyURL, "notify_url": notifyURL,
"redirect_url": redirectURL, "redirect_url": redirectURL,
"timestamp": strconv.FormatInt(timestamp, 10),
} }
if tradeType != "" { if tradeType != "" {
params["trade_type"] = tradeType params["trade_type"] = tradeType
} }
signature := signBepUsdt(params, apiToken) signature := signBepUsdt(params, apiToken)
params["signature"] = signature
log.Printf("[BepUsdt] signature params: %v", params) log.Printf("[BepUsdt] signature params: %v", params)
log.Printf("[BepUsdt] signature: %s, token: %s", signature, apiToken) log.Printf("[BepUsdt] signature: %s, token: %s", signature, apiToken)
reqBody := BepUsdtCreateRequest{ body, _ := json.Marshal(params)
TradeType: tradeType,
OrderID: strconv.Itoa(int(order.ID)),
Amount: order.TotalAmount,
NotifyURL: notifyURL,
RedirectURL: redirectURL,
Signature: signature,
Timestamp: timestamp,
}
body, _ := json.Marshal(reqBody)
log.Printf("[BepUsdt] request body: %s", 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)))
req, err := http.NewRequest("POST", apiURL+"/api/v1/order/create-transaction", strings.NewReader(string(body)))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create request"})
return
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
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"})
return return
@@ -116,7 +102,6 @@ func (h *PaymentHandler) CreatePayment(c *gin.Context) {
defer resp.Body.Close() defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body) respBody, _ := io.ReadAll(resp.Body)
log.Printf("[BepUsdt] response: %s", string(respBody)) log.Printf("[BepUsdt] response: %s", string(respBody))
var result map[string]interface{} var result map[string]interface{}
@@ -252,7 +237,7 @@ func (h *PaymentHandler) CheckPaymentStatus(c *gin.Context) {
func signBepUsdt(params map[string]string, token string) string { func signBepUsdt(params map[string]string, token string) string {
keys := make([]string, 0, len(params)) keys := make([]string, 0, len(params))
for k := range params { for k := range params {
if params[k] != "" { if params[k] != "" && k != "signature" && k != "sign_type" {
keys = append(keys, k) keys = append(keys, k)
} }
} }