有更新，主要是 /api/payment/plans。
前端判断方式：
调用：
GET /api/payment/plans
如果用户已登录，请带上：
Authorization: Bearer <token>
后端会返回：
{
  "isFirstRecharge": true,
  "firstRechargeOffer": {
    "enabled": true,
    "type": "first_recharge_half_price",
    "discountPercent": 50
  },
  "plans": [
    {
      "planId": "vip_monthly",
      "amountCents": 995,
      "originalAmountCents": 1990,
      "isFirstRechargeOffer": true,
      "firstRechargeDiscountPercent": 50,
      "promotionType": "first_recharge_half_price"
    }
  ]
}
前端逻辑很简单：
data.isFirstRecharge === true 或 plan.isFirstRechargeOffer === true：展示首充价
amountCents：实际支付价，也就是首充半价
originalAmountCents：划线原价
firstRechargeDiscountPercent：折扣，比如 50
不需要前端自己算半价
创建订单还是原接口：
POST /api/payment/create-order
前端只传原来的 planId/payChannel/autoRenew，不用传首充字段。后端会重新判断首充资格，并按半价创建订单，防止前端伪造价格。