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

Stripe支付集成异常:INR货币下地址字段显示与校验矛盾

问题

使用Stripe Webhooks实现支付功能时遇到异常:

  • 设置货币为USD时,系统要求提供印度境外地址,符合预期;
  • 设置货币为INR时,支付页面不显示地址输入字段,但提交支付时却提示必须填写地址。

相关代码如下:

webhook.ts

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY ?? '', {
  apiVersion: '2023-10-16',
});

const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET;

export const config = {
  api: {
    bodyParser: false,
  },
};

async function handleWebhookEvent(req, res) {
  const sig = req.headers['stripe-signature'];
  const buf = await buffer(req);

  let event;

  try {
    event = stripe.webhooks.constructEvent(buf.toString(), sig, webhookSecret);
  } catch (err) {
    console.error(`Webhook signature verification failed: ${err.message}`);
    return res.status(400).send(`Webhook signature verification failed: ${err.message}`);
  }

  switch (event.type) {
    case 'checkout.session.completed':
      const session = event.data.object;
      console.log(`Payment successful for session ID: ${session.id}`);


  res.status(200).end();
}

export default handleWebhookEvent;

subscribe.ts

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY ?? '');

export default async function handler(req:any, res:any) {
  if (req.method === "POST") {
    try {
      const session = await stripe.checkout.sessions.create({
        payment_method_types: ["card"],
        line_items: [
          {
            price_data: {
              currency: "usd",
              product_data: {
                name: "Sample Product",
              },
              unit_amount: 1000,
            },
            quantity: 1,
          },
        ],
        mode: "payment",
      });

      res.status(200).json({ sessionId: session.id });
    } catch (err) {
      res.status(500).json({ error: "Error creating checkout session" });
    }
  } else {
    res.setHeader("Allow", "POST");
    res.status(405).end("Method Not Allowed");
  }
}
原因分析

这个异常的核心原因是Stripe对于印度卢比(INR)支付的地址规则与配置不匹配:

  1. INR支付强制要求地址信息:针对印度本地货币INR,Stripe的合规规则默认要求收集持卡人的印度本地地址,但这一规则不会自动触发Checkout页面显示地址输入字段。
  2. 未显式配置地址收集参数:你创建Checkout Session的代码中,没有添加billing_address_collection或shipping_address_collection参数来强制前端展示地址输入区域。导致页面不显示地址字段,但后端支付验证时仍会检查地址是否存在,最终抛出错误。

对比USD的场景:使用USD时,Stripe会默认根据非印度本地货币的支付场景,自动触发境外地址收集逻辑,页面会展示地址字段,因此流程正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:18:33