Facturación en la aplicación de Android: compra estancias estatales "compradas" después de la cancelación del pedido

Actualmente estoy probando mi mecanismo de facturación de InApp (utilizando la API de la versión 3 de InApp Billing, por lo que tomo el ejemplo de TrivialDrive como referencia).

Tengo un elemento gestionado, que es la actualización a la versión premium.

Ahora, comprar el artículo con mi cuenta de prueba funciona, pero cuando hago una cancelación de la orden entera en la comprobación de Google después, mi código todavía me dice que el artículo es comprado y por lo tanto concede las características superiores.

Aquí es cómo compruebo para la compra en mi MainActivity. No guardo el estado de compra localmente en alguna parte, ya que entendí que con la API de facturación v3, puede consultar compras ad hoc según sea necesario.

@Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); iabHelper = new IabHelper(this, Helper.getPKey()); iabHelper.enableDebugLogging(true); iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { Log.d("IAB", "SETUP FINISHED"); if(!result.isSuccess()) { Log.d("IAB", "SETUP NOT OK"); return; } else Log.d("IAB", "SETUP OK"); iabHelper.queryInventoryAsync( new QueryInventoryFinishedListener() { @Override public void onQueryInventoryFinished(IabResult result, Inventory inv) { Log.d("IAB", "Query inventory finished."); if (result.isFailure()) { Log.d("IAB","Failed to query inventory: " + result); return; } Log.d("IAB", "Query inventory was successful."); // Do we have the premium upgrade? boolean mIsPremium = inv.hasPurchase(Helper.premiumSku); Purchase p = inv.getPurchase(Helper.premiumSku); if(p != null) Log.d("IAB PURCHASE STATE", IabHelper.getResponseDesc(p.getPurchaseState())); else Log.d("IAB PURCHASE STATE", "Purchase is null"); Log.d("IAB", "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM")); } } ); } }); } 

Sigo recibiendo getPurchaseState = 0, lo que significa que está comprado, incluso una hora después de haber cancelado la orden. ¿Por qué?

Paso 1. Espere aproximadamente 10 minutos; Hasta que usted vea el "orden cancelado" fue entregado. En su cartera de google.

Sep 15 11:28 AM Cancelado La orden fue entregada.

Sep 15 11:18 AM Cancelado Canceló este pedido. Motivo: Solicitud del cliente para cancelar.

Paso 2. Salga de su cuenta de prueba de google en el dispositivo y luego vuelva a iniciar sesión.

Por lo menos eso resolvió mi problema.

Sé que este es un año de edad, pero ninguna de las respuestas / consejos presentados me ayudó así que pensé que iba a añadir mi solución.

Primero, estaba experimentando el mismo problema. Es decir, hizo una compra de prueba, canceló, todavía recibió un estado de compra que indica la compra válida.

Lo que me olvidé fue que cambié recientemente el campo "Respuesta a la prueba de licencia" en el panel de configuración de la Consola del programador de Google Play de "RESPOND_NORMALLY" a "LICENCIADO"

Después de volverlo a "RESPOND_NORMALLY", el estado de compra de la compra cancelada se devolvió correctamente como tal.

Por lo tanto, es posible que desee comprobar que antes de intentar esperar días

Este problema también se produce cuando se utiliza la aplicación en otro dispositivo con la misma cuenta. El artículo no se recibe como comprado hasta que el dispositivo se reinicie, incluso después de horas. Si intenta comprar de nuevo, el cuadro de diálogo de Google Wallet dice "item already owned". El código de retorno de iabHelper todavía está "cancelado por el usuario" porque la respuesta real de la actividad de compra no se devuelve, simplemente escrita en el registro de depuración.

 else if (resultCode == Activity.RESULT_CANCELED) { logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode)); result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled."); if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); } 

Por lo tanto, no es posible reaccionar a este cuadro de diálogo de facturación de google porque siempre estamos obteniendo el mismo resultado IABHELPER_USER_CANCELED, incluso si el diálogo dice "item already owned".

Editar:

Lo soluciono con esto:

 else if (resultCode == Activity.RESULT_CANCELED) { logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode)); if(responseCode == 7) result = new IabResult(BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED, "Item already owned."); else result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled."); if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); } 

Así que ahora si la respuesta del cuadro de diálogo de facturación es 7 como "Artículo ya poseído", lo reporto a mi oyente.

Después de haber esperado durante unas 12 horas y haber intentado todo lo sugerido aquí, todavía estaba enfrentando el mismo problema. Lo que el truco para mí fue el siguiente comando adb:

Adb shell pm clear com.android.vending

Ya está bien respondida en los documentos oficiales de Google. Copiar las palabras aquí.

Cuando el usuario cancela una suscripción, Google Play no ofrece un reembolso por el ciclo de facturación actual. En su lugar, permite al usuario tener acceso a la suscripción cancelada hasta el final del ciclo de facturación actual, momento en el que termina la suscripción. Por ejemplo, si un usuario compra una suscripción mensual y la cancela el día 15 del ciclo, Google Play considerará que la suscripción es válida hasta el final del día 30 (u otro día, dependiendo del mes).

Eso debería explicar todo. getPurchase() seguirá devolviendo los datos de compra hasta el final del ciclo de suscripción actual.

Si veo correctamente el código de referencia en la trivialdrivesample está mal, lo que sería una vergüenza para el proyecto oficial de referencia para la facturación de la aplicación.

Si compra == null significa que nunca se ha comprado. Para obtener la información real que tiene que llamar

 purchase.getPurchaseState() 

De acuerdo a aquí

PurchaseState Estado de compra del pedido. Los valores posibles son 0 (comprado), 1 (cancelado), 2 (reembolsado) o 3 (caducado, solo para compras por suscripción).

He encontrado la siguiente sección en la documentación (IAB API v2), pero no estoy seguro si esto se puede utilizar para IAB API v3. Sin embargo, la emisión todavía puede enviarse.

"… su aplicación puede recibir una intención de difusión IN_APP_NOTIFY cuando Google Play recibe una notificación de reembolso de Google Wallet. En este caso, Google Play envía un mensaje IN_APP_NOTIFY a su aplicación. Un mensaje REQUEST_PURCHASE iniciado por la aplicación para que finalmente su aplicación reciba un mensaje PURCHASE_STATE_CHANGED que incluya información sobre el artículo que se ha reembolsado.La información de reembolso está incluida en la cadena JSON que acompaña a la intención de la difusión PURCHASE_STATE_CHANGED.Además, el campo purchaseState en el JSON Cadena se establece en 2. "

Desde: http://developer.android.com/google/play/billing/v2/api.html#billing-action-notify

Sólo reinicie.

Trabajó para mí. Android 5.1.1 en Nexus 4

Lo que puede utilizar es el campo autoRenewing de los datos de compra. Según la documentación :

AutoRenewing: Indica si la suscripción se renueva automáticamente. Si es true, la suscripción estará activa y se renovará automáticamente en la siguiente fecha de facturación. Si es falso, indica que el usuario ha cancelado la suscripción .

Y este campo se actualiza inmediatamente después de la cancelación.

  • Android InApp Billing v3 - prueba con varios dispositivos
  • Android IAB - Actividad destruida después de una compra exitosa
  • Error de facturación en la aplicación de Android Error: Este artículo no se pudo comprar. (Código de error: IAB-DPTL)
  • Android en la aplicación de compra, cómo comprobar si el usuario ha comprado un artículo
  • ¿En qué condiciones se aplican los cambios de servidor de versión 3 de facturación en la aplicación disponibles en los dispositivos cliente?
  • Cancelar En la suscripción de facturación de aplicaciones en android
  • ¿Cómo activar un producto integrado en la aplicación en la consola de Google Play para desarrolladores mientras la aplicación está en borrador?
  • Android InApp facturación envoltura?
  • Prueba del producto gestionado por puchase en la aplicación
  • "Usted ya posee este artículo" pero las compras están vacías
  • podemos probar la aplicación Android de compra en la aplicación a través del emulador de API de GOOGLE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.