SIGUIENTE JS: Estoy tratando de poner el contenido de una variable de estado "carrito" en el cuerpo de la solicitud POST a la API de STRIPE. El carrito tiene el formato [{id: 1, cantidad: 1}, {id: , cantidad: }.......]
Intenté poner elementos directamente en el controlador de API (list_items) y eso funciona. Pero no puedo hacer que mi variable "carrito" aparezca allí, así que supongo que tengo que incluir los elementos en la solicitud POST. He intentado hacer que se ejecute (incluido un objeto allí y JSON.stringify como propiedad de una variable "line_items", pero fue en vano. ¿Quizás alguien podría ayudarme?
Controlador de API:
import Stripe from 'stripe'; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY); export default async function handler(req, res) { if (req.method !== 'POST') { return res.send({ error: 'Method need to be POST', }); } const domainURL = 'http://localhost:3000'; // const { quantity, mode, productKey } = req.body; const pmTypes = ['card']; const session = await stripe.checkout.sessions.create({ payment_method_types: pmTypes, mode: 'payment', locale: 'en', line_items: the_variable????, success_url: `${domainURL}/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${domainURL}/cart`, }); res.send({ sessionId: session.id, }); }Solicitud POST:
const stripeLoader = loadStripe(props.pk); const redirectToCheckout = async () => { const stripeClient = await stripeLoader; const { sessionId } = await fetch('api/checkout_sessions', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body : {????} }).then((res) => res.json()); stripeClient.redirectToCheckout({ sessionId }); };Puede usar cualquier estructura que desee para comunicarse entre su cliente y el backend, pero su solicitud de API a Stripe para crear la sesión debe ajustarse a la forma esperada del parámetro line_items API ( docs ).
Puede definir precios sobre la marcha con price_data en cada artículo:
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: [ { price_data: { currency: 'usd', product_data: { name: 'T-shirt', }, unit_amount: 2000, }, quantity: 1, }, ], mode: 'payment', success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', });O puede utilizar precios predefinidos :
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: [{ price: 'price_123', quantity: 1, },{ price: 'price_456', quantity: 3, }], mode: 'payment', success_url: 'https://example.com/success?session_id={CHECKOUT_SESSION_ID}', cancel_url: 'https://example.com/cancel', });Descubrí cómo hacer la solicitud POST. El cuerpo tiene que verse así:
body: JSON.stringify({ lineItems: props.cart.map((singleItem) => { return { price: <the_stripe_price_key_for_the_given_product>, quantity: <the_amount>, }; }), }) incluyó la siguiente línea en el controlador de la API: const { lineItems } = req.body; y establecer line_items: lineItems
Entonces, tal como señaló Nolan, line_items aceptará una matriz de objetos (en mi caso, generados a través del mapeo de la variable de estado de mi 'carrito').