package controller import ( "github.com/gin-gonic/gin" "github.com/stripe/stripe-go/v76" "github.com/stripe/stripe-go/v76/webhook" "io" "log" "net/http" "one-api/common" "one-api/model" "strconv" "strings" ) func StripeWebhook(c *gin.Context) { payload, err := io.ReadAll(c.Request.Body) if err != nil { log.Printf("解析Stripe Webhook参数失败: %v\n", err) c.AbortWithStatus(http.StatusServiceUnavailable) return } signature := c.GetHeader("Stripe-Signature") endpointSecret := common.StripeWebhookSecret event, err := webhook.ConstructEvent(payload, signature, endpointSecret) if err != nil { log.Printf("Stripe Webhook验签失败: %v\n", err) c.AbortWithStatus(http.StatusBadRequest) return } switch event.Type { case stripe.EventTypeCheckoutSessionCompleted: sessionCompleted(event) case stripe.EventTypeCheckoutSessionExpired: sessionExpired(event) default: log.Printf("不支持的Stripe Webhook事件类型: %s\n", event.Type) } c.Status(http.StatusOK) } func sessionCompleted(event stripe.Event) { customerId := event.GetObjectValue("customer") referenceId := event.GetObjectValue("client_reference_id") status := event.GetObjectValue("status") if "complete" != status { log.Println("错误的Stripe Checkout完成状态:", status, ",", referenceId) return } err := model.Recharge(referenceId, customerId) if err != nil { log.Println(err.Error(), referenceId) return } total, _ := strconv.ParseFloat(event.GetObjectValue("amount_total"), 64) currency := strings.ToUpper(event.GetObjectValue("currency")) log.Printf("收到款项:%s, %.2f(%s)", referenceId, total/100, currency) } func sessionExpired(event stripe.Event) { referenceId := event.GetObjectValue("client_reference_id") status := event.GetObjectValue("status") if "expired" != status { log.Println("错误的Stripe Checkout过期状态:", status, ",", referenceId) return } if "" == referenceId { log.Println("未提供支付单号") return } topUp := model.GetTopUpByTradeNo(referenceId) if topUp == nil { log.Println("充值订单不存在", referenceId) return } if topUp.Status != common.TopUpStatusPending { log.Println("充值订单状态错误", referenceId) } topUp.Status = common.TopUpStatusExpired err := topUp.Update() if err != nil { log.Println("过期充值订单失败", referenceId, ", err:", err.Error()) return } log.Println("充值订单已过期", referenceId) }