You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Stripe与NextJS(或React)构建持久化结账页面

报错原因与权限说明

你遇到的Cannot read properties of undefined (reading 'retrieve')报错,本质是调用了不存在的API:

  • 客户端侧引入的Stripe SDK仅提供前端支付相关的轻量接口,paymentIntents.retrieve是服务端Stripe SDK专属的接口,需要传入Stripe密钥才能调用,密钥如果暴露在前端会导致你的Stripe账户被恶意操作,因此Stripe默认不允许客户端直接调用该接口。
  • 结论是:客户端确实无法直接检索PaymentIntent对象,所有涉及Stripe密钥的操作必须在服务端执行。

适配Firebase技术栈的最佳方案

你当前用Firestore触发器创建PaymentIntent,可按以下流程实现刷新后支付状态持久化:

  • 方案1(最推荐,无需依赖localStorage)

    云函数创建PaymentIntent成功后,将client_secret和对应订单/用户ID绑定,写入关联的Firestore文档中,同时配置Firebase安全规则,仅允许支付单所属的用户读取该文档:

    match /payment_records/{recordId} {
      allow read: if request.auth != null && request.auth.uid == resource.data.owner_uid;
    }
    

    前端结账页面刷新后,直接从当前用户对应的支付记录文档中拉取client_secret即可完成后续支付流程,比localStorage存储更稳定、安全性更高。

  • 方案2(保留localStorage存储paymentIntent.id的逻辑)

    新增一个Firebase HTTP云函数作为中间接口:

    1. 接口接收前端传入的paymentIntent.id,先校验请求用户是否为该支付单的所属者
    2. 服务端调用stripe.paymentIntents.retrieve()获取对应的client_secret,返回给前端
    3. 前端页面刷新后,读取localStorage中的paymentIntent.id,调用该自定义接口获取client_secret即可

注意:Stripe官方不建议持久化存储client_secret,前端拿到该字段后仅在内存中使用即可,不要写入localStorage、sessionStorage等本地持久化存储,避免被恶意脚本盗取导致支付风险。

内容的提问来源于stack exchange,提问作者RobLjm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:15:03