Skip to content

外部平台券码核销系统

涉及子系统:云端 API(核心)、小程序(核销入口)、管理后台(批次管理)
核心业务:用户在抖音、美团等外部平台购买券码,在小程序内核销,系统自动创建订单并为用户开通或续期会员权益


系统概述

用户通过抖音团购、美团套餐等外部渠道购买健身房产品后,会获得一个券码。他们进入小程序,输入或扫描该券码,系统验证后自动创建一笔等效订单,用户无需在小程序内再次支付。


券码管理模式

推荐方案:内部码池模式

我们自行生成一批唯一券码,上传至抖音/美团活动页面作为核销凭证。用户消费后从平台获得券码,我们在自有系统内验证和核销,无需实时调用外部平台 API

优点

  • 不依赖外部平台接口稳定性
  • 实现简单,无需平台开发者资质
  • 适合初期小规模运营

适用场景:抖音团购、美团套餐、线下发码、合作渠道等所有需要兑换码的场景。

若未来需要对接美团/抖音官方核销 API(防止一码多用、与平台数据打通),可在此基础上扩展,数据模型兼容。


数据模型

券码批次(VoucherBatch)

VoucherBatch {
  id              String       # 批次 ID
  name            String       # 批次名称(如"抖音3月团购-月卡")
  platform        Enum         # DOUYIN / MEITUAN / CUSTOM(自定义渠道)
  productId       String       # 对应本系统的产品 ID(决定开通什么权益)
  totalCount      Int          # 批次总码量
  usedCount       Int          # 已核销数量(系统自动统计)
  codePrefix      String?      # 券码前缀(用于区分批次,如"DY2503")
  expiresAt       DateTime?    # 批次过期时间(过期后券码不可核销)
  createdBy       String       # 创建人(管理员账号)
  createdAt       DateTime
}

券码(VoucherCode)

VoucherCode {
  id              String       # 内部 ID
  batchId         String       # 所属批次
  code            String       # 唯一券码(用户持有的字符串,如"DY2503-A7X9KL")
  status          Enum         # UNUSED / REDEEMED / EXPIRED / DISABLED
  redeemedUserId  String?      # 核销用户 ID
  redeemedOrderId String?      # 核销生成的订单 ID
  redeemedAt      DateTime?    # 核销时间
  createdAt       DateTime
}

核销流程


订单创建规则

核销成功后,云端 API 创建一笔新订单,其行为与正常购买完全相同:

产品类型权益处理规则
月卡/季卡/年卡若用户当前无有效卡,从今日起计算有效期;若有有效卡,有效期顺延(叠加)
次卡向用户当前有效次卡追加次数;若无有效次卡,新建一张
体验卡按体验卡规则处理(含退款窗口)

叠加规则是核心设计决策:用户在美团买了一张月卡券码,在已有月卡未到期时核销,应该顺延而非覆盖,否则用户会损失权益。

订单 source 字段(新增):

Order.source  Enum  # WECHAT_PAY(微信支付购买)/ EXTERNAL_VOUCHER(外部券码)
Order.voucherCodeId  String?  # 关联的券码 ID(source=EXTERNAL_VOUCHER 时填写)

券码生成规则

券码由后端批量生成,格式建议:

{平台前缀}{批次月份}-{6位随机大写字母+数字}

示例:
  DY2503-A7X9KL   (抖音 2025年3月批次)
  MT2503-B3F2PQ   (美团 2025年3月批次)
  CS2503-X9M4WR   (自定义渠道)

生成后导出为 CSV,上传至对应平台活动后台。


防刷设计

防刷措施说明
码唯一性每个码只能核销一次(数据库唯一索引)
每人每批次限一张同一用户对同一批次只能核销一张券
批次有效期超出活动时间后码失效
核销接口频率限制同一 userId 短时间内多次失败请求触发限流
操作日志所有核销尝试(成功/失败)均记录日志,供审计

小程序交互设计

核销入口

建议放置于:个人中心 → 「兑换券码」 或购买页底部「有优惠券码?点此兑换」

交互流程

进入兑换页面

    ├── 手动输入框(用户输入券码字符串)
    └── 扫码按钮(调起相机扫二维码,二维码内容即券码)


       点击「立即兑换」


       调用 POST /api/v1/vouchers/redeem

    ┌─────┴─────┐
    │  成功      │──► 展示「兑换成功」页:
    └───────────┘      产品名称 / 有效期 / 剩余次数
          │ 失败

       展示具体失败原因(已使用/已过期/码无效)

管理后台功能

券码批次管理

  • 批次列表:平台、产品、总量、已用量、过期时间
  • 新建批次:选择平台、关联产品、设置数量和有效期、生成券码
  • 导出券码:将批次内所有码导出为 CSV,用于上传平台
  • 停用批次:提前终止活动(已核销订单不受影响)

核销记录

  • 按批次/用户/时间段查看核销记录
  • 识别异常核销(同 IP 大量失败尝试等)

API 接口规划

# 用户端(小程序调用)
POST /api/v1/vouchers/redeem
  Body: { code: "DY2503-A7X9KL" }
  Auth: 用户 JWT

# 管理端
POST /api/v1/admin/voucher-batches           # 创建批次
GET  /api/v1/admin/voucher-batches           # 批次列表
GET  /api/v1/admin/voucher-batches/:id/codes # 导出码列表(CSV)
PUT  /api/v1/admin/voucher-batches/:id/disable # 停用批次
GET  /api/v1/admin/voucher-batches/:id/stats # 批次核销统计

待确认事项

  • [ ] 月卡有效期叠加方式确认:顺延(在原到期日基础上加 N 天)vs 从核销日重新计算
  • [ ] 次卡追加次数时是否新建独立订单还是在原订单上追加(建议新建独立订单,权益清晰)
  • [ ] 是否需要接入美团/抖音官方核销 API(第一期建议内部码池,后续可扩展)
  • [ ] 同一用户每批次限用数量(建议 1 张,可配置)
  • [ ] 二维码格式设计(是否在二维码中直接嵌入券码字符串,还是用 URL 跳转)

健身房服务系统内部规划文档