先选路径
三种场景,走的接口不一样:POST /checkout/session 和 POST /subscription 不是同一个接口的两种写法。前者给客户一个可交互的收银台,后者是服务端在已有客户和支付工具时直接下单。一、准备周期性商品和价格
订阅必须用预先注册的 Product 和周期价格。priceDataList 那种临时商品建不了订阅。
interval 支持 day、week、month、year、quarter、half_year、custom。
quarter 和 half_year 是平台自己算周期边界的,你不用把它换算成 3 个月或 6 个月再传。只有 interval 为 custom 时,intervalCount 才表示天数。flat_rate 固定价。其他计费模式见 创建价格 的字段说明。
二、推荐路径:用 Checkout 创建首次订阅
结构和一次性支付一模一样——后端建 Session、前端打开收银台、Webhook 更新本地状态。只是把临时商品换成了周期价格。三、服务端路径:直接创建订阅
客户已经有 Clink Customer 和可用支付工具时用这条。customerId、customerEmail、referenceCustomerId 至少给一个。周期价格必须属于当前商户,并且支持你传的 paymentCurrency。
某种支付方式能不能用于订阅,还受商户渠道配置和币种限制影响。上线前按你自己账户实际启用的方式逐一验证,别照抄一张通用清单。
status 是数字,表示这一次付款的结果:
响应还会带回
subscriptionId、sessionId、paymentInstrumentId、orderId 和 invoiceId。这五个都存进你自己的订阅记录——后面查询和对账时,只靠其中一个字段会不够用。
四、订阅状态怎么映射到权益
这是接订阅时最容易做错的地方。付款状态和权益状态是两件事。五、要订阅哪些事件
一次性支付那套order.* 仍然有效,订阅再加下面这些。
生命周期
subscription.created、subscription.trialing、subscription.activated、subscription.past_due、subscription.incomplete_expired、subscription.cancelled
套餐变更
subscription.updated.plan_changed、subscription.updated.plan_change_canceled、subscription.updated.renewed、subscription.updated.cancel_at_period_end_set、subscription.updated.cancel_at_period_end_revoked
账单
invoice.open、invoice.paid、invoice.void
事件会重试,也不保证顺序。处理器至少要做到:
- 按
event.id原子去重 - 乱序到达时按订阅状态优先级处理,别让旧事件覆盖新状态
- 同一个
invoiceId的履约动作只执行一次
六、取消
reason 必填,1 到 255 个字符。cancelReasonCode 可选,取值为 too_expensive、need_more_features、found_alternative、no_longer_needed、poor_customer_service、poor_usability、poor_quality、other_reasons。
cancelImmediately 省略或传 false 时,订阅在当前周期结束时取消;传 true 立即取消。
七、升降级
必须先预览再确认,两步都要传quantity。
第一步:预览
priceSnapshotId 确认
immediate: true 的变更可能产生补差价付款并返回 action;false 表示预约到下一个账期边界生效。待生效的变更可以调 POST /subscription/{id}/update/cancel 撤销。
当前 API Reference 里 preview 和 confirm 的请求体示例漏了
quantity,但服务端把它列为必填。以这一页为准,两个请求都要传。八、计划阶段
scheduledPhases 可以让订阅在未来的续费边界自动切套餐,最多 10 个阶段,sequence 和 effectiveCycle 都从 1 开始且严格递增。
这是进阶能力,首次接入用不上。字段说明见 结账会话。
接下来
优惠与促销码
给订阅加折扣,以及折扣持续几个账期。
上线检查
订阅相关的验收项。