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
相关产品推荐
相关产品推荐

