android - test - in app purchase traduccion
Facturación en la aplicación de Android: el estado de compra permanece "comprado" después de la cancelación de la orden (8)
Actualmente estoy probando el mecanismo de facturación de InApp (utilizando la API de la versión 3 de facturación de InApp, por lo tanto, tomo el ejemplo de TrivialDrive como referencia).
Tengo un artículo administrado, que es la actualización a la versión premium.
Ahora, comprar el artículo con mi cuenta de prueba funciona, pero cuando cancelo todo el pedido en Google Checkout luego, mi código aún me dice que el artículo se compró y, por lo tanto, otorga las características premium.
Así es como compruebo 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 obteniendo getPurchaseState = 0, lo que significa que se compra, incluso una hora después de que cancelé el pedido. ¿Por qué?
Después de haber esperado alrededor de 12 horas y haber intentado todo lo que se sugirió aquí, todavía estaba enfrentando el mismo problema. ¿Cuál fue el truco para mí fue el siguiente comando adb:
adb shell pm clear com.android.vending
Encontré la siguiente sección en la documentación (IAB API v2), pero no estoy seguro si esto se puede usar para IAB API v3. Sin embargo, la transmisión aún podría enviarse.
"... su aplicación puede recibir un intento de transmisió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. Su aplicación puede manejar este mensaje de la misma manera que maneja las respuestas de 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 se incluye en la cadena JSON que acompaña al intento de transmisión PURCHASE_STATE_CHANGED. Además, el campo purchaseState en el JSON string está establecido en 2. "
desde: http://developer.android.com/google/play/billing/v2/api.html#billing-action-notify
Este problema también se produce cuando se usa la aplicación en otro dispositivo con la misma cuenta. El artículo no se recibió tal como se compró hasta que se reinicie el dispositivo, incluso después de horas. Si intenta volver a comprar, el cuadro de diálogo de la cartera de Google dice "artículo que ya tiene". El código de retorno del iabHelper sigue siendo "cancelado por el usuario" porque la respuesta real de la actividad de compra no se devuelve, simplemente se escribe 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 obtenemos el mismo resultado IABHELPER_USER_CANCELED, incluso si el cuadro de diálogo indica "elemento que ya posee".
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);
}
Entonces, si la respuesta del cuadro de diálogo de facturación es 7 como "Artículo que ya está en su poder", se lo comunico a mi oyente.
Lo que puede usar es el campo de autoRenewing
de los datos de compra. De acuerdo con la documentation :
AutoRenewing: indica si la suscripción se renueva automáticamente. Si es verdadero, la suscripción está activa y se renovará automáticamente en la próxima 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.
Paso 1. Espera aproximadamente 10 minutos; Hasta que vea que se entregó el "pedido cancelado". en tu billetera de google
15 de septiembre 11:28 AM Cancelado El pedido fue entregado.
15 de septiembre 11:18 AM Cancelado Usted canceló esta orden. Motivo: solicitud del cliente para cancelar.
Paso 2. Cierre sesión en su cuenta google de prueba en el dispositivo y luego vuelva a iniciar sesión.
Al menos eso resolvió mi problema.
Sé que esto tiene un año, pero ninguna de las respuestas / consejos presentados me ayudó, así que pensé en agregar mi solución.
Primero, estaba experimentando el mismo problema. Es decir, realizó una compra de prueba, la canceló, aún recibió un estado de compra que indica una compra válida.
Lo que olvidé fue que recientemente cambié el campo "Respuesta de prueba de licencia" en el panel de configuración de la Consola para programadores de Google Play de "RESPOND_NORMALLY" a "LICENCIADO"
Después de volver 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 durante días
Ya está bien respondida en los documentos oficiales de Google. Copiando las palabras aquí.
Cuando el usuario cancela una suscripción, Google Play no ofrece un reembolso por el ciclo de facturación actual. En cambio, le permite al usuario tener acceso a la suscripción cancelada hasta el final del ciclo de facturación actual, momento en el que finaliza la suscripción. Por ejemplo, si un usuario compra una suscripción mensual y la cancela el día 15 del ciclo, Google Play la considerará válida hasta el final del día 30 (o el otro día, dependiendo del mes).
Eso debería explicarlo 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 es incorrecto, lo que sería una pena para el proyecto de referencia oficial en la facturación de la aplicación.
si compra == null solo significa que nunca se ha comprado. Para obtener la información real que tiene que llamar
purchase.getPurchaseState()
de acuerdo a here
purchaseState El estado de compra de la orden. Los valores posibles son 0 (comprado), 1 (cancelado), 2 (reembolsado) o 3 (vencido, solo para compras de suscripción).