如何通过 API 暂停 Kill Bill subscription?
明确结论
Kill Bill 支持暂停 subscription,但一般不是通过 update entitlement,而是为 subscription 添加一个 blocking state。
暂停时可以分别控制:
- entitlement:停止向客户提供服务或商品;
- billing:停止生成新的周期性费用;
- subscription change:禁止在暂停期间变更套餐。
恢复时,调用相应的 unblock 接口即可。配送任务是否停止,则需要业务系统根据 Kill Bill 中的 entitlement 状态自行处理。Kill Bill 管理的是订阅、权益和计费状态,不会直接控制配送流程。
暂停 subscription
常见的 REST API 调用如下:
POST /1.0/kb/subscriptions/{subscriptionId}/block
请求体使用 BlockingState:
{
"stateName": "PAUSED",
"service": "delivery-service",
"isBlockChange": true,
"isBlockEntitlement": true,
"isBlockBilling": true
}
对应的 curl 示例:
curl -X POST \
'http://localhost:8080/1.0/kb/subscriptions/6f2d2d90-0000-0000-0000-000000000000/block' \
-u 'admin:password' \
-H 'Content-Type: application/json' \
-H 'X-Killbill-ApiKey: bob' \
-H 'X-Killbill-ApiSecret: lazar' \
-H 'X-Killbill-CreatedBy: delivery-service' \
-H 'X-Killbill-Reason: Customer holiday pause' \
-d '{
"stateName": "PAUSED",
"service": "delivery-service",
"isBlockChange": true,
"isBlockEntitlement": true,
"isBlockBilling": true
}'
各字段应根据实际业务目标设置:
| 字段 | 作用 |
|---|---|
isBlockEntitlement | 暂停客户享有的服务权益 |
isBlockBilling | 暂停后续计费 |
isBlockChange | 禁止在暂停期间变更 subscription |
stateName | 业务状态名称,例如 PAUSED |
service | 创建该状态的业务服务名称 |
如果只暂停配送但继续收费,可以将 isBlockBilling 设为 false。对于“客户度假,期间不配送也不收费”这类场景,一般应同时阻止 entitlement 和 billing。
恢复 subscription
通常通过 subscription 的 unblock 接口恢复:
DELETE /1.0/kb/subscriptions/{subscriptionId}/block
例如:
curl -X DELETE \
'http://localhost:8080/1.0/kb/subscriptions/6f2d2d90-0000-0000-0000-000000000000/block' \
-u 'admin:password' \
-H 'X-Killbill-ApiKey: bob' \
-H 'X-Killbill-ApiSecret: lazar' \
-H 'X-Killbill-CreatedBy: delivery-service' \
-H 'X-Killbill-Reason: Customer returned from holiday'
解除 blocking state 后,subscription 会继续使用原来的产品、套餐和订阅关系,无需重新创建。
不同 Kill Bill 版本的 unblock 路径、日期参数和请求形式可能略有不同,应以当前部署版本生成的 OpenAPI 文档为准。通常需要查找以下方法:
addSubscriptionBlockingState
unblockSubscription
延后到指定日期暂停
如果暂停需要在未来某天生效,可以使用当前 Kill Bill 版本支持的 requestedDate 或 effectiveDate 参数。例如,某些版本允许:
POST /1.0/kb/subscriptions/{subscriptionId}/block?requestedDate=2026-10-01
日期参数放在查询字符串还是 BlockingState 请求体中,取决于使用的 Kill Bill 版本和客户端库,不能假定所有版本都采用相同形式。
恢复也可以按同样的方式安排,在计划恢复日期执行 unblock。实际使用中,更常见的是由业务系统保存恢复时间,再通过定时任务在到期后调用解除阻塞接口。
注意计费边界
暂停 billing 时,需要确认以下行为:
- 暂停从当前时间生效,还是从下一个账单周期生效;
- 已生成的 invoice 是否仍需支付;
- 当前计费周期是否需要按比例退款;
- 恢复后是沿用原账单日期,还是重新计算计费周期;
- 暂停期间的 usage 数据是否仍会上报和计费。
Blocking state 主要控制后续的 entitlement 和 billing,并不会自动撤销已经生成的 invoice。如果需要退款、作废 invoice 或增加 credit,还要另外调用支付或 invoice 相关 API。
Entitlement 和 subscription 的区别
entitlement 并不是 subscription 的另一个名称:
- subscription 表示客户订阅的产品及其生命周期;
- entitlement 表示客户当前是否有权使用该产品或服务;
- billing 表示是否继续对该 subscription 计费。
Kill Bill 分别管理这几个维度,所以暂停功能并不是普通的 subscription 更新字段。Blocking state 可以同时或单独控制这些状态。对于配送订阅,业务系统还需要监听相应的状态或事件,在 entitlement 被阻止后停止生成配送订单,并在解除阻止后恢复配送。
备注:内容仅供参考。
