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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:57:29