Node.js集成Stripe遇印度出口交易客户信息缺失错误求助
解决Stripe印度法规要求的客户姓名和地址错误
问题原因
印度法规要求出口交易必须提供客户姓名和地址,当前代码未将前端收集的客户配送信息传递给Stripe Checkout Session,且前后端数据字段存在不匹配,导致Stripe无法获取必要信息触发错误。
解决方案
1. 修正前后端数据字段匹配
前端传递的deliveryDetails包含addressLine1和country,后端需要同步更新类型定义,确保数据能正确接收:
type CheckoutSessionRequest = { cartItems: { menuItemId: string; name: string; quantity: string; }[]; deliveryDetails: { email: string; name: string; addressLine1: string; city: string; country: string; // 新增国家字段 }; restaurantId: string; };
2. 将客户信息传递给Stripe Session
修改createSession函数,新增接收配送信息参数,并在创建Session时传入客户及收货地址信息:
首先更新createSession的参数和内部配置:
const createSession = async ( lineItem: Stripe.Checkout.SessionCreateParams.LineItem[], orderId: string, deliveryPrice: number, restaurantId: string, deliveryDetails: CheckoutSessionRequest['deliveryDetails'] ) => { const sessionData = await STRIPE.checkout.sessions.create({ line_items: lineItem, shipping_options: [ { shipping_rate_data: { display_name: "Delivery", type: "fixed_amount", fixed_amount: { amount: deliveryPrice, currency: "inr", }, }, }, ], mode: "payment", metadata: { orderId, restaurantId, customerName: deliveryDetails.name, customerEmail: deliveryDetails.email, customerAddress: deliveryDetails.addressLine1, customerCity: deliveryDetails.city, customerCountry: deliveryDetails.country, }, // 传入客户基本信息 customer_details: { name: deliveryDetails.name, email: deliveryDetails.email, }, // 传入收货地址信息 shipping_details: { name: deliveryDetails.name, address: { line1: deliveryDetails.addressLine1, city: deliveryDetails.city, country: deliveryDetails.country, }, }, success_url: `${FRONTEND_URL}/order-status?success=true`, cancel_url: `${FRONTEND_URL}/restaurant/${restaurantId}?cancelled=true`, }); return sessionData; };
然后在createCheckoutSession中调用createSession时传递配送信息:
const session = await createSession( lineItem, "TEST_ORDER_ID", restaurant.deliveryPrice, restaurant._id.toString(), checkoutSessionRequest.deliveryDetails );
备选方案:让Stripe强制收集地址
如果不想提前收集客户地址,可配置Stripe在结账页面强制收集信息,确保符合法规:
const createSession = async ( lineItem: Stripe.Checkout.SessionCreateParams.LineItem[], orderId: string, deliveryPrice: number, restaurantId: string, deliveryDetails: CheckoutSessionRequest['deliveryDetails'] ) => { const sessionData = await STRIPE.checkout.sessions.create({ line_items: lineItem, shipping_options: [ { shipping_rate_data: { display_name: "Delivery", type: "fixed_amount", fixed_amount: { amount: deliveryPrice, currency: "inr", }, }, }, ], mode: "payment", metadata: { orderId, restaurantId, }, // 强制收集印度境内地址 shipping_address_collection: { allowed_countries: ['IN'], }, // 提前传入已收集的邮箱 customer_email: deliveryDetails.email, success_url: `${FRONTEND_URL}/order-status?success=true`, cancel_url: `${FRONTEND_URL}/restaurant/${restaurantId}?cancelled=true`, }); return sessionData; };
注意事项
- 地址的
country字段必须使用ISO 3166-1 alpha-2格式(如印度为IN) - 确保所有必填信息(姓名、地址、城市、国家)完整传递给Stripe
- 若使用备选方案,需确认
allowed_countries配置符合业务需求
内容的提问来源于stack exchange,提问作者Mitva Virvadiya
相关产品推荐
相关产品推荐

