vending tutorial studio purchases purchase pruebas prueba play interna inapp google compras app android in-app-billing

android - tutorial - play console prueba interna



Prueba de facturaciĆ³n en la aplicaciĆ³n: android.test.purchased already owned (16)

Agregue este código a un hilo para iniciar la solicitud de consumo.

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);

Aquí para la prueba de compra, comprar Token es

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

Y

if (response == 0)

entonces el consumo es exitoso.

Actualmente estoy probando la Facturación en la aplicación para una futura aplicación, y luego de que "compré" satisfactoriamente el ítem de prueba "android.test.purchased" la primera vez, ahora recibo el código de respuesta 7 cada vez que trato de volver a comprarlo, lo que significa que ya tengo este artículo.

12-15 23: 02: 14.149: E / IabHelper (19829): error de facturación en la aplicación: no se puede comprar el artículo, respuesta de error: 7: artículo ya propiedad

Por lo que entiendo, esta compra se supone que siempre será posible, ¿no? ¿Para que el desarrollador pueda probar su aplicación?

Si no, ¿cómo puedo "restablecer" su estado para que no sea propiedad? Estoy usando el paquete util de la Muestra de Facturación In-App de Google.


El problema principal es que debes consumir el elemento android.test.purchased . Pero este artículo no estará disponible en su inventario de consultas, por lo que no podrá consumir utilizando el flujo normal.

Por lo tanto, si está utilizando IabHelper, en la clase IabHelper , puede cambiar temporalmente el IInAppBillingService mService a público para que sea accesible desde su IabHelper.

Luego en tu clase, puedes consumir así,

int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");

Si tiene éxito, la respuesta será 0.

Espero que esto ayude.


En mi caso, parece que Google no registra una compra para el artículo. Por el contrario, la copia local de Google Play Services almacena en caché la compra. De esta forma, cuando se realiza una segunda solicitud en el mismo dispositivo, aparece android.test.purchased already owned . Sin embargo, usar otro dispositivo o reiniciar el dispositivo borra la caché y permite que se repita la compra.


En mi caso, solo necesitaba borrar la caché de aplicaciones. Después de borrar el caché, pude iniciar nuevamente el flujo de compra.

Desde mi dispositivo (4.4.2), navegué a "Configuración-> Administrador de aplicaciones". A continuación, seleccioné la aplicación de la pestaña "DESCARGADO" y luego "Borrar caché".


En mi opinión, si su programa no está diseñado para consumir el artículo, no es necesario que modifique el código para borrar la memoria de un proveedor externo. Esto hará que su código sea más frágil y tendrá que dedicar mucho tiempo a agregar y eliminar código que no pertenece a su software, por lo que es un mal diseño implementar una solución como esa.

La mejor solución que funcionó para mí para borrar android.test.purchased fue

adb uninstall com.yourapp.name

y entonces

adb shell pm clear com.android.vending

No necesité borrar dinero en efectivo y buscar la configuración de mis aplicaciones o cambiar el código para eso. Necesité agregar el adb a las variables de ruta del sistema de Windows, que fue bastante sencillo. Entonces sí, necesitas usar adb, que probablemente necesites de todos modos, así que ...

Simplemente agregue su C: / ... / android-sdk / platform-tools; en windows path en variables de entorno, y me imagino que es bastante simple en mac y linux os también. Espero que ayude a alguien a pasar unos días menos con la implementación de Android en facturación de aplicaciones.


Esta es la diferencia entre los artículos consumibles y no consumibles; los artículos no consumibles (con los que parece que se está tratando aquí) tienen su estado rastreado persistentemente, mientras que los artículos consumibles se pueden comprar varias veces. Deberá acceder a la consola de administración de Play y cancelar / reembolsar la venta para volver a probarla.


No es necesario escribir ningún código de consumo especial. Simplemente use el comando adb para borrar los datos de Google Play Store:

adb shell pm clear com.android.vending


Para fines de prueba, también sugiero que inserte un código que borre todos los productos que haya comprado antes de llamar a un método que inicialice el flujo de compra de gp. Eso es especialmente cómodo, cuando prueba solo un artículo en este momento. Por ejemplo:

PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) { if(sourcePurchase != null){ ConsumeResponseListener listener = new ConsumeResponseListener() { @Override public void onConsumeResponse(String outToken, @BillingResponse int responseCode) { System.out.println("all consumed"); } }; mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener); }else{ System.out.println("null"); } } // and then initiate whole process with clear "shoping basket" BillingFlowParams.Builder builder = new BillingFlowParams.Builder() .setSku(itemName).setType(BillingClient.SkuType.INAPP);


Resulta que el elemento android.test.purchased se comporta como una ID normal. Significa que si quieres poder volver a comprarlo, debes consumirlo en algún lugar de tu código. Creo que la documentación de Google es engañosa en este asunto, y que deberían agregar otra identificación estática que pueda comprar sin fin para fines de prueba.


Si estás en un entorno de prueba

1) En el caso de android.test.purchased, puedo restablecer el pago falso reiniciando el dispositivo Android (consumió el inventario).

2) En la utilidad InApp hay un archivo llamado Security.java que lo hace de la siguiente manera, para temporal. Dado que el pago de prueba (falso) siempre devuelve falso debido a la excepción de seguridad.

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { return true; }

Luego, en su OnIabPurchaseFinishedListener llame a fechInvForconsumeItem ()

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { // Handle error Log.e("123","Failure"); return; } else if (purchase.getSku().equals(ITEM_SKU)) { Log.e("123","PURCAsed"); fechInvForconsumeItem(); // Restart device if not consume } } };

El fechInvForconsumeItem () es

public void fechInvForconsumeItem() { mHelper.queryInventoryAsync(mReceivedInventoryListener); } IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { // Handle failure Log.e("11","Failure"); } else { Log.e("11","suc"); mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), mConsumeFinishedListener); } } };

Consume Listener is

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { } else { // handle error Log.e("11","sucConsume"); } } };


Versión en la aplicación 3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { ..................... if (inventory.hasPurchase(SKU_CONTENT)) { mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null); } } };


utilicé adb shell:

adb shell pm clear com.android.vending


vaya a la consola de Google Play y abra la pestaña Gestión de pedidos. Allí puede reembolsar / cancelar compras de prueba.


Así es como podemos consumir el artículo

consume.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Thread t = new Thread(new Runnable() { @Override public void run() { String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased"; try { Log.d("","Running"); int response = mService.consumePurchase(3, getPackageName(), purchaseToken); if(response==0) { Log.d("Consumed","Consumed"); }else { Log.d("","No"+response); } }catch (RemoteException e) { Log.d("Errorr",""+e); } } }); t.start(); } });


Versión 3 : Borrar el caché de Google Play Store permitirá que "android.test.purchased" esté disponible nuevamente.


IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { return; } try { if(inventory.hasPurchase("product_sku_id")) { isItemEnable= true; mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null); } else { isItemEnable = false; } } catch (Exception e) { e.printStackTrace(); } } };