如何接入 Stripe? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HaibaraDP
V2EX    Stripe

如何接入 Stripe?

  •  
  •   HaibaraDP 75 天前 1552 次点击
    这是一个创建于 75 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了几天的 Stripe 文档和其他产品的逻辑( cursor.com/readdy.ai ),也问了很多次 AI ,还是有很多疑问,想请求下经常性付款的订阅(订阅开始时发放额度)的最佳实践,比如:

    1. 用户创建多个 Checkout Session 之后每个都付款,出现多个订阅怎么办?
    2. WebHook 事件不可靠,只能作为可有可无的通知?轮询 Stripe API 可能服务器有限流?
    3. 订阅升级是否应该退款? readdy.ai 以前是先删掉当前订阅,再走新订阅流程,买过 starter ,用了几天不好用,点升级后提示会取消当前订阅,体验不好,最近看升级和降级政策好像变了。cursor 是按照当前订阅周期剩余使用天数退款,好像是 stripe 上的功能,我的 pro 用了 3 天换成 plus 退了 15 美元,plus 换成 ultra 退了 38 美元,虽然是正常使用,但是感觉也在薅羊毛。

    github 是否有相关的代码库呢?

    15 条回复    2025-08-15 17:59:58 +08:00
    wogogoing
        1
    wogogoing  
    PRO
       74 天前   1
    我的产品正好接入了 stripe ,回答你一下:

    1.看业务逻辑是否允许,如果仅允许存在一个,那么应该在商户侧,也就是你自己的代码逻辑里面处理,后者覆盖前者就行了,具体操作就是关闭用户除最后一个订阅外的所有订阅即可。
    2.Webhook 有重试机制,整体的交付率还是可以的,但避免停服/宕机导致状态没有同步,建议商户做一个超时主动查询的兜底方案。比如超过 1 天都还没支付成功的订单,主动去 stripe 查询一下支付状态。
    3.这一点看产品的定位和定价。

    之前也有不少人在问如何支持支付宝和微信,我写了篇文章,op 可以参考下:

    https://blog.keepchen.com/a/How-to-get-Stripe-to-support-Alipay-and-WeChat-Pay.html
    CoderGeek
        2
    CoderGeek  
       74 天前
    接入 stripe ,一般国内和国外有些 app 是取消订阅不会退款 用到金额没了为止
    还有的策略是按照天算出一个退款金额到 stripe 用户账户,
    除非选择原路返回退款到用户支付方式,
    WebHook 要接,他是最重要的 如果失败他可以重试的 ,你可以接到了存到本地的 db 或者 MQ 再走你自己逻辑。
    用户退款要记录 失败的要调接口或者手动触发 stripe 的 API

    主要是看你的订阅支持什么模式,还有可以同时生成多个订阅 都是 API 文档
    jchnxu
        3
    jchnxu  
       74 天前
    @wogogoing 学习了。感谢老板
    wogogoing
        4
    wogogoing  
    PRO
       74 天前
    @jchnxu 您客气。
    HaibaraDP
        5
    HaibaraDP  
    OP
       74 天前
    @CoderGeek 取消订阅走当前周期结束时取消也就是不退款更合适些。
    我的产品是像 cursor/readdy 这种订阅周期开始时发放额度或积分的,订阅按天计算退款不合适。
    订阅模式是预付费,没有试用期,应该是不支持多个订阅?
    CoderGeek
        6
    CoderGeek  
       74 天前
    @HaibaraDP 每个产品不一样 国外有些产品就是要退还费用 还是看你的定位 。有些 VIP 之类的 肯定是取消自动续费 当前已生效的不退还
    CoderGeek
        7
    CoderGeek  
       74 天前
    @HaibaraDP 有这些规则的话 也可以考虑是否根据用量模式 stripe 也有 还有你可以规则都是你自己的 你去接 stripe 的 api
    他主要是支付工具 订阅模型 可以用他的也可以是你自己的
    HaibaraDP
        8
    HaibaraDP  
    OP
       74 天前
    问:用户创建多个 Checkout Session 之后每个都付款,出现多个订阅怎么办?
    答:开启每位用户限一个订阅 此时用户结账会出现“您已订阅我们的服务”或“您的付款未能处理”(您似乎已经在我们这里购买了订阅。登录以管理您的账户。),文档: https://docs.stripe.com/payments/checkout/limit-subscriptions
    yimity
        9
    yimity  
       73 天前
    1. 这个时候你自己的系统里面要限制。是否 stripe 能够限制没有研究过。
    2. 这个是不可靠,而且顺序次数都不可靠,所以你要选择性的处理一些事件,自己要存库写逻辑。
    3. 我的策略是只能有一个订阅,但是多个订阅可以升级降级,升级降级时设置 stripe 将对应的金额进行退费或者收取。
    HaibaraDP
        10
    HaibaraDP  
    OP
       71 天前
    @CoderGeek 接 stripe api 的话如何保证调用 api 拿到的是最新的数据呢?感觉不在一个事务内拿到数据无法保证准确啊
    XTTX
        11
    XTTX  
       58 天前
    stripe api update subscription 可以用 proration_behavior , 自动计算订阅升级差额。 第二条路就是创建新的订阅,然后 webhook 接受新的订阅,再处理 prorated refund 。

    好一点的 AI 应该对这些 api 很熟悉了
    HaibaraDP
        12
    HaibaraDP  
    OP
       57 天前
    @XTTX 按比例退款不合适(订阅是购买的用量,像 cursor 一样分配额度,不是 claude code 那种),有办法让 stripe 根据我的用量计算吗(定时上报这种不太准确的也行)?第二种创建订阅再退款感觉处理并发和事务很复杂。我用 cursor 接的 stripe mcp ,写的代码都有不满意的地方
    XTTX
        13
    XTTX  
       57 天前
    @HaibaraDP 那你就 1. 创建新的订阅 2. webhook 接创建成功 event , 查有没有其他有效订阅, 有就取消, 然后在取消成功 event 里再处理退款。 stripe 这么成熟了, 不行你就换一个 AI
    HaibaraDP
        14
    HaibaraDP  
    OP
       57 天前
    @XTTX sonnet 4.1 opus 很快就能写出来,但前提是没有并发、分布式事务,尤其是分布式事务,没有银弹,中间遇到超时、停机、快照之类问题很难处理,补偿的逻辑又非常复杂,很浪费时间。可能是我写后端的,考虑的比较多
    XTTX
        15
    XTTX  
       57 天前
    @HaibaraDP 那可真够复杂的了。 以前我还写 go 后台, 现在直接 supabase + edge function+ ts 撸一切。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2584 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 15:02 PVG 23:02 LAX 08:02 JFK 11:02
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86