En este documento, se detalla la integración de tus productos únicos (PU) con la Biblioteca de Facturación Play. Además, se explica cómo integrar varias ofertas y opciones de compra relacionadas con tus productos únicos.
Puedes configurar varias ofertas y opciones de compra para tus productos únicos. Por ejemplo, puedes configurar una opción de compra y una oferta de pedido anticipado para el mismo producto único.
Requisitos previos
Para configurar varias ofertas para productos únicos, debes usar la
queryProductDetailsAsync() API. No se admite la API de querySkuDetailsAsync() obsoleta. Para obtener información sobre cómo usar
queryProductDetailsAsync() y la versión de launchBillingFlow()
que toma ProductDetailsParams como entrada, consulta los pasos de migración.
Consulta los detalles del producto
Si configuraste varias ofertas o opciones de compra para tu producto único, el ProductDetails que muestra el
queryProductDetailsAsync() puede tener más de una opción de compra Comprar
o Alquilar disponible por producto único. Para obtener la lista de todas las
ofertas aptas para cada objeto ProductDetails, usa el
getOneTimePurchaseOfferDetailsList() método. Solo se mostrarán las ofertas y las opciones de compra para las que el usuario sea apto como parte de esta lista. Tu código
en el onProductDetailsResponse() método debe controlar las ofertas que se muestran.
Inicia el flujo de facturación
Para iniciar una solicitud de compra desde la app, llama al launchBillingFlow()
método del subproceso principal de la app. Este método toma una referencia para un
BillingFlowParams objeto que contiene el ProductDetails
objeto relevante obtenido de la llamada a queryProductDetailsAsync(). Para crear un
BillingFlowParams objeto, usa la BillingFlowParams.Builder
clase. Ten en cuenta que debes establecer el token de oferta correspondiente a la oferta
seleccionada por el usuario cuando crees el BillingFlowParams objeto.
En el siguiente ejemplo, se muestra cómo iniciar el flujo de compra de un producto único con varias ofertas:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for productDetails by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
El offerToken se puede encontrar como parte de OneTimePurchaseOfferDetails. Cuando le muestres la oferta al usuario, asegúrate de configurar los parámetros del flujo de facturación con el token de oferta correcto, que puedes obtener del método oneTimePurchaseOfferDetails.getOfferToken().
Ofertas y opciones de compra
Una opción de compra te permite definir cómo se le otorga al usuario el derecho de acceso, el precio y en qué región está disponible el producto. Un solo producto puede tener varias opciones de compra, que pueden representar dónde y cómo vendes tu producto.
Google Play admite las siguientes opciones de compra para productos únicos:
- Opción de compra Comprar
- Opción de compra Alquilar
Las ofertas hacen referencia a un esquema de precios que puedes crear para tus productos únicos. Por ejemplo, puedes crear una oferta de descuento para tu producto único.
Google Play admite las siguientes ofertas de compra para productos únicos:
- Oferta de pedido anticipado (solo se admite para la opción de compra Comprar)
- Oferta de descuento (se admite para las opciones de compra Comprar y Alquilar)
Opción de compra Comprar
Una opción de compra Comprar representa una adquisición estándar y directa del producto único. Tiene un campo legacyCompatible opcional, que indica si esta opción de compra estará disponible en flujos anteriores de la Biblioteca de Facturación Play (versión 7 o anterior) que no admiten el modelo nuevo. Para la retrocompatibilidad, al menos una opción de compra Comprar debe marcarse como compatible con versiones heredadas.
Los pasos para integrar las opciones de compra Comprar y Alquilar con la PBL son los mismos. Para comprender cómo integrar la opción de compra Comprar con la PBL, consulta Integra la opción de compra Alquilar con la PBL.
Opción de compra Alquilar
La opción de compra Alquilar permite a los usuarios acceder a los productos únicos durante un período especificado. Puedes especificar el período de alquiler y su vencimiento. En este documento, se describen los pasos para integrar la opción de compra Alquilar con la Biblioteca de Facturación Play (PBL).
Integra la opción de compra Alquilar con la PBL
En esta sección, se describe cómo integrar la opción de compra Alquilar con la Biblioteca de Facturación Play (PBL). Se supone que estás familiarizado con los pasos iniciales de integración de la PBL , como agregar la dependencia de la PBL a tu app, inicializar BillingClient y conectarte a Google Play. En esta sección, se describen los aspectos de la integración de la PBL que son específicos de la opción de compra Alquilar.
Para configurar los productos disponibles para alquilar, deberás usar el nuevo servicio monetization.onetimeproducts de la API de Play Developer o la IU de Play Developer Console. Para usar el servicio, puedes llamar directamente a la API de REST o
usar la biblioteca cliente de Java.
Inicia un flujo de compra para la opción Alquilar
Para iniciar un flujo de compra para una oferta de alquiler, sigue estos pasos:
Recupera los metadatos de la opción de compra Alquilar con el
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()método.En el siguiente ejemplo, se muestra cómo obtener los metadatos de la opción de compra Alquilar:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a rent purchase option. if (oneTimePurchaseOfferDetails.getRentalDetails() != null) { // process the returned RentalDetails OneTimePurchaseOfferDetails.RentalDetails rentalDetails = oneTimePurchaseOfferDetails.getRentalDetails(); // Get rental period in ISO 8601 format. String rentalPeriod = rentalDetails.getRentalPeriod(); // Get rental expiration period in ISO 8601 format, if present. if (rentalDetails.getRentalExpirationPeriod() != null) { String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod(); } // Get offer token String offerToken = oneTimePurchaseOfferDetails.getOfferToken(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
Inicia el flujo de facturación.
Para iniciar una solicitud de compra desde la app, llama al
launchBillingFlow()método del subproceso principal de la app. Este método toma una referencia para un objetoBillingFlowParamsque contiene el objetoProductDetailsrelevante obtenido de la llamada aqueryProductDetailsAsync(). Para crear unBillingFlowParamsobjeto, usa la claseBillingFlowParams.Builder. Ten en cuenta que debes establecer el token de oferta correspondiente a la oferta seleccionada por el usuario cuando crees elBillingFlowParamsobjeto. Si un usuario es apto para la opción de compra Alquilar, recibirá una oferta con RentalDetails y offerId enqueryProductDetailsAsync().En el siguiente ejemplo, se muestra cómo iniciar el flujo de facturación:
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ... val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for productDetails by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.getSubscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<BillingFlowParams.ProductDetailsParams> productDetailsParamsList = ImmutableList.of( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.getSubscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
El
offerTokense puede encontrar como parte deOneTimePurchaseOfferDetails. Cuando le muestres la oferta al usuario, asegúrate de configurar los parámetros del flujo de facturación con el token de oferta correcto, que puedes obtener del métodooneTimePurchaseOfferDetails.getOfferToken().
Oferta de pedido por adelantado
El pedido por adelantado te permite configurar productos únicos para que se compren antes de que se lance el artículo. Cuando un usuario hace un pedido anticipado de tu producto, acepta que pagará el artículo cuando se lance el producto, a menos que cancele el pedido anticipado antes de la fecha de lanzamiento. En la fecha de lanzamiento, se le cobrará al comprador, y Play le notificará por correo electrónico que se lanzó el artículo.
En este documento, se describen los pasos para integrar la oferta de compra de pedido anticipado con la Biblioteca de Facturación Play (PBL).
Integra la oferta de pedido anticipado con la PBL
En esta sección, se describe cómo integrar la oferta de pedido anticipado con la Biblioteca de Facturación Play (PBL). Se supone que estás familiarizado con los pasos iniciales de integración de la PBL , como agregar la dependencia de la PBL a tu app, inicializar BillingClient y conectarte a Google Play. En esta sección, se describen los aspectos de la integración de la PBL que son específicos de la oferta de pedido anticipado.
Inicia un flujo de compra para una oferta de pedido anticipado
Para iniciar un flujo de compra para una oferta de pedido anticipado, sigue estos pasos:
Recupera los metadatos de la oferta de pedido anticipado con el
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()método. En el siguiente ejemplo, se muestra cómo obtener los metadatos de la oferta de pedido anticipado:Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // Checks if the offer is a preorder offer. if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) { // process the returned PreorderDetails OneTimePurchaseOfferDetails.PreorderDetails preorderDetails = oneTimePurchaseOfferDetails.getPreorderDetails(); // Get preorder release time in millis. long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis(); // Get preorder presale end time in millis. long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis(); // Get offer ID String offerId = oneTimePurchaseOfferDetails.getOfferId(); // Get the associated purchase option ID if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) { String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId(); } } } } } });
Inicia el flujo de facturación.
Para iniciar una solicitud de compra desde la app, llama al método
launchBillingFlow()del subproceso principal de la app. Este método toma una referencia para unBillingFlowParamsobjeto que contiene elProductDetailsobjeto relevante obtenido de la llamada a queryProductDetailsAsync(). Para crear unBillingFlowParamsobjeto, usa laBillingFlowParams.Builder class. Ten en cuenta que debes establecer el token de oferta correspondiente a la oferta seleccionada por el usuario cuando crees elBillingFlowParamsobjeto. Si un usuario es apto para la oferta de pedido anticipado, recibirá una oferta con PreorderDetails y offerId en el métodoqueryProductDetailsAsync().En el siguiente ejemplo, se muestra cómo iniciar el flujo de facturación:
Java
// An activity reference from which the billing flow will launch. Activity activity = ...; ImmutableList productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for productDetails by calling queryProductDetailsAsync() .setProductDetails(productDetails) // to get an offer token, call // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers // that are available to the user .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
El
offerTokense puede encontrar como parte deOneTimePurchaseOfferDetails. Cuando le muestres la oferta al usuario, asegúrate de configurar los parámetros del flujo de facturación con el token de oferta correcto, que puedes obtener del métodooneTimePurchaseOfferDetails.getOfferToken().
Oferta de descuento
En esta sección, se describe cómo puedes configurar ofertas de descuento para tus productos únicos.
Hay cuatro parámetros diferentes que puedes configurar en una oferta de descuento de producto único:
Precio de oferta con descuento: Especifica detalles sobre el porcentaje de descuento o el precio absoluto del precio original.
Elegibilidad de países o regiones: Especifica la disponibilidad de ofertas de productos únicos en un país o una región.
Límite de compra (opcional): Te permite determinar cuántas veces un usuario puede canjear la misma oferta. Si un usuario excede el límite de compra, no será apto para la oferta.
Tiempo limitado (opcional): Especifica el período durante el cual está disponible la oferta. Fuera del período, la oferta no es apta para la compra.
Recupera información sobre el precio de la oferta con descuento
Para una oferta con descuento, puedes recuperar el porcentaje de descuento o el descuento absoluto ofrecido.
Ejemplo 1: Recupera el porcentaje de descuento de la oferta con descuento
En el siguiente ejemplo, se muestra cómo obtener el precio completo original de la oferta con descuento y su porcentaje de descuento. Ten en cuenta que la información del porcentaje de descuento solo se muestra para las ofertas con descuento.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult){ // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { long discountedOfferPriceMicros = oneTimePurchaseOfferDetails.getPriceAmountMicros(); // process the returned fullPriceMicros and percentageDiscount. if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) { long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros(); } if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) { long percentageDiscount = oneTimePurchaseOfferDetails .getDiscountDisplayInfo() .getPercentageDiscount(); } // … } } } });
Ejemplo 2: Recupera el descuento absoluto de la oferta con descuento
En el siguiente ejemplo, se muestra cómo obtener el precio completo original de la oferta con descuento y su descuento absoluto en micros. Ten en cuenta que la información del descuento absoluto en micros solo se muestra para las ofertas con descuento. Se debe especificar el descuento absoluto o el porcentaje de descuento para una oferta de descuento.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { long discountedOfferPriceMicros = oneTimePurchaseOfferDetails.getPriceAmountMicros(); // process the returned fullPriceMicros and absolute DiscountAmountMicros. if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) { long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros(); } if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) { long discountAmountMicros = oneTimePurchaseOfferDetails .getDiscountDisplayInfo() .getDiscountAmount() .getDiscountAmountMicros(); } // … } } } });
Obtén el período válido de una oferta
Puedes usar el método OneTimePurchaseOfferDetails.getValidTimeWindow() para obtener el período válido de una oferta. Este objeto contiene la hora de inicio y finalización del período en milisegundos.
En el siguiente ejemplo, se muestra cómo obtener el período válido de una oferta:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) { // process the returned startTimeMillis and endTimeMillis. ValidTimeWindow validTimeWindow = oneTimePurchaseOfferDetails.getValidTimeWindow(); long startTimeMillis = validTimeWindow.getStartTimeMillis(); long endTimeMillis = validTimeWindow.getEndTimeMillis(); // … } } } } });
Cantidad limitada a nivel de la oferta de descuento
Puedes especificar el límite de cantidad máxima a nivel de la oferta de descuento, que se aplica solo a nivel de la oferta. Este es un ejemplo para ilustrarlo:
- Super screensavers tiene 2 ofertas para el producto de protector de pantalla: protector de pantalla de opción de compra y protector de pantalla de descuento.
- El protector de pantalla de opción de compra no tiene una cantidad limitada configurada.
- El protector de pantalla de descuento tiene la cantidad máxima permitida a nivel de la oferta establecida en 3.
- El producto de protector de pantalla no tiene una cantidad máxima permitida a nivel del producto, por lo que los usuarios pueden comprar cantidades ilimitadas de este producto.
- El usuario posee 1 protector de pantalla de descuento y planea comprar otro con el protector de pantalla de descuento.
- Cuando se recuperan las ofertas disponibles, LimitedQuantityInfo para el protector de pantalla de opción de compra es nulo y el valor de la cantidad restante para el protector de pantalla de descuento es 2.
En el siguiente ejemplo, se muestra cómo obtener la cantidad limitada a nivel de la oferta de descuento:
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) { // process the returned maximumQuantity and remainingQuantity. LimitedQuantityInfo limitedQuantityInfo = oneTimePurchaseOfferDetails.getLimitedQuantityInfo(); int maximumQuantity = limitedQuantityInfo.getMaximumQuantity(); int remainingQuantity = limitedQuantityInfo.getRemainingQuantity(); // … } } } } });
Cuando los usuarios usan los canjes de cantidad máxima para una oferta, el método getOneTimePurchaseOfferDetailsList() no muestra la oferta.
Calcula el límite de canje
En el siguiente ejemplo, se muestra cómo obtener la información de cantidad limitada en una oferta de descuento determinada. Puedes obtener la cantidad máxima permitida y la cantidad restante para el usuario actual. Ten en cuenta que la función de cantidad limitada se aplica a las ofertas de productos únicos consumibles y no consumibles. Esta función solo se admite a nivel de la oferta.
Google Play calcula la cantidad restante restando la cantidad que posee el usuario de la cantidad máxima permitida que configuraste. Cuando se cuenta la cantidad que posee el usuario, Google Play considera las compras consumidas o pendientes. Las compras que se cancelaron, reembolsaron o revirtieron no se incluyen en la cantidad que posee el usuario. Por ejemplo:
Super screensavers configuró una oferta de descuento con la cantidad máxima permitida de uno, por lo que los usuarios pueden comprar hasta un protector de pantalla con descuento.
El usuario compra uno de los protectores de pantalla con descuento. Si el usuario intenta comprar el segundo protector de pantalla con descuento, se producirá un error y
PurchasesUpdatedListenerobtendrá un código de respuesta ITEM_UNAVAILABLE.El usuario solicita un reembolso del protector de pantalla con descuento comprado originalmente y lo recibe correctamente. El usuario intenta comprar uno de los protectores de pantalla con descuento, y la compra se realizará correctamente.
Elegibilidad por país y región
Puedes elegir los países o las regiones en los que la oferta de opción de compra o la oferta de descuento estarán disponibles para los usuarios. Google Play evaluará la elegibilidad del usuario según el país de Play. Cuando configures la disponibilidad regional para una oferta, solo se mostrará como parte de getOneTimePurchaseOfferDetailsList() si el usuario se encuentra en un país o una región segmentados. De lo contrario, no formará parte de la lista de ofertas que se muestran cuando llamas a queryProductDetailsAsync().
Etiquetas de oferta
En el siguiente ejemplo, se muestra cómo recuperar las etiquetas de oferta asociadas con una oferta.
Java
billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse( BillingResult billingResult, QueryProductDetailsResult productDetailsResult) { // check billingResult // … // process productDetailsList returned by QueryProductDetailsResult for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) { for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails : productDetails.getOneTimePurchaseOfferDetailsList()) { // process the returned offer tags. ImmutableList<String> offerTags = oneTimePurchaseOfferDetails.getOfferTagsList(); // … } } } });
Herencia de etiquetas de oferta
Puedes establecer etiquetas de oferta para el producto, la opción de compra o la oferta de descuento. Las ofertas de descuento heredan las etiquetas de oferta de su oferta de opción de compra. Del mismo modo, si las etiquetas de oferta se especifican a nivel del producto, tanto la oferta de opción de compra como las ofertas de descuento heredan las etiquetas de oferta del producto.
Por ejemplo, Super screensavers tiene dos ofertas para el producto de protector de pantalla: protector de pantalla de opción de compra y protector de pantalla de descuento.
- Super screensaver tiene la etiqueta de oferta del producto
SSProductTag. - El protector de pantalla de opción de compra tiene la etiqueta de oferta
SSPurchaseOptionTag. - El protector de pantalla de descuento tiene la etiqueta de oferta
SSDiscountOfferTag.
En este ejemplo, el método oneTimePurchaseOfferDetails.getOfferTagsList() para la oferta de opción de compra muestra SSProductTag y SSPurchaseOptionTag. Para la oferta de descuento, el método muestra SSProductTag, SSPurchaseOptionTag y SSDiscountOfferTag.