Node.js中Stripe支付后无法通过API获取客户邮箱问题求助
解决Stripe API无法获取客户邮箱的问题
核心问题
你的代码存在两个关键问题:
- 创建Checkout Session时未配置强制收集客户邮箱,也没确保Stripe将邮箱关联到会话/客户对象
- 在Session刚创建就立刻查询邮箱,此时用户还未完成支付,相关字段尚未被填充
具体解决方案
1. 修改Checkout Session创建配置,强制收集并关联邮箱
更新stripe.checkout.sessions.create的参数,添加以下关键配置,确保Stripe收集邮箱并关联到客户和支付记录:
const session = await stripe.checkout.sessions.create({ line_items: [ { price: priceID, quantity: 1, }, ], mode: 'payment', // 把session_id作为参数传到成功页,方便后续查询 success_url: `${YOUR_DOMAIN}?success=true&session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${YOUR_DOMAIN}?canceled=true`, customer_creation: 'always', // 强制为每个支付创建客户对象 payment_intent_data: { // 自动将客户邮箱填充到receipt_email,同时发送收据 receipt_email: '{{CHECKOUT_SESSION_CUSTOMER_EMAIL}}', }, // 可选:如果前端能提前获取邮箱,直接传入这里;否则Stripe会在支付页强制收集 customer_email: req.body.email, });
2. 支付成功后再查询邮箱,不要在Session创建时立即查询
Session刚创建时,用户还没完成支付,customer_email等字段都是空的。正确流程是:
- 用户支付成功后,前端从
success_url的参数中拿到session_id - 前端调用后端新增的查询接口,传入
session_id获取邮箱
新增后端查询接口:
app.get('/get-session-details', async (req, res) => { const sessionId = req.query.session_id; try { // 展开customer对象,直接获取关联的客户邮箱 const session = await stripe.checkout.sessions.retrieve(sessionId, { expand: ['customer'] }); res.json({ customerEmail: session.customer.email, receiptEmail: session.payment_intent?.receipt_email }); } catch (err) { res.status(400).json({ error: err.message }); } });
3. 废弃低效的查询方式
你之前用stripe.customers.list()遍历所有客户、stripe.charges.list()查询最近订单的方式完全不可取:
- 生产环境客户数量多的时候,遍历所有客户会严重影响性能
- 无法准确对应到当前支付的客户
验证方法
支付完成后,调用上述/get-session-details接口,传入成功页拿到的session_id,就能获取到客户邮箱。同时在Stripe后台查看对应的客户和支付记录,邮箱会被正确填充。
内容的提问来源于stack exchange,提问作者VietThanh Sai
相关产品推荐
相关产品推荐

