# Guía de migración de precios de Checkout Descubre cómo actualizar tu integración para usar precios con Stripe Checkout. La [API Prices](https://docs.stripe.com/api/prices.md) añade nuevas funciones y flexibilidad a la forma en la que cobras a los clientes. Esta nueva integración ofrece: - Modelos más unificados para los elementos de Checkout; en lugar de planes, *SKU* (SKUs (Stock Keeping Units) represent a specific Product variation, taking into account any combination of attributes and cost (for instance, size, color, currency, cost)) y partidas alineadas, ahora cada elemento es un *precio*. - La capacidad de procesar imágenes de productos para artículos recurrentes. - Crear un producto y un catálogo de precios reutilizables en lugar de ítems de factura puntuales. - Crea tarifas alineadas para *suscripciones* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis). - Aplicar tipos fiscales dinámicos a las [suscripciones](https://docs.stripe.com/billing/taxes/collect-taxes.md?tax-calculation=tax-rates#adding-tax-rates-to-checkout) y a los [pagos puntuales](https://docs.stripe.com/payments/checkout/taxes.md). ¿No quieres migrar? Puedes seguir usando tu integración actual, pero las nuevas funciones no son compatibles. Puedes usar cualquier plan o precio recurrente nuevos que crees en el parámetro de `plan` de tus llamadas a la API existentes. ## Resumen de productos y precios Los *precios* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions) son una nueva unidad central de Stripe que funciona con las suscripciones, las *facturas* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice) y Checkout. Cada precio está vinculado a un único *Product* (Products represent what your business sells—whether that's a good or a service), y cada producto puede tener varios precios. Los diferentes bienes físicos o niveles de servicio deben estar representados por productos. El precio de ese producto debe estar representado por precios. Define los precios base y, en el caso de productos recurrentes, el ciclo de facturación. Esto te permite cambiar y añadir los precios sin necesidad de cambiar los datos de lo que ofreces. Por ejemplo, puede que tengas un único producto «de oro» con precios de 10 USD al mes, 100 USD al año, 9 EUR al mes y 90 EUR al año. O quizás tengas una camiseta azul con un precio de 20 USD y 15 EUR. ## Pagos puntuales Las integraciones para pagos únicos tienen los siguientes cambios: - En lugar de partidas específicas (que definan, por ejemplo, el nombre, el importe y la divisa), la creación de una sesión de Checkout requiere un *producto* (Products represent what your business sells—whether that's a good or a service) y, por lo general, un *precio* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions). - Ahora se requiere el [modo](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode). El código del lado del cliente se mantiene igual. ### Tabla de asignación En lugar de definir cada campo en `line_items`, Checkout utiliza los objetos Product y Price de base para determinar el nombre, la descripción, el importe, la moneda y las imágenes. Puedes [crear productos y precios](https://docs.stripe.com/payments/accept-a-payment.md) con la API o en el Dashboard. | Sin precios | Con precios | | ------------------------ | ------------------------------------------------------------------------------------------------ | | `line_items.name` | `product.name` | | `line_items.description` | `product.description` | | `line_items.amount` | - `price.unit_amount` - `price_data.unit_amount` (si se define al crear la sesión de Checkout) | | `line_items.currency` | - `price.currency` - `price_data.currency` (si se define al crear la sesión de Checkout) | | `line_items.images` | `product.images` (muestra la primera imagen proporcionada) | ### Código del lado del servidor para elementos alineados Antes, solo podías crear ítems puntuales alineados. Con precios, puedes seguir configurando ítems alineados, pero también puedes definir precios en forma dinámica con [price_data](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price_data) al crear la sesión de Checkout. Cuando creas la sesión de Checkout con `price_data`, debes hacer referencia al ID de un producto existente con [price_data.product](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price_data-product) o definir los datos del producto dinámicamente usando [price_data.product_data](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price_data-product_data). El siguiente ejemplo muestra el flujo para crear un ítem puntual. #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \ -d "line_items[0][quantity]"=1 \-d "line_items[0][price_data][unit_amount]"=2000 \ -d "line_items[0][price_data][product_data][name]"=T-shirt \ -d "line_items[0][price_data][product_data][description]"="Comfortable cotton t-shirt" \ -d "line_items[0][price_data][product_data][images][]"="https://example.com/t-shirt.png" \ -d "line_items[0][price_data][currency]"=usd \ -d mode=payment \ -d success_url="https://example.com/success" \ ``` ### Código del lado del servidor para precios puntuales Con esta nueva integración, puedes [crear un producto y un catálogo de precios](https://docs.stripe.com/payments/accept-a-payment.md) de antemano en lugar de tener que definir el importe, la moneda y el nombre cada vez que crees una sesión de Checkout. Puedes crear un producto y un precio con la [API Prices](https://docs.stripe.com/api/prices.md) o mediante el [Dashboard](https://dashboard.stripe.com/products). El ID del precio será necesario para crear una sesión de Checkout. El siguiente ejemplo ilustra cómo se crea un producto o precio a través de la API: #### curl ```bash curl https://api.stripe.com/v1/products \ -u<>: \ -d name=T-shirt \ -d description="Comfortable cotton t-shirt" \ -d "images[]"="https://example.com/t-shirt.png" curl https://api.stripe.com/v1/prices \ -u<>: \ -d product="{{PRODUCT_ID}}" \ -d unit_amount=2000 \ -d currency=usd curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \ -d "line_items[0][quantity]"=1 \-d "line_items[0][price]"="{{PRICE_ID}}" \ -d mode=payment \ -d success_url="https://example.com/success" \ ``` ## Suscripciones Las integraciones para pagos recurrentes tienen los siguientes cambios: - Todos los elementos pasan a un solo campo de [line_items](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items), en lugar de `subscription_data.items`. - Ahora se requiere el [modo](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode). Establece `mode=subscription` si la sesión incluye algún elemento recurrente. El código del lado del cliente se mantiene igual. Los planes existentes pueden usarse cuando se acepten los precios recurrentes. ### Código del lado del servidor con planes Este es un ejemplo del antes y el después de crear una sesión de Checkout durante el período de prueba usando un plan existente, que puede emplearse de forma intercambiable a un precio determinado. Ahora el plan ha pasado a `line_items` en lugar de `subscription_data.items`. #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \-d "line_items[0][price]"="{{PRICE_OR_PLAN_ID}}" \ -d "line_items[0][quantity]"=1 \ -d mode=subscription \ -d success_url="https://example.com/success" \ ``` ### Código del lado del servidor para precios recurrentes con una tasa de instalación Si tienes planes recurrentes con una tasa de instalación única, crea el producto y el precio que representen el costo único antes de crear la sesión de Checkout. Consulta la [tabla de asignaciones](https://docs.stripe.com/payments/checkout/migrating-prices.md#mapping-table-server-one-time) para ver cómo se asignan los campos `line_items` anteriores a la nueva integración. Puedes crear un producto y un precio a través de la [API Prices](https://docs.stripe.com/api/prices.md) o a través del [Dashboard de Stripe](https://dashboard.stripe.com/products). También puedes [crear el ítem puntual alineado](https://docs.stripe.com/payments/checkout/migrating-prices.md#server-side-code-for-inline-items). El siguiente ejemplo utiliza un ID de precio existente: #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \-d "line_items[0][price]"="{{PRICE_OR_PLAN_ID}}" \ -d "line_items[0][quantity]"=1 \ -d "line_items[1][price]"="{{ONE_TIME_PRICE_ID}}" \ -d "line_items[1][quantity]"=1 \ -d mode=subscription \ -d success_url="https://example.com/success" \ ``` ## Cambios en el objeto de respuesta En lugar de enumerar los elementos con `display_items`, el objeto de la Sesión de Checkout utiliza `line_items`. El campo `line_items` no procesa por defecto como en el caso de `display_items`, pero puedes incluirlo usando la opción [de ampliar ](https://docs.stripe.com/api/expanding_objects.md) al crear una Sesión de Checkout: #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \ -d "payment_method_types[]"="card" \ -d "mode"="payment" \ -d "line_items[0][price]"="{{PRICE_ID}}" \ -d "line_items[0][quantity]"=1 \ -d "success_url"="https://example.com/success" \ -d "expand[]"="line_items" ``` ## Cambios del webhook Como puede incluirse `line_items`, la respuesta del *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) `checkout.session.completed` ya no enumera elementos de forma predeterminada. El objeto de respuesta más pequeño te permite recibir los webhooks de Checkout más rápido. Puedes recuperar elementos con el nuevo punto de conexión `line_items`: #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions/{{CHECKOUT_SESSION_ID}}/line_items \ -u <>: ``` Para obtener más información, consulta [completar pedidos con Checkout](https://docs.stripe.com/checkout/fulfillment.md).