Files
2026-04-27 17:22:56 +08:00

116 lines
2.7 KiB
Go

package frontend
import (
"encoding/json"
"fmt"
"io"
"time"
"verification-platform-backend/internal/database"
"verification-platform-backend/internal/model"
"verification-platform-backend/internal/service/payment"
"github.com/gin-gonic/gin"
)
func SetupPaymentCallbackRoutes(r *gin.Engine) {
r.POST("/api/v1/payment/callback/bepusdt", handleBEpusdtCallback)
}
func handleBEpusdtCallback(c *gin.Context) {
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.String(200, "fail")
return
}
var callbackData payment.CallbackData
if err := json.Unmarshal(body, &callbackData); err != nil {
c.String(200, "fail")
return
}
var order model.Order
if err := database.DB.Where("order_no = ?", callbackData.OrderID).First(&order).Error; err != nil {
c.String(200, "fail")
return
}
if order.Status != "pending" {
c.String(200, "success")
return
}
var extraData struct {
TradeID string `json:"trade_id"`
ChannelID uint `json:"channel_id"`
ExpirationTime string `json:"expiration_time"`
}
if order.ExtraData != "" {
json.Unmarshal([]byte(order.ExtraData), &extraData)
}
if extraData.ExpirationTime != "" {
expirationTime, err := time.Parse(time.RFC3339, extraData.ExpirationTime)
if err == nil && time.Now().After(expirationTime) {
c.String(200, "fail")
return
}
}
var paymentChannel model.PaymentChannel
if extraData.ChannelID > 0 {
database.DB.First(&paymentChannel, extraData.ChannelID)
}
if paymentChannel.ID > 0 {
paymentService, err := payment.GetPaymentService(paymentChannel, "")
if err == nil {
if !paymentService.VerifyCallback(callbackData) {
c.String(200, "fail")
return
}
}
}
if callbackData.Status == 2 {
now := time.Now()
order.Status = "paid"
order.PaymentAt = &now
order.PaymentMethod = "bepusdt"
if err := database.DB.Save(&order).Error; err != nil {
c.String(200, "fail")
return
}
if order.OrderType == "package" {
var pkg model.Package
if err := database.DB.First(&pkg, order.PackageID).Error; err == nil {
var expiredAt *time.Time
if pkg.Period != "" && pkg.Period != "permanent" {
duration := parsePeriod(pkg.Period)
if duration > 0 {
exp := now.Add(duration)
expiredAt = &exp
}
}
userPackage := model.UserPackage{
UserID: order.UserID,
PackageID: pkg.ID,
ExpiredAt: expiredAt,
Status: "active",
}
if err := database.DB.Create(&userPackage).Error; err != nil {
fmt.Printf("创建套餐授权失败: %v\n", err)
} else {
database.DB.Model(&model.User{}).Where("id = ?", order.UserID).Update("current_package_id", pkg.ID)
}
}
}
}
c.String(200, "success")
}