Compras en Android - Play Billing Library

imagen

¿Y cómo es que todavía no hay ningún artículo sobre Habré sobre esto? No importa, es necesario corregirlo.

Hay 2 formas de agregar compras en la aplicación a su aplicación de Android: antigua y nueva. Hasta 2017, todos usaban la biblioteca de anjlab, pero desde junio de 2017 la situación ha cambiado, Google lanzó su propia biblioteca para compras y suscripciones internas: Play Billing Library. Ahora este último se considera el estándar.

Play Billing Library es muy simple.

Conecta la dependencia.

implementation 'com.android.billingclient:billing:1.2' 

Agregar permiso en el manifiesto.

 <uses-permission android:name="com.android.vending.BILLING"/> 

Cree una instancia de BillingClient e inicie la conexión.

 private BillingClient mBillingClient; ... mBillingClient = BillingClient.newBuilder(this).setListener(new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       } } }).build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         } } @Override public void onBillingServiceDisconnected() { //    -    } }); 

Entramos en el método onPurchasesUpdated () cuando se realiza la compra, en el método onBillingSetupFinished () puede solicitar información sobre bienes y compras.

Solicitar información del producto. Poner querySkuDetails () en onBillingSetupFinished () .

 private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private String mSkuId = "sku_id_1"; ... @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   } } ... private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); List<String> skuList = new ArrayList<>(); skuList.add(mSkuId); skuDetailsParamsBuilder.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { if (responseCode == 0) { for (SkuDetails skuDetails : skuDetailsList) { mSkuDetailsMap.put(skuDetails.getSku(), skuDetails); } } } }); } 

En el código, puede notar el concepto de SKU, ¿qué es? SKU: de la Unidad de mantenimiento de existencias en inglés (identificador de artículo de producto).

Ahora en mSkuDetailsMap tenemos toda la información sobre los productos (nombre, descripción, precio) registrados en Play Console de esta aplicación (más sobre eso más adelante). Presta atención a esta línea skuList.add (mSkuId); , aquí agregamos la identificación del producto desde Play Console, enumere aquí todos los productos con los que desea interactuar. Tenemos un producto —sku_id_1.

Todo está listo para cumplir con la solicitud de compra. Pasamos la identificación del producto. Ejecute este método, por ejemplo, haciendo clic en el botón.

 public void launchBilling(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); mBillingClient.launchBillingFlow(this, billingFlowParams); } 

Ahora, al ejecutar este método, verá este cuadro de diálogo (aprox. Imágenes de Internet).

imagen

Ahora, si el usuario compra los bienes, deben proporcionarle. Agregue el método payComplete () y realice acciones que brinden acceso al producto comprado. Por ejemplo, si un usuario compró una desconexión de anuncios, realice este método para que el anuncio ya no aparezca.

 ... @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       payComplete(); } } ... 

Todo está bien, pero si el usuario reinicia la aplicación, nuestro programa no sabe nada sobre compras. Es necesario solicitar información sobre ellos. Hazlo en onBillingSetupFinished () .

 @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   List<Purchase> purchasesList = queryPurchases(); //   //   ,    for (int i = 0; i < purchasesList.size(); i++) { String purchaseId = purchasesList.get(i).getSku(); if(TextUtils.equals(mSkuId, purchaseId)) { payComplete(); } } } } ... private List<Purchase> queryPurchases() { Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); return purchasesResult.getPurchasesList(); } 

En shoppingList obtiene una lista de todas las compras realizadas por el usuario.

Hacemos una comprobación: si se compran los bienes, ejecute payComplete () .

Listo Queda por publicar esta aplicación en Play Console y agregar productos. Cómo agregar un producto: Descripción de la página de la aplicación > Contenido en venta > Crear contenido limitado .

Nota 1 : No podrá agregar productos hasta que cargue la compilación de la aplicación en Play Console.

Nota 2 : para ver el cuadro de diálogo de compra, debe cargar la compilación en Play Console, agregar el producto y esperar un momento (~ 30 minutos - 1 hora - 3 horas) hasta que el producto se actualice, solo después de eso aparece un cuadro de diálogo y puede Hará una compra.

Nota 3 : corrija el error de parámetros de entrada. El SKU no puede ser nulo : el producto en Play Console aún no se ha actualizado, espere.

Nota 4 : Puede encontrar el error Error "No se puede completar su transacción" , en los registros como código de respuesta 6, mientras realiza la prueba. Por qué razones me sucede esto no se sabe exactamente, pero según mis observaciones, esto sucede después de frecuentes manipulaciones con la compra y devolución de bienes. Para solucionar esto, vaya al menú de la tarjeta bancaria y transfiera su tarjeta. ¿Cómo evitar esto? Agregue su cuenta a Play Console como probador y compre solo desde una tarjeta de prueba.

Demo en github

Cómprame café

(Por cierto, el sistema de donets funciona en Habr por el botón debajo del artículo - moderador aprox.).

Source: https://habr.com/ru/post/444072/


All Articles