Поиск…


Расходуемые покупки в приложениях

Расходуемые управляемые продукты - это продукты, которые можно купить несколько раз, например, в игровой валюте, играх, бонусах и т. Д.

В этом примере мы собираемся реализовать 4 разных управляемых продукта: "item1", "item2", "item3", "item4" .

Шаги в резюме:

  1. Добавьте библиотеку In-app Billing в свой проект (файл AIDL).
  2. Добавьте требуемое разрешение в файл AndroidManifest.xml .
  3. Разверните подписанный apk в Google Developers Console.
  4. Определите свои продукты.
  5. Внедрите код.
  6. Тестирование In-app Billing (необязательно).

Шаг 1:

Прежде всего, нам нужно будет добавить файл AIDL в ваш проект, как это четко описано в Документации Google здесь .

IInAppBillingService.aidl - это файл интерфейса определения интерфейса Android (AIDL), который определяет интерфейс к службе In-app Billing Version 3. Вы будете использовать этот интерфейс для выполнения запросов на выставление счетов путем вызова вызовов метода IPC.

Шаг 2:

После добавления файла AIDL добавьте разрешение BILLING в AndroidManifest.xml :

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

Шаг 3:

Создайте подписанный apk и загрузите его в Google Developers Console. Это необходимо для того, чтобы мы могли начать определять наши приложения в приложении.

Шаг 4:

Определите все ваши продукты с помощью другого идентификатора продукта и задайте цену для каждого из них. Существует 2 типа продуктов (управляемые продукты и подписки). Как мы уже говорили, мы собираемся реализовать 4 разных расходных управляемых продукта "item1", "item2", "item3", "item4" .

Шаг 5:

После выполнения всех вышеперечисленных шагов вы готовы начать внедрять сам код в свою собственную деятельность.

Основная деятельность:

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();
        }
    }
}

Шаг 6:

После внедрения кода вы можете протестировать его, развернув apk на бета-альфа-канал и разрешите другим пользователям тестировать код для вас. Тем не менее, реальные покупки в приложении не могут быть выполнены в режиме тестирования. Сначала вы должны опубликовать свое приложение / игру в Play Store, чтобы все продукты были полностью активированы.

Более подробную информацию о тестировании биллинга In-app можно найти здесь .

(Сторонняя) библиотека In-App v3

Шаг 1: Прежде всего, выполните следующие два действия, чтобы добавить функциональность приложения:

1. Добавьте библиотеку, используя:

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

2. Добавьте разрешение в файл манифеста.

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

Шаг 2. Инициализация вашего платежного процессора:

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

и реализовать Обработчик биллинга: BillingProcessor.IBillingHandler, который содержит 4 метода: a. onBillingInitialized (); б. onProductPurchased (String productId, TransactionDetails details): Здесь вам нужно обрабатывать действия, которые необходимо выполнить после успешной покупки c. onBillingError (int errorCode, Throwable error): обрабатывать любую ошибку, возникшую во время процесса покупки. d. onPurchaseHistoryRestored (): для восстановления при покупке приложений

Шаг 3: Как купить продукт.

Чтобы приобрести управляемый продукт:

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

И купить подписку:

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

Шаг 4: Использование продукта.

Чтобы потреблять продукт, просто вызовите метод consumePurchase.

bp.consumePurchase («ИДЕНТИФИКАТОР ПРОДУКТА ИЗ GOOGLE PLAY CONSOLE ЗДЕСЬ»);

Для других методов, связанных с приложением, посетите github



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow