Buscar..


Compras consumibles en la aplicación

Los productos administrados consumibles son productos que se pueden comprar varias veces, como la moneda del juego, la vida del juego, los power-ups, etc.

En este ejemplo, vamos a implementar 4 productos diferentes consumibles administrados "item1", "item2", "item3", "item4" .

Pasos en resumen:

  1. Agregue la biblioteca de facturación integrada en la aplicación a su proyecto (archivo AIDL).
  2. Agregue el permiso requerido en el archivo AndroidManifest.xml .
  3. Implementar un apk firmado a la consola de desarrolladores de Google.
  4. Define tus productos.
  5. Implementar el código.
  6. Prueba de facturación en la aplicación (opcional).

Paso 1:

En primer lugar, deberemos agregar el archivo AIDL a su proyecto como se explica claramente en la documentación de Google aquí .

IInAppBillingService.aidl es un archivo de Lenguaje de definición de interfaz de Android (AIDL) que define la interfaz para el servicio de versión 3 de facturación integrada en la aplicación. Utilizará esta interfaz para realizar solicitudes de facturación invocando llamadas a métodos de IPC.

Paso 2:

Después de agregar el archivo AIDL, agregue el permiso BILLING en AndroidManifest.xml :

<!-- Required permission for implementing In-app Billing -->
<uses-permission android:name="com.android.vending.BILLING" />

Paso 3:

Genere un apk firmado y cárguelo en la Consola de desarrolladores de Google. Esto es necesario para que podamos comenzar a definir nuestros productos en la aplicación allí.

Etapa 4:

Defina todos sus productos con diferentes ID de producto y establezca un precio para cada uno de ellos. Existen 2 tipos de productos (productos gestionados y suscripciones). Como ya dijimos, vamos a implementar 4 productos diferentes consumibles administrados "item1", "item2", "item3", "item4" .

Paso 5:

Después de realizar todos los pasos anteriores, ahora está listo para comenzar a implementar el código en su propia actividad.

Actividad principal:

public class MainActivity extends Activity {

    IInAppBillingService inAppBillingService;
    ServiceConnection serviceConnection;

    // productID for each item. You should define them in the Google Developers Console.
    final String item1 = "item1";
    final String item2 = "item2";
    final String item3 = "item3";
    final String item4 = "item4";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Instantiate the views according to your layout file.
        final Button buy1 = (Button) findViewById(R.id.buy1);
        final Button buy2 = (Button) findViewById(R.id.buy2);
        final Button buy3 = (Button) findViewById(R.id.buy3);
        final Button buy4 = (Button) findViewById(R.id.buy4);

        // setOnClickListener() for each button.
        // buyItem() here is the method that we will implement to launch the PurchaseFlow.
        buy1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                buyItem(item1);
            }
        });

        buy2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                buyItem(item2);
            }
        });

        buy3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                buyItem(item3);
            }
        });

        buy4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                buyItem(item4);
            }
        });

        // Attach the service connection.
        serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceDisconnected(ComponentName name) {
                inAppBillingService = null;
            }

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                inAppBillingService = IInAppBillingService.Stub.asInterface(service);
            }
        };

        // Bind the service.
        Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
        serviceIntent.setPackage("com.android.vending");
        bindService(serviceIntent, serviceConnection, BIND_AUTO_CREATE);

        // Get the price of each product, and set the price as text to
        // each button so that the user knows the price of each item.
        if (inAppBillingService != null) {
            // Attention: You need to create a new thread here because
            // getSkuDetails() triggers a network request, which can
            // cause lag to your app if it was called from the main thread.
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    ArrayList<String> skuList = new ArrayList<>();
                    skuList.add(item1);
                    skuList.add(item2);
                    skuList.add(item3);
                    skuList.add(item4);
                    Bundle querySkus = new Bundle();
                    querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

                    try {
                        Bundle skuDetails = inAppBillingService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
                        int response = skuDetails.getInt("RESPONSE_CODE");

                        if (response == 0) {
                            ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");

                            for (String thisResponse : responseList) {
                                JSONObject object = new JSONObject(thisResponse);
                                String sku = object.getString("productId");
                                String price = object.getString("price");

                                switch (sku) {
                                    case item1:
                                        buy1.setText(price);
                                        break;
                                    case item2:
                                        buy2.setText(price);
                                        break;
                                    case item3:
                                        buy3.setText(price);
                                        break;
                                    case item4:
                                        buy4.setText(price);
                                        break;
                                }
                            }
                        }
                    } catch (RemoteException | JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        }
    }

    // Launch the PurchaseFlow passing the productID of the item the user wants to buy as a parameter.
    private void buyItem(String productID) {
        if (inAppBillingService != null) {
            try {
                Bundle buyIntentBundle = inAppBillingService.getBuyIntent(3, getPackageName(), productID, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
                PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
                startIntentSenderForResult(pendingIntent.getIntentSender(), 1003, new Intent(), 0, 0, 0);
            } catch (RemoteException | IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        }
    }

    // Unbind the service in onDestroy(). If you don’t unbind, the open
    // service connection could cause your device’s performance to degrade.
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (inAppBillingService != null) {
            unbindService(serviceConnection);
        }
    }

    // Check here if the in-app purchase was successful or not. If it was successful,
    // then consume the product, and let the app make the required changes.
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1003 && resultCode == RESULT_OK) {

            final String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");

            // Attention: You need to create a new thread here because
            // consumePurchase() triggers a network request, which can
            // cause lag to your app if it was called from the main thread.
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        JSONObject jo = new JSONObject(purchaseData);
                        // Get the productID of the purchased item.
                        String sku = jo.getString("productId");
                        String productName = null;

                        // increaseCoins() here is a method used as an example in a game to
                        // increase the in-game currency if the purchase was successful.
                        // You should implement your own code here, and let the app apply
                        // the required changes after the purchase was successful.
                        switch (sku) {
                            case item1:
                                productName = "Item 1";
                                increaseCoins(2000);
                                break;
                            case item2:
                                productName = "Item 2";
                                increaseCoins(8000);
                                break;
                            case item3:
                                productName = "Item 3";
                                increaseCoins(18000);
                                break;
                            case item4:
                                productName = "Item 4";
                                increaseCoins(30000);
                                break;
                        }

                        // Consume the purchase so that the user is able to purchase the same product again.
                        inAppBillingService.consumePurchase(3, getPackageName(), jo.getString("purchaseToken"));
                        Toast.makeText(MainActivity.this, productName + " is successfully purchased. Excellent choice, master!", Toast.LENGTH_LONG).show();
                    } catch (JSONException | RemoteException e) {
                        Toast.makeText(MainActivity.this, "Failed to parse purchase data.", Toast.LENGTH_LONG).show();
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        }
    }
}

Paso 6:

Después de implementar el código, puede probarlo implementando su apk en el canal beta / alfa, y permitir que otros usuarios prueben el código por usted. Sin embargo, no se pueden realizar compras reales en la aplicación mientras se está en modo de prueba. Debes publicar tu aplicación / juego primero en Play Store para que todos los productos estén completamente activados.

Más información sobre las pruebas de facturación en la aplicación se puede encontrar aquí .

(Tercero) In-App v3 Library

Paso 1: En primer lugar, siga estos dos pasos para agregar la funcionalidad de la aplicación:

1. Agregue la biblioteca usando:

 repositories {
            mavenCentral()
        }
        dependencies {
           compile 'com.anjlab.android.iab.v3:library:1.0.+'
        }

2. Agregar permiso en el archivo de manifiesto.

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

Paso 2: Inicialice su procesador de facturación:

BillingProcessor bp = new BillingProcessor(this, "YOUR LICENSE KEY FROM GOOGLE PLAY CONSOLE HERE", this);

e implemente Billing Handler: BillingProcessor.IBillingHandler que contiene 4 métodos: a. onBillingInitialized (); segundo. onProductPurchased (String productId, detalles de TransactionDetails): aquí es donde debe manejar las acciones que se realizarán después de la compra exitosa c. onBillingError (int errorCode, Throwable error): maneja cualquier error ocurrido durante el proceso de compra d. onPurchaseHistoryRestored (): para restaurar en compras de aplicaciones

Paso 3: Cómo comprar un producto.

Para comprar un producto gestionado:

bp.purchase(YOUR_ACTIVITY, "YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");

Y para comprar una suscripción:

bp.subscribe(YOUR_ACTIVITY, "YOUR SUBSCRIPTION ID FROM GOOGLE PLAY CONSOLE HERE");

Paso 4: Consumir un producto.

Para consumir un producto simplemente llame al método consumPurchase.

bp.consumePurchase ("SU ID DE PRODUCTO DE LA CONSOLA DE GOOGLE PLAY AQUÍ");

Para otros métodos relacionados con la visita a la aplicación github



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow