不持有顾客资金的加密订阅怎么做
·6 分钟
订阅默认商户可以在之后向顾客收费。区块链没有这个原语。这是让自动续费在非托管前提下成立的设计。
银行卡订阅建立在一个我们很少细想的能力上:顾客同意一次之后,商户可以在他不在场的情况下发起后续扣款。卡组织提供了这个「拉取」机制,发卡行在它被滥用时居中裁决。
区块链没有「拉取」。任何转账都要求持有者在那一刻签名。所以朴素的加密订阅要么变成「顾客每月手动付一次」——流失率惨不忍睹——要么变成「顾客把余额存在商户这里」,那就是托管换了个说法。
Vault 方案
还有第三条路:顾客给一个只属于他自己的合约充值,而这个合约在充值之前就已经被约束好「能从里面取走什么」。
- 订阅条款——金额、周期长度、收款方——被哈希进合约地址。地址本身就是对这组确切条款的承诺。
- 一个 keeper 进程按周期触发扣款并支付 gas。它改不了金额、缩不短周期、也无法改变资金流向;任何与已承诺条款不符的操作都会被合约拒绝。
- 顾客随时可以取回余额或取消,不需要征得任何人同意。
顾客不是把一笔余额托付给商户,而是给一个「规则在他放钱之前就已经定死、并且他随时可以清空」的容器充值。
正因为条款是地址派生的一部分,修改一个已存在订阅的价格是不可能的——不同的价格就是不同的地址。这个约束本身就是那份保证。
这个约束的代价
它让升降级比刷卡麻烦,这点值得坦白说。
你没法改一个价格字段。换套餐必须关掉旧 vault、开一个新的,在一笔原子交易里完成,顾客只签一次名。旧套餐没用完的时间会折算抵扣新套餐的首期。
有意思的是「谁来算这个折算」。后端提出一个数字,合约独立重算一遍,两边对不上就直接回滚。所以顾客不需要信任平台的算术——算错或者作弊,交易根本执行不了。
需要预先设计的失效场景
| 情况 | 会发生什么 | 你该怎么做 |
|---|---|---|
| Vault 余额不足 | 扣款失败前会先发出余额不足事件。 | 提醒顾客充值。这是你最主要的挽留抓手。 |
| 顾客取消 | 停止扣款,剩余余额仍归他随时取回。 | 在本期结束时再收回权限,而不是立刻——这一期他已经付过了。 |
| 顾客把余额全取走 | 后续扣款失败。 | 视为取消意图,主动跟他确认。 |
| 你调整了套餐价格 | 已有订阅保持原条款,直到每位顾客各自迁移。 | 老用户老价格,或者显式邀请他们迁移。 |
第三行和刷卡是真正不同的:顾客可以单方面、无预告地把订阅「断粮」。作为交换,他们更愿意开始订阅,因为从头到尾没有把一张对自己钱包的空白支票交给你。
什么时候这不是合适的工具
每期金额不可预测的用量计费不适合这个模型,因为承诺的金额是事先固定的。带硬上限的计量计费可行;真正开放式的计量不行。
如果你的定价经常变,「必须迁移」就会从一次性摩擦变成反复摩擦。这是实打实的成本,不是细节。
订阅参考涵盖计划、vault、按比例折算,以及全部订阅事件。
阅读订阅指南 →