> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tiendas y ventas en Economy (heredado)

> Cree tiendas de Economy heredado de PlayFab a partir de su catálogo y ejecute ventas por tiempo limitado con precios personalizados en moneda virtual o dinero real para elementos seleccionados.

# Tiendas y ventas (Economy heredado)

<Info>
  Las API de Economy v1 están en modo de mantenimiento y no recibirán nuevas características, solo correcciones de errores. **Las API v1 se mantendrán en el futuro previsible.** Consulte la [información general de Economy v2](/services/playfab/economy-monetization/economy-v2/overview) para obtener más información sobre la próxima versión de PlayFab Economy.
</Info>

En PlayFab, las **tiendas** se basan en [catálogos](/services/playfab/economy-monetization/economy/items/catalogs) y [monedas](/services/playfab/economy-monetization/economy/tutorials/currencies). Su catálogo principal debería definir todos los elementos de su juego y asignarles precios en las monedas que haya creado.

Las tiendas deberían definir subconjuntos de los elementos de su catálogo y ponerlos a la venta a precios específicos que pueden ser diferentes de los precios del catálogo.

Una tienda le permite destacar un conjunto específico de elementos y ponerlos a disposición a precios específicos durante un período de tiempo determinado.

Este tutorial ilustra los procedimientos recomendados para definir tiendas basadas en moneda virtual y dinero real.

## Requisitos

* Familiaridad con el [Game Manager](/services/playfab/live-service-management/gamemanager/quickstart) de PlayFab.
* Debe haber definido una o varias [monedas virtuales](/services/playfab/economy-monetization/economy/tutorials/currencies). El último ejemplo de este tutorial usa:
  * **SP** (**Silver Pieces**)
  * **GP** (**Gold Pieces**).
* Debe tener un *catálogo principal* con uno o varios elementos definidos.
  * El primer ejemplo usa varios elementos o lotes, similares a los descritos en el tutorial de [tablas de botín](/services/playfab/economy-monetization/economy/tutorials/drop-tables).
  * El segundo ejemplo de este tutorial usa pociones de salud pequeñas, medianas y grandes.

### Procedimientos recomendados

Los precios del catálogo deberían ser fijos a largo plazo: definen el precio *real* de un elemento.

Las tiendas deberían ser *temporales*, agregándose y quitándose según sus estrategias de LiveOps.

<Note>
  Espere obtener la mayor parte de sus ingresos rotando tiendas y moviendo elementos dentro y fuera de las tiendas activas.
</Note>

## Información general sobre las tiendas y los precios del catálogo

* **Precios**: los precios definidos en el catálogo deberían definirse como el precio *normal* de un elemento. Las tiendas le permiten definir un precio de oferta temporal para un elemento, utilizando la táctica minorista habitual. De forma alternativa, las tiendas pueden proporcionar un precio temporal para un elemento que normalmente no está disponible para la venta.
* **Costo cero**: si el costo de un elemento en una moneda concreta no está establecido (**null**) o es **cero**, no se puede comprar con esa moneda, tanto en catálogos como en tiendas. El costo cero le permite hacer que los elementos estén disponibles exclusivamente para monedas gratuitas, o exclusivamente para monedas premium, dejando en blanco las entradas de las demás monedas o restableciéndolas a **cero**.
* **Dinero real**: la moneda **RM** está disponible en todos los catálogos y tiendas. RM es una clave de moneda restringida que indica *solo transacciones con dinero real*. Solo debería cobrar RM por elementos de valor significativo, o por lotes/contenedores con moneda premium.
* **Los precios son excluyentes**: si se definen dos precios en un elemento, el elemento se puede comprar por uno u otro. *No es posible* exigir dos monedas para un único elemento.

## Definición de una tienda con dinero real

En su **Game Manager**:

* Vaya a su **título**.
* Seleccione **Economy** en el menú de la izquierda.
* En la pestaña **Catalogs**, seleccione su catálogo principal y seleccione **Stores**.
* Seleccione el botón **New Store**.

En el ejemplo de las [tablas de botín](/services/playfab/economy-monetization/economy/tutorials/drop-tables), creamos un lote de botín de 11 elementos. Para este ejemplo, pondremos a disposición tres lotes similares en una tienda con dinero real.

<Note>
  Cualquier elemento puede venderse por dinero real, pero un procedimiento recomendado es que solo estén disponibles directamente elementos o lotes valiosos *específicos*.
</Note>

La captura de pantalla siguiente muestra una nueva **tienda** completa, que contiene tres **lotes de elementos** disponibles por **dinero real**.

<img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy/tutorials/game-manager-economy-edit-store.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=9195fb8062f1c7ce7ba7caa050d5229c" alt="Game Manager - Economy - Editar tienda" width="1280" height="1500" data-path="images/playfab/economy-monetization/economy/tutorials/game-manager-economy-edit-store.png" />

Los detalles para completar compras con dinero real se tratan en nuestro tutorial avanzado, [procesamiento de pagos sin recibo](/services/playfab/economy-monetization/economy/tutorials/non-receipt-payment-processing).

### Procedimientos recomendados para tiendas con dinero real

La forma de usar el dinero real depende en gran medida del diseño específico de su juego. La compra directa de elementos del juego es válida, pero menos habitual.

Lo más habitual es que su juego permita comprar una moneda virtual premium con dinero real. Puede rotar varias tiendas con diferentes proporciones de moneda premium a dinero real.

<Tip>
  La conclusión principal es: asegúrese de que sus jugadores puedan darle dinero *siempre*.
</Tip>

## Definición de una tienda con moneda virtual

Entremos en los detalles concretos y el código para comprar elementos del juego con moneda virtual.

Los pasos iniciales son casi idénticos a los del ejemplo anterior:

1. Cree tres elementos nuevos: **pociones de salud pequeña, mediana y grande** con un precio en **moneda** *gratuita* y un precio en **moneda** *premium*.
2. Cree una tienda nueva con los elementos en venta.

<img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy/tutorials/game-manager-economy-new-store.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=c64cebc85f1e45eae8aa51e7c9bdab9a" alt="Game Manager - Economy - Nueva tienda" width="1280" height="1300" data-path="images/playfab/economy-monetization/economy/tutorials/game-manager-economy-new-store.png" />

## Compra de varios elementos en una sola compra

Para comprar un único elemento con moneda virtual, use el método [PurchaseItem](xref:titleid.playfabapi.com.client.playeritemmanagement.purchaseitem), como se describe en nuestro [inicio rápido de tiendas](/services/playfab/economy-monetization/economy/stores/quickstart). Este tutorial cubre la compra de varios elementos en una sola compra.

Su primer paso en este proceso debería ser obtener la tienda y mostrarla al usuario.

```csharp theme={null}
void GetVcStore()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog
    var storeId = "Potion Store"; // In your game, this should be a constant for a permanent store, or retrieved from titleData for a time-sensitive store
    var request = new GetStoreItemsRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId
    };
    PlayFabClientAPI.GetStoreItems(request, LogSuccess, LogFailure);
}
```

La devolución de llamada `LogSuccess` de este ejemplo recibe un [GetStoreItemsResult](xref:titleid.playfabapi.com.client.title-widedatamanagement.getstoreitems#getstoreitemsresult) que contiene una descripción completa de todos los elementos de la tienda, sus precios de *tienda* y cualquier metadato contenido en la propia tienda.

### Procedimientos recomendados para mostrar tiendas

Los juegos con tiendas deberían llamar a su catálogo principal y almacenarlo en caché mediante el método [GetCatalogItems](xref:titleid.playfabapi.com.server.title-widedatamanagement.getcatalogitems). Puede mostrar tanto el precio del catálogo como el precio de la tienda, junto con un 10 % de DESCUENTO o una decoración de bonificación similar junto a los elementos en venta.

<Tip>
  Es más probable que los jugadores compren elementos en oferta, especialmente si la oferta es por tiempo limitado.
</Tip>

En este punto, es responsabilidad de su código de interfaz gráfica presentar al usuario la oportunidad de seleccionar qué elementos desea comprar y cuántos.

* Entre su juego y PlayFab, los pasos restantes son varias llamadas de API independientes, pero puede hacer que la secuencia de varias llamadas sea invisible para el jugador.
* Recopile toda la información sobre la compra por adelantado y realice la secuencia completa de llamadas después de recopilar *todas* las entradas del jugador.

```csharp theme={null}
void DefinePurchase()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog.
    var storeId = "Potion Store"; // At this point in the process, it's just maintaining the same storeId used above.
    var request = new StartPurchaseRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId,
        Items = new List<ItemPurchaseRequest> {
             // The presence of these lines are based on the results from GetStoreItems, and user selection - Yours will be more generic.
            new ItemPurchaseRequest { ItemId = "Small Health Potion", Quantity = 20,},
            new ItemPurchaseRequest { ItemId = "Medium Health Potion", Quantity = 100,},
            new ItemPurchaseRequest { ItemId = "Large Health Potion", Quantity = 2,},
        }
    };
    PlayFabClientAPI.StartPurchase(request, result => { Debug.Log("Purchase started: " + result.OrderId); }, LogFailure);
}
```

Durante el proceso de selección de elementos, debe permitir que el usuario seleccione qué moneda desea gastar en estos elementos. En este ejemplo, todos los elementos tienen costos en **SP** y **GP**, lo que significa que el usuario puede elegir qué moneda gastar.

<Note>
  El [resultado](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase#startpurchaseresult) de la API `StartPurchase` del ejemplo de código anterior contiene una lista de `PaymentOptions`. Cada opción de pago contiene la `Currency`, el `Price` y el `ProviderName` que se pueden usar para realizar la compra.
</Note>

### Restricciones

Solo se permite *una* moneda virtual en una sola compra. Todos los elementos seleccionados deben poder comprarse con una *única moneda*.

La moneda debe especificarse en la llamada, lo que es importante cuando hay varias monedas posibles. La secuencia fallará si hay elementos en la solicitud sin los costos correspondientes en la moneda seleccionada.

El `ProviderName` también debe especificarse en la llamada. Para las compras con dinero real, el nombre del proveedor es quien se usa para financiar la compra, como Facebook, PayPal o Steam. Para las compras con moneda virtual, será una cadena basada en el identificador de su título. El `ProviderName` puede obtenerse del campo `PaymentOptions` del [StartPurchaseResult](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase#startpurchaseresult), tal como se describe en la **nota** anterior.

<Tip>
  Para las compras con moneda virtual, el `ProviderName` de su título es una cadena construida a partir de la palabra "Title" concatenada con el equivalente decimal de su `TitleId` hexadecimal. Por ejemplo, "Title123456".
</Tip>

### Procedimientos recomendados para mostrar los elementos de la tienda

Evite confundir a su jugador asegurándose de que todos los elementos de una tienda tengan opciones coherentes.

Los elementos de dinero real deberían estar en una tienda separada de los elementos de moneda virtual premium, y a su vez separados de los elementos de moneda virtual gratuita. Si una única tienda permite varias monedas, entonces *todos* los elementos de esa tienda deberían usar de forma coherente el mismo conjunto de monedas. Cree tantas tiendas como necesite para ofrecer una experiencia de cliente fluida.

```csharp theme={null}
void DefinePaymentCurrency(string orderId, string currencyKey, string providerName)
{
    var request =new PayForPurchaseRequest {
        OrderId = orderId, // orderId comes from StartPurchase above.
        Currency = currencyKey, // User defines which currency they wish to use to pay for this purchase (all items must have a defined/non-zero cost in this currency).
        ProviderName = providerName // providerName comes from the PaymentOptions in the result from StartPurchase above.
    };
    PlayFabClientAPI.PayForPurchase(request, LogSuccess, LogFailure);
}
```

Por último, una vez que la compra esté completamente definida, puede completar el proceso, como se muestra a continuación.

```csharp theme={null}
// Unity/C#
void FinishPurchase(string orderId)
{
    var request = new ConfirmPurchaseRequest { OrderId = orderId };
    PlayFabClientAPI.ConfirmPurchase(request, LogSuccess, LogFailure);
}
```

### Procedimientos recomendados para gestionar los resultados de error de la API

Cualquier llamada de API individual puede fallar por muchas razones. Los dispositivos inalámbricos, como los teléfonos, a menudo pueden tener conectividad intermitente, y cualquier llamada por Internet puede fallar debido a una latencia aleatoria.

Cada llamada debería comprobar varias condiciones de error. Debería anular la operación si la respuesta muestra que la solicitud no es válida (por ejemplo, no se pueden comprar varios elementos con una única moneda). Podría haber problemas con el diseño de su tienda.

Si la respuesta indica un error de conectividad, puede volver a intentarlo con un retraso de retirada exponencial.

## Conclusión

Las tiendas son un gran mecanismo para animar a sus jugadores a comprar elementos.

Las tiendas funcionan con cualquier tipo de moneda virtual. Las tiendas también pueden funcionar con dinero real a través de un conjunto alternativo de métodos de API.

* Puede configurar una compra de un único elemento con moneda virtual mediante [PurchaseItem](xref:titleid.playfabapi.com.client.playeritemmanagement.purchaseitem).
* Puede configurar una compra de varios elementos con dinero real o moneda virtual mediante la secuencia:
  * [StartPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase)
  * [PayForPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.payforpurchase)
  * [ConfirmPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.confirmpurchase)

Para obtener más información sobre las compras con dinero real, consulte [Procesamiento de pagos sin recibo](/services/playfab/economy-monetization/economy/tutorials/non-receipt-payment-processing).

Para un uso avanzado de las tiendas, consulte el tutorial [Tiendas personalizadas para segmentos de jugadores](/services/playfab/economy-monetization/economy/tutorials/custom-stores-for-player-segments).


## Related topics

- [Consumibles temporizados en Economy (heredado)](/es/services/playfab/economy-monetization/economy/tutorials/timed-consumables.md)
- [Obtención del valor hasta la fecha (VTD) de un jugador en Economy (heredado)](/es/services/playfab/economy-monetization/economy/tutorials/getting-a-players-vtd.md)
- [Tiendas personalizadas para segmentos de jugadores en Economy (heredada)](/es/services/playfab/economy-monetization/economy/tutorials/custom-stores-for-player-segments.md)
- [Procedimientos recomendados para la segmentación de tiendas en Economy (heredada)](/es/services/playfab/economy-monetization/economy/tutorials/best-practices-for-store-segmentation.md)
- [Tablas de botín en Economy (heredada)](/es/services/playfab/economy-monetization/economy/tutorials/drop-tables.md)
