En este documento, se detalla la integración de tus productos únicos (OTP) con la Biblioteca de Facturación Play. También se explica cómo integrar varias opciones de compra y ofertas relacionadas con tus productos únicos.
Puedes configurar varias opciones de compra y ofertas 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 API de queryProductDetailsAsync()
. 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 objeto ProductDetails
que devuelve el método queryProductDetailsAsync()
puede tener más de una opción de compra disponible para comprar o alquilar por producto único. Para obtener la lista de todas las ofertas aptas para cada objeto ProductDetails
, usa el método getOneTimePurchaseOfferDetailsList()
. En esta lista, solo se devolverán las ofertas y las opciones de compra para las que el usuario reúne los requisitos. El código del método onProductDetailsResponse()
debe controlar las ofertas devueltas.
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 un objeto BillingFlowParams
que contiene el objeto ProductDetails
relevante obtenido de la llamada a queryProductDetailsAsync()
. Para crear un objeto BillingFlowParams
, usa la clase BillingFlowParams.Builder
. Ten en cuenta que debes establecer el token de oferta correspondiente a la oferta que seleccionó el usuario cuando crees el objeto BillingFlowParams
.
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 del 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 otorga el derecho a un usuario, su 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
- Opción de compra de alquiler
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 por adelantado (solo se admite para la opción de compra)
- Oferta de descuento (compatible con las opciones de compra y alquiler)
Opción de compra
Una opción de compra de compra representa una compra 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 nuevo modelo. Para la retrocompatibilidad, al menos una opción de compra debe marcarse como compatible con versiones heredadas.
Los pasos para integrar las opciones de compra y alquiler con PBL son los mismos. Para comprender cómo integrar la opción de compra con PBL, consulta Integra la opción de compra de alquiler con PBL.
Opción de compra de alquiler
La opción de compra de alquiler permite a los usuarios acceder a los productos únicos durante un período específico. Puedes especificar el período de alquiler y su vencimiento. En este documento, se describen los pasos para integrar la opción de compra de alquiler con la Biblioteca de Play Billing (PBL).
Integrar la opción de compra de alquiler con PBL
En esta sección, se describe cómo integrar la opción de compra de alquiler con la Biblioteca de Facturación Play (PBL). Se supone que conoces los pasos iniciales de la integración de PBL, como agregar la dependencia de PBL a tu app, inicializar el BillingClient y conectarte a Google Play. En esta sección, se abordan los aspectos de la integración de PBL que son específicos de la opción de compra de alquiler.
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 Console. Para usar el servicio, puedes llamar a la API de REST directamente o usar la biblioteca cliente de Java.
Inicia un flujo de compra para la opción de alquiler
Para iniciar un flujo de compra de una oferta de alquiler, sigue estos pasos:
Recupera los metadatos de la opción de compra de alquiler con el método
ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails()
.En el siguiente ejemplo, se muestra cómo obtener los metadatos de la compra de alquiler:
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 método
launchBillingFlow()
del subproceso principal de la app. Este método toma una referencia para un objetoBillingFlowParams
que contiene el objetoProductDetails
relevante obtenido de la llamada aqueryProductDetailsAsync()
. Para crear un objetoBillingFlowParams
, usa la claseBillingFlowParams.Builder
. Ten en cuenta que debes establecer el token de oferta correspondiente a la oferta que seleccionó el usuario cuando crees el objetoBillingFlowParams
. Si un usuario cumple con los requisitos para la opción de compra de alquiler, 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.subscriptionOfferDetails() // 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<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( 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.subscriptionOfferDetails() // 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 delOneTimePurchaseOfferDetails
. 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
La función de pedidos 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 por adelantado de tu producto, acepta pagar el artículo cuando se lance, a menos que cancele el pedido por adelantado 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 elemento.
En este documento, se describen los pasos para integrar la oferta de compra de pedidos por adelantado con la Biblioteca de Facturación Play (PBL).
Integra la oferta de pedido por adelantado con PBL
En esta sección, se describe cómo integrar la oferta de pedido por adelantado con la Biblioteca de Facturación Play (PBL). Se supone que conoces los pasos iniciales de la integración de PBL, como agregar la dependencia de PBL a tu app, inicializar el 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 por adelantado.
Inicia un flujo de compra para una oferta de pedido por adelantado
Para iniciar un flujo de compra de una oferta de pedido por adelantado, sigue estos pasos:
Recupera los metadatos de la oferta de pedido por adelantado con el método
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()
. En el siguiente ejemplo, se muestra cómo obtener los metadatos de la oferta de pedido por adelantado: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 un objetoBillingFlowParams
que contiene el objetoProductDetails
relevante obtenido de la llamada a queryProductDetailsAsync(). Para crear un objetoBillingFlowParams
, usaBillingFlowParams.Builder class
. Ten en cuenta que debes establecer el token de oferta correspondiente a la oferta seleccionada por el usuario cuando crees el objetoBillingFlowParams
. Si un usuario cumple con los requisitos para la oferta de pedido por adelantado, 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
offerToken
se puede encontrar como parte delOneTimePurchaseOfferDetails
. 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 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 la oferta con descuento: Especifica detalles sobre el descuento porcentual o el descuento absoluto del precio original.
Países o regiones aptos: Especifica la disponibilidad de las 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 supera el límite de compra, no cumplirá con los requisitos para acceder a la oferta.
Tiempo limitado (opcional): Especifica el período durante el cual está disponible la oferta. Fuera de ese período, la oferta no es apta para la compra.
Recupera información sobre el precio de la oferta con descuento
En el caso de una oferta con descuento, puedes recuperar el porcentaje 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 descuento porcentual solo se devuelve 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 devuelve para las ofertas con descuento. Se debe especificar el descuento absoluto o el descuento porcentual 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 la hora de 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áximo a nivel de la oferta de descuento, que solo se aplica a nivel de la oferta. A continuación, se muestra un ejemplo a modo de ilustración:
- Los protectores de pantalla Super tienen 2 ofertas para el producto de protector de pantalla: protector de pantalla con opción de compra y protector de pantalla con descuento.
- El protector de pantalla de la opción de compra no tiene una cantidad limitada establecida.
- 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 tiene 1 protector de pantalla con descuento y planea comprar otro con el protector de pantalla con descuento.
- Cuando se recuperan las ofertas disponibles, el valor de LimitedQuantityInfo para el protector de pantalla de la 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 agotan la cantidad máxima de canjes para una oferta, el método getOneTimePurchaseOfferDetailsList()
no devuelve la oferta.
Cómo calcular el límite de canje
En el siguiente ejemplo, se muestra cómo obtener la información de cantidad limitada de 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 tiene en cuenta las compras consumidas o pendientes. Las compras que se cancelaron, reembolsaron o para las que se generó una devolución del cargo no se incluyen en la cantidad que posee el usuario. Por ejemplo:
Los protectores de pantalla premium configuran 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
PurchasesUpdatedListener
recibirá un código de respuesta ITEM_UNAVAILABLE.El usuario solicita un reembolso del protector de pantalla con descuento que compró 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 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 configuras la disponibilidad regional de una oferta, solo se devolverá como parte de getOneTimePurchaseOfferDetailsList()
si el usuario se encuentra en un país o región objetivo. De lo contrario, no formará parte de la lista de ofertas que se devuelven cuando llamas a queryProductDetailsAsync()
.
Etiquetas de oferta
En el siguiente ejemplo, se muestra cómo recuperar las etiquetas de oferta asociadas a 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 ofertas
Puedes establecer etiquetas de oferta para el producto, la opción de compra o la oferta de descuento. Las ofertas con descuento heredan las etiquetas de oferta de la oferta de la 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: un protector de pantalla con opción de compra y un protector de pantalla con descuento.
- El protector de pantalla Súper tiene la etiqueta de oferta de producto
SSProductTag
. - El protector de pantalla de la 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 la opción de compra devuelve SSProductTag
y SSPurchaseOptionTag
. En el caso de la oferta de descuento, el método devuelve SSProductTag
, SSPurchaseOptionTag
y SSDiscountOfferTag
.