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)支付的地址规则与配置不匹配:
- INR支付强制要求地址信息:针对印度本地货币INR,Stripe的合规规则默认要求收集持卡人的印度本地地址,但这一规则不会自动触发Checkout页面显示地址输入字段。
- 未显式配置地址收集参数:你创建Checkout Session的代码中,没有添加
billing_address_collection或shipping_address_collection参数来强制前端展示地址输入区域。导致页面不显示地址字段,但后端支付验证时仍会检查地址是否存在,最终抛出错误。
对比USD的场景:使用USD时,Stripe会默认根据非印度本地货币的支付场景,自动触发境外地址收集逻辑,页面会展示地址字段,因此流程正常。
内容的提问来源于stack exchange,提问作者Vaishali
相关产品推荐
相关产品推荐

