我正在将 stripe 与带有订单控制器的 NodeJs 集成,当在前端调用此 API 时,我可以进入 stripe 结帐页面,但得到
错误:根据印度法规,出口交易需要客户名称和地址。更多信息在这里:https://stripe.com/docs/india-exports
const STRIPE = new Stripe(process.env.STRIPE_API_KEY as string);
type CheckoutSessionRequest = {
cartItems: {
menuItemId: string;
name: string;
quantity: string;
}[];
deliveryDetails: {
email: string;
name: string;
address: string;
city: string;
};
restaurantId: string;
};
const createCheckoutSession = async (req: Request, res: Response) => {
try {
const checkoutSessionRequest: CheckoutSessionRequest = req.body;
const restaurant = await Restaurant.findById(checkoutSessionRequest.restaurantId);
if (!restaurant) {
throw new Error("Restaurant not found");
}
const lineItem = createLineItem(
checkoutSessionRequest,
restaurant.menuItems
);
const session = await createSession(
lineItem,
"TEST_ORDER_ID",
restaurant.deliveryPrice,
restaurant._id.toString()
);
if (!session.url) {
return res.status(500).json({ message: "Error creating stripe session" });
}
return res.json({ url: session.url }); // Return the session URL
} catch (error: any) {
console.log(error);
res.status(500).json({ message: error.raw.message });
}
};
const createLineItem = (
checkoutSessionRequest: CheckoutSessionRequest,
menuItems: menuItemTypes[]
) => {
const lineItem = checkoutSessionRequest.cartItems.map((cartItem) => {
const menuItem = menuItems.find(
(item) => item._id.toString() === cartItem.menuItemId.toString()
);
if (!menuItem) {
throw new Error(`Menu item not found: ${cartItem.menuItemId}`);
}
const line_item: Stripe.Checkout.SessionCreateParams.LineItem = {
price_data: {
currency: "inr",
unit_amount: menuItem.price,
product_data: {
name: menuItem.name,
},
},
quantity: parseInt(cartItem.quantity),
};
return line_item;
});
return lineItem;
};
const createSession = async (
lineItem: Stripe.Checkout.SessionCreateParams.LineItem[],
orderId: string,
deliveryPrice: number,
restaurantId: string
) => {
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,
},
success_url: `${FRONTEND_URL}/order-status?success=true`,
cancel_url: `${FRONTEND_URL}/restaurant/${restaurantId}?cancelled=true`,
});
return sessionData;
};
OnCheckout 函数(我传递所有数据的地方):
const onCheckout = async (userFormData: UserFormData) => {
if (!restaurant) {
return;
}
const checkoutData = {
cartItems: cartItems.map((cartItem) => ({
menuItemId: cartItem._id,
name: cartItem.name,
quantity: cartItem.quantity.toString(),
})),
restaurantId: restaurant._id,
deliveryDetails: {
name: userFormData.name,
addressLine1: userFormData.address,
city: userFormData.city,
country: userFormData.country,
email: userFormData.email as string,
},
};
const data = await createCheckoutSession(checkoutData);
window.location.href = data.url;
};
我需要帮助,如何解决此错误。
我的问题已解决,我的出口需要姓名和地址错误,因为我使用了错误的测试卡号(美国),当我使用印度卡号时,付款很容易完成。
如果您遇到此类问题,请检查您所在国家/地区的测试卡号:https://docs.stripe.com/testing#international-cards