diff --git a/.env.example b/.env.example index 67ca835..897d095 100644 --- a/.env.example +++ b/.env.example @@ -49,7 +49,7 @@ WAFFO_STORE_SLUG=opsxshell-pwsi6m4n WAFFO_PRODUCT_ID=PROD_0pcnzzT4nalEkkcdyIUoD5 WAFFO_PRODUCT_ID_YEARLY=PROD_2WmkUVoYWt0NN8OVEyC6n3 WAFFO_PRODUCT_ID_PERPETUAL=PROD_0pcnzzT4nalEkkcdyIUoD5 -WAFFO_CURRENCY=CNY +WAFFO_CURRENCY=USD # test | live(test 时自动附加 test=true) WAFFO_ENVIRONMENT=test # 支付成功回跳(桌面端 deep link;CreateOrder/Checkout 的 return_url 可覆盖) diff --git a/backend/internal/controller/order/order_controller.go b/backend/internal/controller/order/order_controller.go index a5e996d..87ea4e6 100644 --- a/backend/internal/controller/order/order_controller.go +++ b/backend/internal/controller/order/order_controller.go @@ -113,6 +113,16 @@ func (ctrl *OrderController) PaymentWebhook(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"code": 0, "message": "Webhook processed"}) } +// WaffoWebhookReady GET/HEAD probe for dashboard URL checks (browser opens as GET). // Logan.Li +func (ctrl *OrderController) WaffoWebhookReady(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "code": 0, + "message": "waffo webhook ready", + "methods": []string{"POST"}, + "hint": "Payment events must POST JSON with order_no / orderNo", + }) +} + // WaffoWebhook accepts loosely-shaped Waffo payment events and maps to PaymentWebhook. // Logan.Li func (ctrl *OrderController) WaffoWebhook(c *gin.Context) { body, err := io.ReadAll(c.Request.Body) diff --git a/backend/internal/service/payment/waffo.go b/backend/internal/service/payment/waffo.go index 4bf48ac..64a3bcd 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 = "CNY" + currency = "USD" } defaultProduct := strings.TrimSpace(os.Getenv("WAFFO_PRODUCT_ID")) yearly := strings.TrimSpace(os.Getenv("WAFFO_PRODUCT_ID_YEARLY")) diff --git a/backend/internal/service/payment/waffo_test.go b/backend/internal/service/payment/waffo_test.go index 33b7753..9f7c620 100644 --- a/backend/internal/service/payment/waffo_test.go +++ b/backend/internal/service/payment/waffo_test.go @@ -11,7 +11,7 @@ func TestBuildCheckoutURL_YearlySubscription(t *testing.T) { StoreSlug: "opsxshell-pwsi6m4n", ProductIDYearly: "PROD_2WmkUVoYWt0NN8OVEyC6n3", ProductIDPerpetual: "PROD_0pcnzzT4nalEkkcdyIUoD5", - Currency: "CNY", + Currency: "USD", Environment: "test", SuccessURL: "opsxshell://pro/activated", } @@ -30,7 +30,7 @@ func TestBuildCheckoutURL_YearlySubscription(t *testing.T) { if q.Get("type") != "subscription" { t.Fatalf("type=%s want subscription", q.Get("type")) } - if q.Get("currency") != "CNY" { + if q.Get("currency") != "USD" { t.Fatalf("currency=%s", q.Get("currency")) } if q.Get("test") != "true" { @@ -43,7 +43,7 @@ func TestBuildCheckoutURL_PerpetualOnetime(t *testing.T) { StoreSlug: "opsxshell-pwsi6m4n", ProductIDYearly: "PROD_2WmkUVoYWt0NN8OVEyC6n3", ProductIDPerpetual: "PROD_0pcnzzT4nalEkkcdyIUoD5", - Currency: "CNY", + Currency: "USD", Environment: "test", SuccessURL: "opsxshell://pro/activated", } diff --git a/backend/router/router.go b/backend/router/router.go index 78f7b2a..bba80dc 100644 --- a/backend/router/router.go +++ b/backend/router/router.go @@ -109,6 +109,7 @@ func SetupRouter(db *gorm.DB, cfg *config.Config) *gin.Engine { register(clientAPI, "POST", "/checkout", orderController.Checkout) register(clientAPI, "POST", "/purchase/claim", orderController.ClaimPurchase) register(clientAPI, "POST", "/webhooks/payment", orderController.PaymentWebhook) + register(clientAPI, "GET", "/webhooks/waffo", orderController.WaffoWebhookReady) register(clientAPI, "POST", "/webhooks/waffo", orderController.WaffoWebhook) register(clientAPI, "POST", "/purchase/check", orderController.CheckDuplicatePurchase) register(clientAPI, "POST", "/purchase/status", orderController.CheckPurchaseStatus)