目錄(7 節)
用 Stripe 卖用户名:从建账户到能付款的完整流程
接 Stripe 的完整流程分六步:隔开账户、建产品和价格、结账、交付、退款与收回,最后用测试卡从头真买一遍。
defi.io 的短用户名定好价之后,下一步是让人能真的付钱。这是这个系列的第二篇,把接 Stripe 的整个流程按顺序走一遍:从建账户,到用测试卡从头买一次。下一篇再讲切到正式环境、收第一笔真钱。
整个流程分六步:
第一步:给 defi.io 单独开一个账户
我在 Stripe 上已经有别的产品。这次没有直接复用那个账户,而是在同一个组织下给 defi.io 单独开了一个。
这样两个产品的 webhook、密钥、客户、退款记录各管各的。哪天要给 defi.io 换密钥,或者查一笔有争议的付款,不会碰到另一个产品。多开一个账户几乎没有成本,事后再拆就麻烦了。
第二步:建产品和价格
每个短名字或精品名都有两种买法:
- 按年:订阅,每年自动续费。到期后有 30 天宽限期,只有原主人能续;过了宽限期,名字释放,别人可以买。
- 终身:一次性付款,之后不再收费。
Stripe 里一共建了 5 个产品、10 个价格:1 到 4 位各一个,加上精品 B 档,每个都有按年和终身两个价格。精品 A 档直接用 2 位名字的价格,不用单独建。
代码不认价格的 ID,只认查找键,比如 username_4_yearly。测试环境和正式环境的价格 ID 不一样也没关系,切换时代码一行都不用改。
第三步:结账
用户选好名字和买法,点「继续付款」,跳到 Stripe 的结账页。这一步有三条规则:
- 先占住名字 31 分钟。 Stripe 的结账页至少有效 30 分钟,多留一分钟,避免付款完成时名字已经被放回去。
- 每人只能持有一个付费名字。
- 结账页写明买的是哪个名字。 Stripe 的产品是按价格档建的,如果不写明,买精品名 long 的人会在结账页看到「2 位用户名」。
1 位名字一开始不在网上卖,只能发邮件走发票,我以为 $12,999 没人会刷卡。后来想通了:结账页处理这个金额没问题,真正的风险是有些银行会拦截大额付款。所以 1 位名字也改成在线买,页面上提醒一句可以先跟银行打招呼,或者改用发票。
第四步:交付名字
付款结果从两条路进来:Stripe 的 webhook,和付款成功后跳回的页面。哪条先到不一定,也可能都到。所以「交付名字」这件事必须是幂等的:同一笔付款处理两次,结果和处理一次一样。
webhook 只认带签名、且标明属于 defi.io 的事件,一共处理 8 种:结账完成、异步付款成功、结账过期、订阅更新、订阅取消、续费成功、退款和争议。
第五步:交付不了就退款,退了款就收回
这一步定下了整个流程里最重要的一条原则:收了钱,就必须交付名字;交付不了,就全额退款。
听起来是废话,但边界情况比想象的多。比如结账页开着,超过 31 分钟才付款,名字已经被放回去,又被别人买走了。钱扣了,名字却给不了。
现在每一笔成功的付款,最后只有两种结局:
- 交付:名字还空着,你也没有别的付费名字,就照样给你。
- 退款:否则自动全额退款。如果这笔付款开了订阅,先取消订阅,再退钱。
退款用这笔结账的 ID 做幂等键,webhook 和成功页同时触发,也只会退一次。退款失败时,webhook 返回错误,让 Stripe 稍后重试。
反过来也一样:在 Stripe 后台给一笔付款全额退款,或者付款被发起争议,对应的名字会自动收回,订阅自动取消。每个名字被释放时都会记下原因:占位超时、被新订单替换、结账过期、年费过期、退款、争议、管理员操作。
第六步:用测试卡,从头真买一遍
代码写完,单元测试和请求测试都过了。但测试只能验证想到的情况,所以最后一步是在 Stripe 的测试模式里,像真实用户一样从注册开始一步步点下去。
这一遍走下来,又找出 5 个测试没覆盖到的问题:
- 从按年换成终身,记的还是年费。 改为以结账完成时实际收到的金额为准。
- 离开结账页,名字被自己的未完成订单占着,再也买不了。 现在再买一次,旧的占位释放,旧的结账页同时作废。
- 结账页写着「2 位用户名」。 就是第三步里那条规则的由来。
- 点一下价格卡片,就直接跳去付款。 改成先选卡片,再点一个明确的「继续付款」。
- 想买短名字,得先注册一个免费的。 现在注册页直接显示价格和购买入口,买完就落到新主页上。
「交付不了就退款」也是在这一步验证的:一个名字已经被别人占了,另一个人还是付了 $4,999 的终身价,结果是自动全额退款,只退了一次。
修完之后,这 5 个问题都补上了测试。现在跑一遍和 Stripe 相关的测试,35 个全部通过:
回头看这六步
前五步是设计,第六步是验证,两者缺一不可。设计决定了流程该怎么走,真买一遍才能确认它真的这么走。
如果你也要在自己的产品里接 Stripe,这六步基本可以照搬:隔开账户,用查找键管价格,结账时先占位,交付做成幂等,交付不了就退款,最后用测试卡从头走一遍。
下一篇讲上线:从测试环境切到正式环境,收第一笔真钱。
轉發此貼文?
與您的關注者分享。
回覆