Android integra la última versión de pago de Google Play (Google Pay)

Documentación de pago de Google Play: https://developer.android.com/google/play/billing/integrate

La biblioteca de pagos de Google Play se ha actualizado a 5.0. En comparación con la versión anterior, hay muchos cambios. ¡Grábalos ahora!

El proceso de acceso a Google Play sigue siendo el mismo que antes:

1. Vaya a la consola de Google para solicitar una cuenta de desarrollador https://play.google.com/console/  

2. Crea un proyecto y sube APK

3. Vaya al backend del proyecto de la consola de Google para comenzar a configurar productos: haga clic en Productos a la izquierda->Productos dentro de la aplicación (productos dentro de la aplicación) o Suscripción (productos por suscripción)

 4. Una vez creado el producto en el backend de Google Pay Console, el cliente y el backend pueden comenzar a integrarse:

  4.1: Agregue la dependencia de la Biblioteca de facturación de Google Play a la de su aplicación

dependencies {
    val billing_version = "5.0.0"

    implementation("com.android.billingclient:billing:$billing_version")
}

4.2: Inicializar el SDK de pago (es decir, inicializar BillingClient): BillingClient se utiliza con frecuencia durante el proceso de pago. Generalmente, solo se crea un BillingClient en un proyecto.

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .build();

Al inicializar, necesita uno: PurchasesUpdatedListener. PurchasesUpdatedListener es para escuchar las actualizaciones de todas las transacciones de compra en la aplicación. Este oyente es muy importante. Esta devolución de llamada se realizará cuando el usuario compre o se suscriba.

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

4.3 Después de inicializar el SDK, debe establecer una conexión con Google Play. Utilice el método startConnection(). startConnection se realiza de forma asincrónica. En este momento, se necesita un BillingClientStateListener para devolver el resultado de la conexión. Cuando se completa la conexión , la devolución de llamada onBillingSetupFinished() se ejecutará a través del billingResult.getResponseCode devuelto. () para determinar si el enlace real es exitoso. Este código tiene los siguientes valores. Este BillingClientStateListener también tiene una devolución de llamada para la conexión perdida de Google Play. En este momento, Necesitamos implementar la lógica de reintento, que consiste en llamar a la función startConnection() nuevamente.

    @Retention(RetentionPolicy.SOURCE)
    public @interface BillingResponseCode {
        int SERVICE_TIMEOUT = -3;
        int FEATURE_NOT_SUPPORTED = -2;
        int SERVICE_DISCONNECTED = -1;
        int OK = 0;
        int USER_CANCELED = 1;
        int SERVICE_UNAVAILABLE = 2;
        int BILLING_UNAVAILABLE = 3;
        int ITEM_UNAVAILABLE = 4;
        int DEVELOPER_ERROR = 5;
        int ERROR = 6;
        int ITEM_ALREADY_OWNED = 7;
        int ITEM_NOT_OWNED = 8;
    }
  public void startConnection() {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    // The BillingClient is ready. You can query purchases here.
                    queryProductDetailsParams();
                    queryOldOrder();
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
            }
        });
    }

 4.4 Obtener productos

      Cuando la devolución de llamada startConnection () es exitosa, podemos ir a Google Play para obtener productos específicos según ProductId. En este momento, generalmente vamos a nuestro propio servidor a través de API para obtener una ProductIdList y luego ir a Google Play para obtener detalles del producto basándose en el ID del producto devuelto por el fondo.

Consultar productos de compra dentro de la aplicación:

  List<String> skuList = new ArrayList<>();
        skuList.add("ProductId01");
        skuList.add("ProductId02");
        skuList.add("ProductId03");
        skuList.add("ProductId04");
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
        mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
            @Override
            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
                // Process the result.
                Log.i(TAG, "querySkuDetailsAsync 1 onSkuDetailsResponse billingResult.getResponseCode : " + billingResult.getResponseCode() + " skuDetailsList :" + skuDetailsList);
                mInAppSkuDetailsHashMap.clear();
                if (skuDetailsList != null && skuDetailsList.size() > 0) {
                    for (SkuDetails skuDetails : skuDetailsList) {
                        mInAppSkuDetailsHashMap.put(skuDetails.getSku(), skuDetails);
                    }
                }
            }
        });

Consultar productos suscritos:

 // The BillingClient is ready. You can query purchases here.
        List<String> subscribeSkuList = new ArrayList<>();
        subscribeSkuList.add("Subscribe01");
        subscribeSkuList.add("Subscribe01");
        subscribeSkuList.add("Subscribe01");
        SkuDetailsParams.Builder subscribeParams = SkuDetailsParams.newBuilder();
        subscribeParams.setSkusList(subscribeSkuList).setType(BillingClient.SkuType.SUBS);
        mBillingClient.querySkuDetailsAsync(subscribeParams.build(), new SkuDetailsResponseListener() {
            @Override
            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
                // Process the result.
                Log.i(TAG, "querySkuDetailsAsync 2 onSkuDetailsResponse billingResult.getResponseCode : " + billingResult.getResponseCode() + " skuDetailsList :" + skuDetailsList);
                mSubscribeSkuDetailsHashMap.clear();
                if (skuDetailsList != null && skuDetailsList.size() > 0) {
                    for (SkuDetails skuDetails : skuDetailsList) {
                        mSubscribeSkuDetailsHashMap.put(skuDetails.getSku(), skuDetails);
                    }
                }
            }
        });

Cuando la consulta del producto es exitosa, la lista de productos se puede mostrar al usuario en función de la información del producto devuelta por el servidor.

Nota : algunos dispositivos Android pueden tener instalada una versión anterior de la aplicación Google Play Store, que no admite ciertos tipos de productos, como las suscripciones. Antes de que su aplicación ingrese al proceso de pago, puede llamar  a isFeatureSupported()  para determinar si el dispositivo admite el artículo que desea vender. Para obtener una lista de los tipos de productos admitidos, consulte  BillingClient.FeatureType .

4.5 Iniciar el proceso de compra (iniciar compra)

   Cuando el usuario hace clic en un artículo para iniciar una solicitud de compra desde la aplicación, llame  al método launchBillingFlow()  desde el hilo principal de la aplicación. Este método acepta una referencia al  objeto BillingFlowParams  , que contiene el  objeto ProductDetails relacionado  obtenido  al llamar a queryProductDetailsAsync()  . Para crear   objetos, utilice  la  clase BillingFlowParams.Builder.BillingFlowParams

Comprar compras dentro de la aplicación:

    public void buyInAppProduct(SkuDetails skuDetails) {
        if (skuDetails == null) {
            return;
        }
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .build();
        mBillingClient.launchBillingFlow(ActivityUtils.getTopActivity(), billingFlowParams).getResponseCode();
    }

Para comprar una suscripción:

  public void buySubscribeProduct(SkuDetails skuDetails) {
        if (skuDetails == null) {
            return;
        }
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .build();
        mBillingClient.launchBillingFlow(ActivityUtils.getTopActivity(), billingFlowParams).getResponseCode();
    }
// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call ProductDetails.getSubscriptionOfferDetails()
            // for a list of offers that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

4.6 Devolución de llamada después de una compra exitosa

 Cuando inicializamos el SDK en 4.2, agregamos un PurchasesUpdatedListener. Cuando el usuario compra con éxito, Google Play llamará al  onPurchasesUpdated(),我们根据código de respuesta para distinguir si la compra del usuario se realizó correctamente o no.

Si el artículo se compra con éxito, el sistema también generará un token, que es un identificador único que representa al usuario y el ID del artículo en la aplicación que compró. El token se puede almacenar localmente y pasar a un servidor backend seguro (se recomienda este método)

    private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
        @Override
        public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
            if (billingResult == null) {
                return;
            }
            int responseCode = billingResult.getResponseCode();
            switch (responseCode) {
                case BillingClient.BillingResponseCode.OK:
                    for (Purchase purchase : purchases) {
                        SkuDetails skuDetails = null;
                        String json = purchase.getOriginalJson();
                        if (!TextUtils.isEmpty(json)) {
                            PurchaseData purchaseData = GsonConverter.fromJson(json, PurchaseData.class);
                            if (purchaseData != null) {
                                skuDetails = getSkuDetailsDependProductId(purchaseData.getProductId());
                            }
                        }
                        handlePurchase(purchase, (skuDetails != null && (BillingClient.SkuType.SUBS.equals(skuDetails.getType()))), "onPurchasesUpdated");
                    }
                    break;
                case BillingClient.BillingResponseCode.USER_CANCELED:
                    Log.i(TAG, "purchasesUpdatedListener 3 user cancel ");
                    break;
                default:
                    Log.i(TAG, "purchasesUpdatedListener 4 error  " + responseCode);
                    break;
            }
        }
    };
@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

4.7 Procesar transacciones de compra (órdenes de consumo)

Cuando el usuario realiza una compra exitosa, el pedido debe consumirse, si no se consume, Google automáticamente reembolsará el dinero y cancelará la transacción de compra después de tres días.
Artículos para compra dentro de la aplicación:

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    Purchase purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    ConsumeParams consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);
}

  Consumir artículos de suscripción: las suscripciones se tratan de manera similar a los artículos no consumibles.  Puedes confirmar las suscripciones usando BillingClient.acknowledgePurchase() en la biblioteca de facturación de Google Play  o Purchases.Subscriptions.Acknowledge  en la API para desarrolladores de Google Play  . Todas las transacciones de compra de suscripción inicial requieren confirmación. La renovación de la suscripción no requiere confirmación

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged()) {
            AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
        }
    }
}

4.8 Consultar órdenes históricas y consumir transacciones pendientes

    public void queryOldOrder() {
        mBillingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP, new PurchasesResponseListener() {
            @Override
            public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    onHandlerQueryPurchases(list, false);
                }
            }
        });

        mBillingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, new PurchasesResponseListener() {
            @Override
            public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    onHandlerQueryPurchases(list, true);
                }
            }
        });

4.9 Procesamiento de compras múltiples:

Google Play permite a los clientes comprar varios artículos idénticos dentro de la aplicación en una sola transacción especificando la cantidad de artículos en el carrito de compras (esta función es compatible con la biblioteca de facturación de Google Play en la versión 4.0 y superior). Las aplicaciones deben manejar múltiples compras y otorgar derechos según la cantidad de compra especificada. Nota : Las compras de varios artículos están disponibles para productos consumibles dentro de la aplicación, que son productos que se pueden comprar, consumir y recomprar. No habilite esta función para productos que no admiten compras repetidas.

Para habilitar compras de varios artículos, la lógica de configuración de la aplicación debe verificar la cantidad del artículo. Se puede acceder a los campos desde las siguientes API  quantity :

Una vez que haya agregado la lógica para manejar compras de varios artículos, deberá habilitar las compras de varios artículos para los productos en la página Administración de productos en la aplicación en Google Play Console.

Nota : asegúrese de que su aplicación acepte varias compras antes de habilitar esta función en Play Console. Es posible que deba forzar la actualización a una versión de la aplicación compatible antes de poder habilitar esta función para sus productos.

Supongo que te gusta

Origin blog.csdn.net/Jason_HD/article/details/126979555
Recomendado
Clasificación