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

Stripe confirmCardSetup传入payment_method.billing_details邮箱不生效问题

你的confirmCardSetup传参写法本身没有问题,之所以看不到邮箱参数、以为没生效,是两个常见误区导致的:

  1. 前端调用retrieveSetupIntent获取结果时没有关联查询PaymentMethod详情,默认只返回PaymentMethod ID,看不到嵌套的邮箱字段
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:04