test - in app purchase android studio
¿Google Play In-App Billing Version 3 admite reembolsos? (3)
Conseguí que IAB v3 funcionara y pude hacer una compra para un artículo administrado. Sin embargo, para continuar desarrollando y probando, quería reembolsar la compra para poder intentar hacer la misma compra nuevamente. Ingresé a mi cuenta de Google Checkout Merchant y reembolsé la compra con éxito. Sin embargo, la aplicación aún cree que el usuario ha comprado el artículo. Ya han pasado varias semanas desde que hice el reembolso, así que no es un problema de retraso.
Básicamente, en mi implementación de QueryInventoryFinishedListener
, inventory.hasPurchase(SKU_REMOVE_ADS)
siempre devuelve true, incluso después del reembolso ( SKU_REMOVE_ADS
es el SKU para el artículo que estoy vendiendo). Esperaba que volviera falso después de que se hubiera procesado el reembolso.
Si observa la sección ''Manejo de reembolsos'' de la referencia de IAB , dice que su aplicación necesita escuchar los mensajes IN_APP_NOTIFY. Sin embargo, la documentación para IN_APP_NOTIFY es específica para v2 de facturación en la aplicación. No parece ser algo que esté disponible en v3, ya que no se menciona en ninguna parte en la referencia de v3 ni puedo encontrar ninguna referencia para él en la aplicación TrivialDrive de muestra que están usando para demostrar IAB v3.
Entonces, ¿v3 de IAB admite reembolsos / cancelaciones de compras? ¿Alguien lo ha probado y lo ha hecho funcionar?
Desde la publicación de esta pregunta, se me ha getPurchase(...).getPurchaseState()
que debo llamar a getPurchase(...).getPurchaseState()
y verificar su valor. Los valores posibles son 0 (comprado), 1 (cancelado) o 2 (reembolsado).
Sin embargo, en mi caso, aún está retornando a 0 (comprado) a pesar de que el artículo es reembolsado. Estoy publicando esta información aquí en caso de que ayude a alguien más.
Le sugeriré que utilice identificadores de productos estáticos mientras su aplicación se encuentra en fase de desarrollo.
¿Ahora asegúrese de que está probando la aplicación con la misma ID de Gmail para la cual tiene reembolso? Para probar el escenario de reembolso, creo que puede usar android.test.refunded
como identificación del producto.
Si esto no funciona, primero puede verificar el (los) artículo (s) comprado (s) y el (los) artículo (s) disponible (s) en Google Play en el primer lanzamiento de su aplicación y si obtiene la misma identificación del producto en ambas llamadas (lo cual no debería ser el caso) si este es el caso, informe este error a google) luego haga una llamada a la API para hacer el mismo artículo que consumió.
Realmente no hay diferencia entre un artículo consumible y un artículo no consumible en lo que respecta a Google Play; Esta distinción se basa completamente en lo que implementas dentro de tu aplicación. Por lo tanto, aunque la SKU que está probando no es consumible (por ejemplo, una actualización premium permanente), para propósitos de prueba, puede tratarlo como un consumible y consumirlo, para que pueda volver a comprarlo.
Un método conveniente es configurar un menú de prueba temporal dentro de su aplicación (por ejemplo, agregando un elemento de menú durante la prueba en el menú de opciones principales de su aplicación), y luego hacer que el controlador de ese elemento invoque el método consumeAsync () de su instancia de IabHelper para el código de artículo que desea probar de nuevo. Esto consumirá el artículo y, por lo tanto, lo pondrá inmediatamente disponible para la recompra desde su dispositivo.
Por supuesto, todavía querrá reembolsar la compra de Google Checkout, para que no gaste su propio dinero solo para probar su aplicación.
Me gustaría agregar que consumeAsync () también parece funcionar bien para restablecer el SKU de prueba android.test.purchased, si está probando usando tales valores estáticos.
Con respecto a la actualización del estado de compra para reflejar un reembolso, he experimentado personalmente (y hay muchos informes similares publicados por otros desarrolladores) que el inicio manual de un reembolso a través de Checkout (por ejemplo, para una compra de prueba de la aplicación TrivialDrive) lleva días en un cambio en el estado de compra del producto (a INAPP_PURCHASE_STATE_REFUNDED).
(Sabiendo que la miseria ama a la compañía, algunos de esos informes adicionales se pueden encontrar en este hilo de discusión: https://plus.google.com/+AndroidDevelopers/posts/R8DKwZDsz5m )
Al menos parte de esto se debe al almacenamiento en caché de Google Play de los datos de compra en el dispositivo.
En mi experiencia, reiniciar un dispositivo a veces puede hacer que Google Play actualice su caché desde los servidores de GP. Por lo tanto, es posible que los cambios debidos a la cancelación o el reembolso de un pedido a través de Checkout también se puedan detectar después de un reinicio.
Podría parecer que un período de respuesta tan largo no le haría ningún bien, ya que no puede saber cuándo se reiniciarán los usuarios. Pero nuevamente, usted sabe que eventualmente se reiniciarán todos los dispositivos, por lo que si le preocupa que un usuario que reciba un reembolso no pueda usar el producto IAB reembolsado, es posible que algunos días de retraso no importen mucho. mientras eventualmente suceda.
Por supuesto, recuerde que esta noción de que la memoria caché se actualizará en un reinicio no está documentada y es anecdótica (como muchos comportamientos de IAB3 y TrivialDrive, hasta el momento). Folklore, lo llaman.
Otra cosa que desencadena una actualización es cuando el usuario intenta comprar el producto. Tan pronto como se inicie la compra, el sistema debe asegurarse de que el producto no es de su propiedad y, por lo tanto, actualiza la memoria caché de Google Play. En mi experiencia personal, esto siempre ha ocurrido. Pero, de nuevo, esta no es una forma muy práctica de verificar un reembolso, ya que eso implicaría mostrar el cuadro de diálogo de compra de forma inesperada y también un mensaje de error que le dice al usuario "ya tienes esto" (si es que lo tiene).
Cuando esto resulta útil es cuando el usuario paga un artículo de IAB en uno de sus dispositivos y luego intenta acceder a ese artículo en un dispositivo diferente que es propiedad de la misma cuenta que se usó para comprarlo. La información de compra en ese caso muy a menudo aún no se ha almacenado en caché. Pero solo puede poner una pequeña nota en el cuadro de diálogo de compra de que si el artículo ya ha sido comprado, al intentar volver a comprarlo, debería estar disponible en el dispositivo actual sin cargo adicional. A veces se requieren dos intentos de compra (iniciados por el usuario) para obtener finalmente la respuesta IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED. Sí, un poco torpe, pero creo que en términos humanos funcionará con el resaltado apropiado del mensaje y la redacción de disculpas del diálogo de confirmación que les dice que son los dueños del artículo, etc. :-)).
Como cuestión práctica, puede ver cómo Google no quiere que todas las instancias de todas las aplicaciones IAB en el mundo accedan a sus servidores cada vez que se accede a los datos de compra de la aplicación, especialmente dado que están aconsejando a los desarrolladores que verifiquen lo que tiene. comprado cada vez que se inicia la aplicación. También es un problema de rendimiento para su aplicación, de eso se trata el almacenamiento en caché. Por lo tanto, debe tener en cuenta los factores desencadenantes para actualizar el caché, y no he encontrado un solo lugar donde esto esté documentado oficialmente (excepto, suponemos, en el código). Así que prepárate para poner tus manos frente a ti y comienza a sentirte en la oscuridad.
Para obtener información adicional sobre el búfer de Google Play, consulte esta página:
Me gustaría señalar que en el fragmento de código de tu publicación estás llamando a inventory.hasPurchase (SKU_REMOVE_ADS), pero eso solo te dirá si la compra está en la lista de compras devueltas en el objeto de inventario; no le dirá el estado de la compra para ese SKU. Sé que este es el enfoque utilizado por la aplicación TrivialDrive, pero esa aplicación no está tratando con reembolsos y cancelaciones. Para detectar reembolsos y pedidos cancelados, necesitará algo como esto:
Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS);
if(removeAdsPurchase != null) {
int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState();
if(purchaseStateForRemoveAds == 1) {
//Do cancelled purchase stuff here
}
else if(purchaseStateForRemoveAds == 2) {
//Do refunded purchase stuff here
}
}
La buena noticia sobre los reembolsos y los pedidos cancelados es que ambos, AFAIK, están totalmente a elección del desarrollador. Entonces, si encuentra que los usuarios que obtienen estos pueden continuar usando su aplicación durante un largo intervalo a partir de entonces, y si encuentra que muchos usuarios se están aprovechando de esto, entonces puede decidir si desea continuar proporcionando los reembolsos en todos los casos. Mi mejor conjetura es que no será un problema; incluso si algún usuario que obtiene un reembolso puede usar su aplicación por un tiempo después de eso, eso no se ve como un gran problema.
Es para la prueba que necesita la capacidad de volver a intentar una compra muy rápidamente, y usar consumAsync () definitivamente funciona para ese propósito.