# Guía de migración de precios de Checkout

Descubre cómo actualizar tu integración para usar precios con Stripe Checkout.

La integración de la [API Prices](https://docs.stripe.com/api/prices.md) incluye los siguientes elementos:

- Modelos unificados para las partidas 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 individuales, ahora cada partida es un *precio*.
- La capacidad de procesar imágenes de productos para artículos recurrentes.
- La capacidad de crear un catálogo de productos y precios reutilizable en lugar de partidas individuales.
- La capacidad de crear 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).
- Tipos impositivos dinámicos para [suscripciones](https://docs.stripe.com/billing/taxes/collect-taxes.md?tax-calculation=tax-rates#adding-tax-rates-to-checkout) y [pagos puntuales](https://docs.stripe.com/payments/checkout/taxes.md).

Si no quieres migrar, puedes seguir usando tu integración actual, pero no añadiremos nuevas funciones. Puedes usar los nuevos planes o precios recurrentes que crees en el parámetro `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 entidad central dentro de Stripe que funcionan con suscripciones, *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 *producto* (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 están representados por productos.

Los precios definen el precio base, la divisa y, para los productos recurrentes, el ciclo de facturación. Esto te permite cambiar y añadir precios sin tener que modificar los detalles de lo que ofreces. Por ejemplo, podrías tener un único producto «gold» con precios de 10&nbsp;USD al mes, 100&nbsp;USD al año, 9&nbsp;EUR al mes y 90&nbsp;EUR al año. O bien, podrías tener una camiseta azul con precios de 20&nbsp;USD y 15&nbsp;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 <<YOUR_SECRET_KEY>>: \
  -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 integración, puedes [crear un catálogo de productos y precios](https://docs.stripe.com/payments/accept-a-payment.md) por adelantado en lugar de tener que definir el importe, la divisa 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<<YOUR_SECRET_KEY>>: \
  -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<<YOUR_SECRET_KEY>>: \
  -d product="{{PRODUCT_ID}}" \
  -d unit_amount=2000 \
  -d currency=usd

curl https://api.stripe.com/v1/checkout/sessions \
  -u <<YOUR_SECRET_KEY>>: \
  -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 <<YOUR_SECRET_KEY>>: \
  -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 puntual, crea el producto y el precio que representan la comisión puntual antes de crear la sesión de Checkout. Consulta la [tabla de asignación](https://docs.stripe.com/payments/checkout/migrating-prices.md#mapping-table-server-one-time) para ver cómo se asignan los campos `line_items` a esta integración. Puedes crear un producto y un precio mediante 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 la partida puntual en línea](https://docs.stripe.com/payments/checkout/migrating-prices.md#server-side-code-for-inline-items). En el siguiente ejemplo se utiliza un ID de precio existente:

#### curl

```bash
curl https://api.stripe.com/v1/checkout/sessions \
  -u <<YOUR_SECRET_KEY>>: \
  -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 <<YOUR_SECRET_KEY>>: \
  -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 `line_items` se puede incluir, 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` no muestra las partidas por defecto. El objeto de respuesta más pequeño te permite recibir tus webhooks de Checkout más rápido. Puedes recuperar las partidas con el punto de conexión `line_items`:

#### curl

```bash
curl https://api.stripe.com/v1/checkout/sessions/{{CHECKOUT_SESSION_ID}}/line_items \
  -u <<YOUR_SECRET_KEY>>:
```

Para obtener más información, consulta [completar pedidos con Checkout](https://docs.stripe.com/checkout/fulfillment.md).
