From 7ac9fa40f07db5250bc701d03456104a10f3613a Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sun, 12 Jul 2026 19:27:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(server/pay):=20catalog=20=E5=8A=A0?= =?UTF-8?q?=E5=85=A8=E5=91=98=E4=BC=98=E6=83=A0=E6=9C=88=E4=BB=98=20pro=5F?= =?UTF-8?q?month=5Fpromo(=C2=A56/$1)+=20Promo=20=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优惠档全员可见,客户端用特殊卡片展示;pay 侧需种同 biz_code 商品后方可真下单 (未种前 product_not_found→404,UI 先就绪)。catalog 测试更新为 4 档 + promo 断言。 Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u --- server/internal/pay/catalog.go | 8 ++++++-- server/internal/pay/handler_test.go | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/server/internal/pay/catalog.go b/server/internal/pay/catalog.go index 73d9b69..872c25f 100644 --- a/server/internal/pay/catalog.go +++ b/server/internal/pay/catalog.go @@ -14,11 +14,15 @@ type CatalogItem struct { PriceMinor int64 `json:"price_minor"` // CNY 分(展示) Currency string `json:"currency"` // CNY PriceUsdtMicro int64 `json:"price_usdt_micro"` // USDT 微元(展示;各币种一口价、非汇率换算) + Promo bool `json:"promo,omitempty"` // true=优惠档,客户端用特殊卡片展示(全员可见) } -// Catalog 三档单源。时长取宽松口径(31/92/366 覆盖大月与最长季)。 -// USDT 展示价与 pay 侧 products 一口价对齐($4.99/$12.99/$34.99),不做实时汇率换算。 +// Catalog 单源。时长取宽松口径(31/92/366 覆盖大月与最长季)。 +// USDT 展示价与 pay 侧 products 一口价对齐,不做实时汇率换算。 +// pro_month_promo 是全员优惠月付(¥6/$1);**pay 侧需种同 biz_code 商品后方可真下单**, +// 未种前下单 pay 回 product_not_found → 404(UI 先就绪)。 var Catalog = []CatalogItem{ + {SKU: "pro_month_promo", Plan: string(codes.PlanPro), Days: 31, PriceMinor: 600, Currency: "CNY", PriceUsdtMicro: 1000000, Promo: true}, {SKU: "pro_month", Plan: string(codes.PlanPro), Days: 31, PriceMinor: 2999, Currency: "CNY", PriceUsdtMicro: 4990000}, {SKU: "pro_quarter", Plan: string(codes.PlanPro), Days: 92, PriceMinor: 6888, Currency: "CNY", PriceUsdtMicro: 12990000}, {SKU: "pro_year", Plan: string(codes.PlanPro), Days: 366, PriceMinor: 19999, Currency: "CNY", PriceUsdtMicro: 34990000}, diff --git a/server/internal/pay/handler_test.go b/server/internal/pay/handler_test.go index cc65913..99f1ff6 100644 --- a/server/internal/pay/handler_test.go +++ b/server/internal/pay/handler_test.go @@ -286,9 +286,14 @@ func TestCatalog(t *testing.T) { Items []CatalogItem `json:"items"` } _ = json.Unmarshal(w.Body.Bytes(), &resp) - if len(resp.Items) != 3 || resp.Items[0].SKU != "pro_month" { + if len(resp.Items) != 4 || resp.Items[0].SKU != "pro_month_promo" { t.Fatalf("catalog = %+v", resp.Items) } + // 优惠档:全员可见,promo 标记 + ¥6/$1 展示价。 + promo := resp.Items[0] + if !promo.Promo || promo.PriceMinor != 600 || promo.PriceUsdtMicro != 1000000 { + t.Fatalf("promo item 不符: %+v", promo) + } } // 老 created 单超 TTL → 列表视图显 expired;近期 created → 仍 created。