PAYATHON 2026

B站支付券与商家券是否支持动态额度配置

支付老李

明确结论

根据现有信息,可以先这样判断:

  1. B站支付券目前不能直接认定为支持动态额度。
    如果券面额在创建模板时已经固定,发券接口通常只能指定用户、券模板或券批次,不能在每次发放时临时传入金额。海豚平台可以通过算法推荐额度,不代表B站支付券链路也提供了同样的能力。

  2. O站API能否实现动态额度,取决于接口是否允许在发券时指定金额。
    如果O站API只能创建固定面额券,或选择现有券模板发放,就无法绕过底层限制。只有接口明确允许在创建券码或发券时传入 amount、discountAmount 等字段,而且B站侧能够接收并展示该字段,才有可能实现动态额度。

  3. 商家可以在内部计算券额,但平台未必会按这个金额展示。
    商家可以通过算法为不同用户计算不同的优惠金额。最终能否在B站展示为不同券额,仍取决于商家券协议和同步接口。如果现有链路只允许同步券码,不能同步金额、门槛等券属性,券额通常需要提前绑定到券码或券模板,不能在发券时任意修改。

在缺少动态金额字段和明确接口约定的情况下,更稳妥的做法是:预先创建多个固定额度档位,再由算法决定给用户发放哪个档位的券。

为什么不能只靠发券接口动态改额度

动态额度不只是展示问题,还会影响:

  • 券的核销金额;
  • 最低消费门槛;
  • 商家与平台之间的结算;
  • 预算占用和资金风险控制;
  • 退款、撤销及部分退款;
  • 券码验真和防篡改;
  • 用户领券记录与审计。

如果平台从券模板中读取面额,即使发券接口可以附带一个用于展示的金额,也无法改变实际核销金额。展示金额与核销规则不一致,还可能引发资损或客诉。

要判断系统是否完整支持动态额度,至少需要确认三点:

  1. 发券或券码同步接口能否传入金额;
  2. 平台能否保存该金额并向用户展示;
  3. 核销和结算能否以该金额为准。

少了其中任何一项,都不能算完整的动态额度能力。

推荐实现方案

方案一:预设固定额度档位

先在平台创建多个固定面额的券模板,例如:

  • 5元券;
  • 10元券;
  • 15元券;
  • 20元券。

商家或推荐系统根据用户特征计算目标额度,再将结果映射到最合适的模板。

用户特征和活动策略
        ↓
算法计算推荐额度
        ↓
额度映射到固定券模板
        ↓
调用发券接口

示例映射逻辑:

public String selectCouponTemplate(BigDecimal recommendedAmount) {
    if (recommendedAmount.compareTo(new BigDecimal("7.50")) < 0) {
        return "COUPON_5";
    }
    if (recommendedAmount.compareTo(new BigDecimal("12.50")) < 0) {
        return "COUPON_10";
    }
    if (recommendedAmount.compareTo(new BigDecimal("17.50")) < 0) {
        return "COUPON_15";
    }
    return "COUPON_20";
}

发券请求可以使用类似的结构:

{
  "userId": "123456",
  "couponTemplateId": "COUPON_15",
  "requestId": "coupon_issue_20260913_000001"
}

这些字段只用于说明实现思路,不是B站或O站的真实接口定义。实际字段名、鉴权方式和请求地址应以接入文档为准。

这种方式不属于连续金额意义上的动态券,但能让不同用户获得不同额度,同时兼容固定券模板以及现有的核销和结算链路。

方案二:商家生成绑定额度的券码

如果商家券允许商家侧维护券规则,可以在生成券码时确定金额,并建立不可变的绑定关系:

{
  "couponCode": "M202609130001",
  "amount": 12.50,
  "threshold": 100.00,
  "currency": "CNY",
  "expireTime": "2026-09-30T23:59:59+08:00"
}

向平台同步时,平台接口需要能够接收并保存这些券属性。核销时,平台或商家服务也应根据券码返回同一套规则:

{
  "couponCode": "M202609130001",
  "status": "AVAILABLE",
  "amount": 12.50,
  "threshold": 100.00,
  "currency": "CNY"
}

这套方案要求:金额在券码生成时就确定,之后不能随用户或请求变化。 同一个券码在展示、验券、核销和结算时必须使用一致的金额。

如果当前接口只能同步 couponCode,没有金额字段,还需要确认平台是否会在展示券详情前调用商家的验券或详情接口。如果没有这种回调能力,平台通常无法得知券码对应的具体额度。

方案三:商家侧实时优惠

如果平台券系统不支持动态金额,但业务要求为每个用户计算精确额度,可以不把动态金额做成平台券,而是在商家下单或结算时计算优惠:

BigDecimal calculateDiscount(User user, Order order) {
    BigDecimal recommendedAmount = recommendationService
        .recommendDiscount(user, order);

    return recommendedAmount.min(order.getPayableAmount());
}

这种方案可以实现实时动态额度,但用户在B站侧看到的可能只是活动资格、权益入口或固定文案。实际优惠金额要等用户进入商家结算页面后才能确定。能否采用这种方式,还要看产品体验和平台导流规则是否允许。

接入前需要确认的接口能力

接入前,可以向B站支付券、商家券及O站接口负责人确认这些问题:

  • 券模板的面额是否必须固定;
  • 创建券码时能否传入金额和使用门槛;
  • 发券时能否覆盖模板金额;
  • 同一券模板下是否允许每张券使用不同金额;
  • 商家同步券码时,能否同时同步金额、门槛和有效期;
  • 展示券详情前,平台是否会实时调用商家接口;
  • 核销金额由平台数据决定,还是以商家接口返回值为准;
  • 动态金额是否参与平台预算、结算和退款;
  • 接口是否要求对金额签名,是否具备幂等和防重放机制。

需要特别区分“算法推荐额度”和“券系统接受动态额度”。算法能计算出金额,不代表下游的券模板、展示和核销链路能够使用这个金额。

注意事项

  • 不要只在前端文案中展示动态额度,而实际核销仍使用固定额度。
  • 金额应使用 BigDecimal,或使用以“分”为单位的整数处理,避免浮点误差。
  • 发券请求应携带唯一幂等标识,防止接口重试导致重复发放。
  • 券码与金额绑定后,不应在用户领取后修改。
  • 商家侧算法给出的额度必须受活动预算、单用户上限和订单金额限制。
  • 动态券需要处理退款、撤销、过期、重复核销和部分核销等异常流程。
  • 如果O站API文档没有明确提供动态金额字段,不能因为它“支持配券和发券”,就推断它支持动态额度。

在现有信息不足以确认官方接口能力时,应优先采用“固定额度多档券模板+算法选档发放”。如果业务必须支持任意金额,平台需要在券创建、展示、核销和结算的整条链路中增加单券额度字段。只单独开放发券接口,无法完整解决这个问题。

备注:内容仅供参考。