Stripe confirmCardSetup传入payment_method.billing_details邮箱不生效问题
你的confirmCardSetup传参写法本身没有问题,之所以看不到邮箱参数、以为没生效,是两个常见误区导致的:
- 前端调用
retrieveSetupIntent获取结果时没有关联查询PaymentMethod详情,默认只返回PaymentMethod ID,看不到嵌套的邮箱字段 confirmCardSetup是Stripe.js直接向Stripe官方接口发起请求,不会走你自己的后端服务,所以你在自己的服务日志里看不到这个请求的参数
1. 验证邮箱已经成功提交到Stripe
你只需要在查询SetupIntent的时候添加expand参数,关联拉取PaymentMethod的完整信息,就能看到你传入的邮箱:
// 修改script.js中的orderComplete函数 var orderComplete = function(stripe, clientSecret) { // 新增expand参数,展开payment_method的完整信息 stripe.retrieveSetupIntent(clientSecret, {expand: ['payment_method']}) .then(function(result) { var setupIntent = result.setupIntent; // 这里就能拿到你传入的邮箱 console.log('提交的邮箱:', setupIntent.payment_method.billing_details.email); var setupIntentJson = JSON.stringify(setupIntent, null, 2); // 剩余原有逻辑不变 document.querySelector(".sr-payment-form").classList.add("hidden"); document.querySelector(".sr-result").classList.remove("hidden"); document.querySelector("pre").textContent = setupIntentJson; setTimeout(function() { document.querySelector(".sr-result").classList.add("expand"); }, 200); changeLoadingState(false); }); };
你也可以打开浏览器开发者工具的网络面板,筛选发往api.stripe.com的请求,就能看到confirmCardSetup请求里已经携带了你传入的邮箱参数。
2. 将邮箱同步到Stripe Customer的根字段(方便控制台直接查看)
现在你代码里的webhook更新逻辑是可用的,但依赖Stripe的事件推送,本地调试需要配置Stripe CLI做事件转发。如果要更简单直接的实现,可以参考如下修改:
第一步:修改前端逻辑,把邮箱传给后端
在SetupIntent确认成功后,把邮箱和关联的客户ID传给你的后端:
// 修改script.js中按钮点击的confirmCardSetup回调逻辑 stripe .confirmCardSetup(setupIntent.client_secret, { payment_method: { card: card, billing_details: { email: email } } }) .then(function(result) { if (result.error) { changeLoadingState(false); var displayError = document.getElementById("card-errors"); displayError.textContent = result.error.message; } else { // 新增:把邮箱和customer ID传给后端更新Customer fetch("/update-customer-email", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ customer_id: result.setupIntent.customer, email: email }) }).then(() => { orderComplete(stripe, setupIntent.client_secret); }) } });
第二步:后端新增更新Customer的接口
在server.js里添加对应接口:
app.post("/update-customer-email", async (req, res) => { const { customer_id, email } = req.body; await stripe.customers.update(customer_id, { email: email }); res.send({success: true}); });
修改完成后,打开Stripe控制台的客户页面,就能直接看到对应客户的邮箱字段。
内容的提问来源于stack exchange,提问作者mavdee
相关产品推荐
相关产品推荐

