diff --git a/.env.example b/.env.example index 897d095..42e5e37 100644 --- a/.env.example +++ b/.env.example @@ -42,14 +42,14 @@ DB_NAME=db.sqlite3 # Waffo 支付(OpsXShell 收银台 · pancake.waffo.ai) # ============================================ # 店铺: https://pancake.waffo.ai/store/opsxshell-pwsi6m4n -# 包年订阅: PROD_2WmkUVoYWt0NN8OVEyC6n3 (type=subscription) +# 包年一次性: PROD_1BIezCi932IbgCzRIV8hcJ (type=onetime) # 永久买断: PROD_0pcnzzT4nalEkkcdyIUoD5 (type=onetime) # 勿设置单一 WAFFO_CHECKOUT_URL,否则无法按档位分流商品 WAFFO_STORE_SLUG=opsxshell-pwsi6m4n WAFFO_PRODUCT_ID=PROD_0pcnzzT4nalEkkcdyIUoD5 -WAFFO_PRODUCT_ID_YEARLY=PROD_2WmkUVoYWt0NN8OVEyC6n3 +WAFFO_PRODUCT_ID_YEARLY=PROD_1BIezCi932IbgCzRIV8hcJ WAFFO_PRODUCT_ID_PERPETUAL=PROD_0pcnzzT4nalEkkcdyIUoD5 -WAFFO_CURRENCY=USD +WAFFO_CURRENCY=CNY # test | live(test 时自动附加 test=true) WAFFO_ENVIRONMENT=test # 支付成功回跳(桌面端 deep link;CreateOrder/Checkout 的 return_url 可覆盖) diff --git a/backend/database/seed.go b/backend/database/seed.go index da4cfcd..c1268b8 100644 --- a/backend/database/seed.go +++ b/backend/database/seed.go @@ -282,7 +282,7 @@ func ensureWaffoPaymentGateway(db *gorm.DB) error { Gateway: "waffo", Enabled: true, SandboxMode: true, - Currency: "USD", + Currency: "CNY", Priority: 0, } if err := db.Create(&gw).Error; err != nil { @@ -291,7 +291,7 @@ func ensureWaffoPaymentGateway(db *gorm.DB) error { } else { existing.Enabled = true existing.SandboxMode = true - existing.Currency = "USD" + existing.Currency = "CNY" existing.Priority = 0 if err := db.Save(&existing).Error; err != nil { return err @@ -303,6 +303,6 @@ func ensureWaffoPaymentGateway(db *gorm.DB) error { Update("priority", 100).Error; err != nil { return err } - log.Println("[初始化] 支付网关已优先 Waffo(包年 subscription / 永久 onetime)") + log.Println("[初始化] 支付网关已优先 Waffo(包年/永久均为 onetime)") return nil } diff --git a/backend/internal/service/payment/waffo.go b/backend/internal/service/payment/waffo.go index 64a3bcd..8d462d0 100644 --- a/backend/internal/service/payment/waffo.go +++ b/backend/internal/service/payment/waffo.go @@ -31,7 +31,7 @@ func LoadWaffoConfig() WaffoConfig { } currency := strings.TrimSpace(os.Getenv("WAFFO_CURRENCY")) if currency == "" { - currency = "USD" + currency = "CNY" } defaultProduct := strings.TrimSpace(os.Getenv("WAFFO_PRODUCT_ID")) yearly := strings.TrimSpace(os.Getenv("WAFFO_PRODUCT_ID_YEARLY")) @@ -104,12 +104,9 @@ func productIDForPlan(cfg WaffoConfig, planType string) string { } func checkoutTypeForPlan(planType string) string { - switch strings.TrimSpace(planType) { - case "yearly", "monthly": - return "subscription" - default: - return "onetime" - } + // OpsXShell 包年 / 永久均为 Waffo onetime 商品(包年不再走 subscription)。 // Logan.Li + _ = planType + return "onetime" } func resolveBaseCheckoutURL(cfg WaffoConfig, planType string) (*url.URL, error) { diff --git a/backend/internal/service/payment/waffo_test.go b/backend/internal/service/payment/waffo_test.go index 9f7c620..02723e1 100644 --- a/backend/internal/service/payment/waffo_test.go +++ b/backend/internal/service/payment/waffo_test.go @@ -6,12 +6,12 @@ import ( "testing" ) -func TestBuildCheckoutURL_YearlySubscription(t *testing.T) { +func TestBuildCheckoutURL_YearlyOnetime(t *testing.T) { cfg := WaffoConfig{ StoreSlug: "opsxshell-pwsi6m4n", - ProductIDYearly: "PROD_2WmkUVoYWt0NN8OVEyC6n3", + ProductIDYearly: "PROD_1BIezCi932IbgCzRIV8hcJ", ProductIDPerpetual: "PROD_0pcnzzT4nalEkkcdyIUoD5", - Currency: "USD", + Currency: "CNY", Environment: "test", SuccessURL: "opsxshell://pro/activated", } @@ -23,14 +23,14 @@ func TestBuildCheckoutURL_YearlySubscription(t *testing.T) { if err != nil { t.Fatal(err) } - if !strings.Contains(u.Path, "PROD_2WmkUVoYWt0NN8OVEyC6n3") { + if !strings.Contains(u.Path, "PROD_1BIezCi932IbgCzRIV8hcJ") { t.Fatalf("yearly product missing: %s", raw) } q := u.Query() - if q.Get("type") != "subscription" { - t.Fatalf("type=%s want subscription", q.Get("type")) + if q.Get("type") != "onetime" { + t.Fatalf("type=%s want onetime", q.Get("type")) } - if q.Get("currency") != "USD" { + if q.Get("currency") != "CNY" { t.Fatalf("currency=%s", q.Get("currency")) } if q.Get("test") != "true" { @@ -41,9 +41,9 @@ func TestBuildCheckoutURL_YearlySubscription(t *testing.T) { func TestBuildCheckoutURL_PerpetualOnetime(t *testing.T) { cfg := WaffoConfig{ StoreSlug: "opsxshell-pwsi6m4n", - ProductIDYearly: "PROD_2WmkUVoYWt0NN8OVEyC6n3", + ProductIDYearly: "PROD_1BIezCi932IbgCzRIV8hcJ", ProductIDPerpetual: "PROD_0pcnzzT4nalEkkcdyIUoD5", - Currency: "USD", + Currency: "CNY", Environment: "test", SuccessURL: "opsxshell://pro/activated", }