const combineData = function (prod, pot, data) { const newData = [...prod, ...pot]; const finalCheckout = []; for (let i = 0; i < newData.length; i++) { finalCheckout.push({ name: newData[i].plantName || newData[i].potName, images: [newData[i].images[0]], amount: newData[i].price * 100, currency: "inr", quantity: data[i].quantity, metadata: { id: String(newData[i]._id) },// **Mongoose ID** }); } return finalCheckout; }; exports.getCheckOutSession = catchAsync(async (req, res, next) => { const [product, pot] = filterVal(req.body.product); const userId = req.user._id; const products = await ProductModel.find({ _id: { $in: product } }); const pots = await PotModel.find({ _id: { $in: pot } }); const newData = combineData(products, pots, req.body.product); // 2. create the checkout session const session = await stripe.checkout.sessions.create({ payment_method_types: ["card"], success_url: `${req.protocol}://${req.get("host")}/?alert=booking`, cancel_url: `${req.protocol}://${req.get("host")}/products/`, customer_email: req.user.email, client_reference_id: userId, line_items: newData, }); res.status(200).json({ status: "success", url: session.url, }); });Estoy creando un sitio web de comercio electrónico, cuando el usuario realiza un pago, quiero enviar la identificación del producto almacenada en mi base de datos mongodb como metadatos en stripe. Pero estoy recibiendo un error de cómo resolver esto.
Error:parameter_unknown - line_items[0][metadatos] Parámetro desconocido recibido: line_items[0][metadatos]
Stripe está rechazando la identificación de mongodb tiene metadatos
"metadatos": { "id": "61e40a5a7d83539092e7a92f" }
NOTA: Estoy enviando todos los datos exitosos como precio, nombre, cantidad de imágenes, cantidad en la función combineData anterior.
Después de informar a Stripe de los elementos de línea, el token de sesión se devolverá al lado del cliente y los usuarios serán redirigidos a la página de pago de Stripe.
Stripe podrá saber qué elementos (por ejemplo, imagen, nombre del producto, descripción del producto) mostrar al usuario, a través de los elementos de línea que envió al crear la sesión.
Si simplemente pasa un _id de MongoDB, Stripe no sabrá qué elementos mostrar, ya que no tienen información del producto.
const session = await stripe.checkout.sessions.create({ customer: customerId, billing_address_collection: 'auto', payment_method_types: ['card'], line_items: [ { price: STRIPE_PRODUCT_PRICE, //price of created product // For metered billing, do not pass quantity quantity: 1, }, ], // success_url: `${YOUR_DOMAIN}?success=true&session_id={CHECKOUT_SESSION_ID}`, // cancel_url: `${YOUR_DOMAIN}?canceled=true`, });Ejemplo de cómo se ve el producto de la tira y la identificación del precio. Un mismo producto puede tener muchos precios diferentes.
STRIPE_PRODUCT=prod_I7a38cue83jd STRIPE_PRICE=price_1HXL0wBXeaFPR83jhdue883Crear un producto: https://stripe.com/docs/api/products/create
Crear un precio: https://stripe.com/docs/api/prices/create
Normalmente almacenaré la identificación del producto y la identificación del precio como stripe_product_id y stripe_product_price en la base de datos local de MongoDB para que pueda usarla durante el pago.
Entonces, después de recibir el pedido, puede crear primero un pedido local, con los productos y la cantidad, luego...
const line_items = ordered_products.map(product => ({ price: product.stripe_product_price, quantity: product.quantity })) const session = await stripe.checkout.sessions.create({ .... line_items, ... })Esto es más tedioso porque necesita hacer más controles.
Puede hacer referencia a la creación de elementos de línea en el siguiente enlace de los documentos de la banda.