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

Node.js环境下Stripe checkout会话完成后无法获取客户邮箱如何修复

问题产生原因

  • 打印session的时机错误:你当前打印的是刚刚创建完成、用户还未进行任何操作的会话对象,此时用户尚未在Stripe checkout页面填写邮箱、完成支付,customer_email字段自然为null。
  • 跳转回站点后没有重新拉取最新的会话数据:创建会话时返回的session对象是创建时刻的静态快照,不会自动同步用户后续在Stripe侧的操作数据,支付完成后你需要主动调用Stripe接口获取最新的会话信息。

修复方案

步骤1:修改success_url,将会话ID作为参数传递到回调页

创建会话时给success_url加上session_id查询参数,方便跳转回来后你能拿到对应会话的ID查询详情,Stripe会自动把占位符{CHECKOUT_SESSION_ID}替换为实际的会话ID:

// 替换原有successurl赋值逻辑
let successurl = 'http://localhost:1111/' + customer.page + '?session_id={CHECKOUT_SESSION_ID}'

步骤2:在成功页对应的路由里,通过session_id拉取最新的会话数据

在跳转回的页面路由中,用收到的session_id调用stripe.checkout.sessions.retrieve方法获取最新的会话数据,此时就能拿到用户填写的邮箱:

// 示例:你的成功页路由逻辑
app.get('/你的成功页路由', async (req, res) => {
  const sessionId = req.query.session_id;
  // 拉取最新的会话完整数据
  const latestSession = await stripe.checkout.sessions.retrieve(sessionId);
  // 此时打印即可获取用户填写的邮箱
  console.log(latestSession.customer_email);
  // 后续处理你的业务逻辑
});

可选优化:配置邮箱收集规则

如果需要强制用户必须填写邮箱,或者预填充已知的用户邮箱,可以在创建会话时增加对应配置:

const session = await stripe.checkout.sessions.create({
  // 保留原有所有配置项不变,新增以下内容
  email_collection: 'required', // 强制用户必须填写邮箱才能继续支付流程
  // 如果已经获取到用户邮箱,可以取消下方注释预填充,用户可自行修改
  // customer_email: 'xxx@example.com'
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:45:04