feat(server/pay): catalog 加全员优惠月付 pro_month_promo(¥6/$1)+ Promo 标记

优惠档全员可见,客户端用特殊卡片展示;pay 侧需种同 biz_code 商品后方可真下单
(未种前 product_not_found→404,UI 先就绪)。catalog 测试更新为 4 档 + promo 断言。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
This commit is contained in:
wangjia
2026-07-12 19:27:34 +08:00
parent 2d599f836d
commit 7ac9fa40f0
2 changed files with 12 additions and 3 deletions
+6 -2
View File
@@ -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},
+6 -1
View File
@@ -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。