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。