diff --git a/controller/stripe.go b/controller/stripe.go index 30a03b6..afefd54 100644 --- a/controller/stripe.go +++ b/controller/stripe.go @@ -44,6 +44,7 @@ func StripeWebhook(c *gin.Context) { } func sessionCompleted(event stripe.Event) { + customerId := event.GetObjectValue("customer") referenceId := event.GetObjectValue("client_reference_id") status := event.GetObjectValue("status") if "complete" != status { @@ -51,7 +52,7 @@ func sessionCompleted(event stripe.Event) { return } - err := model.Recharge(referenceId) + err := model.Recharge(referenceId, customerId) if err != nil { log.Println(err.Error(), referenceId) return diff --git a/controller/topup.go b/controller/topup.go index f786904..8ccc058 100644 --- a/controller/topup.go +++ b/controller/topup.go @@ -25,7 +25,7 @@ type AmountRequest struct { TopUpCode string `json:"top_up_code"` } -func genStripeLink(referenceId string, amount int64) (string, error) { +func genStripeLink(referenceId string, customerId string, email string, amount int64) (string, error) { if !strings.HasPrefix(common.StripeApiSecret, "sk_") { return "", fmt.Errorf("无效的Stripe API密钥") } @@ -44,6 +44,17 @@ func genStripeLink(referenceId string, amount int64) (string, error) { }, Mode: stripe.String(string(stripe.CheckoutSessionModePayment)), } + + if "" == customerId { + if "" != email { + params.CustomerEmail = stripe.String(email) + } + + params.CustomerCreation = stripe.String(string(stripe.CheckoutSessionCustomerCreationAlways)) + } else { + params.Customer = stripe.String(customerId) + } + result, err := session.New(params) if err != nil { return "", err @@ -96,7 +107,7 @@ func RequestPayLink(c *gin.Context) { reference := fmt.Sprintf("new-api-ref-%d-%d-%s", user.Id, time.Now().UnixMilli(), common.RandomString(4)) referenceId := "ref_" + common.Sha1(reference) - payLink, err := genStripeLink(referenceId, int64(req.Amount)) + payLink, err := genStripeLink(referenceId, user.StripeCustomer, user.Email, int64(req.Amount)) if err != nil { log.Println("获取Stripe Checkout支付链接失败", err) c.JSON(200, gin.H{"message": "error", "data": "拉起支付失败"}) diff --git a/model/topup.go b/model/topup.go index ceed01f..1e64407 100644 --- a/model/topup.go +++ b/model/topup.go @@ -50,7 +50,7 @@ func GetTopUpByTradeNo(tradeNo string) *TopUp { return topUp } -func Recharge(referenceId string) (err error) { +func Recharge(referenceId string, customerId string) (err error) { if referenceId == "" { return errors.New("未提供支付单号") } @@ -81,7 +81,7 @@ func Recharge(referenceId string) (err error) { } quota = topUp.Money * common.QuotaPerUnit - err = tx.Model(&User{}).Where("id = ?", topUp.UserId).Update("quota", gorm.Expr("quota + ?", quota)).Error + err = tx.Model(&User{}).Where("id = ?", topUp.UserId).Updates(map[string]interface{}{"stripe_customer": customerId, "quota": gorm.Expr("quota + ?", quota)}).Error if err != nil { return err } diff --git a/model/user.go b/model/user.go index 45ce483..e19dd23 100644 --- a/model/user.go +++ b/model/user.go @@ -36,6 +36,7 @@ type User struct { AffQuota int `json:"aff_quota" gorm:"type:int;default:0;column:aff_quota"` // 邀请剩余额度 AffHistoryQuota int `json:"aff_history_quota" gorm:"type:int;default:0;column:aff_history"` // 邀请历史额度 InviterId int `json:"inviter_id" gorm:"type:int;column:inviter_id;index"` + StripeCustomer string `json:"stripe_customer" gorm:"column:stripe_customer;index"` DeletedAt gorm.DeletedAt `gorm:"index"` } diff --git a/web/src/pages/TopUp/index.js b/web/src/pages/TopUp/index.js index a8cf735..85ad42f 100644 --- a/web/src/pages/TopUp/index.js +++ b/web/src/pages/TopUp/index.js @@ -262,7 +262,7 @@ const TopUp = () => { }} /> -