Sök…


Förbrukningsbara köp i appen

Förbrukbara hanterade produkter är produkter som kan köpas flera gånger, till exempel valuta i spelet, spelliv, power-ups etc.

I det här exemplet kommer vi att implementera fyra olika förbrukade hanterade produkter "item1", "item2", "item3", "item4" .

Steg i sammanfattning:

  1. Lägg till faktureringsbiblioteket i appen till ditt projekt (AIDL-fil).
  2. Lägg till önskad behörighet i filen AndroidManifest.xml .
  3. Distribuera en signerad apk till Google Developers Console.
  4. Definiera dina produkter.
  5. Implementera koden.
  6. Testa fakturering i appen (valfritt).

Steg 1:

Först och främst måste vi lägga till AIDL-filen till ditt projekt som tydligt förklaras i Google Dokumentation här .

IInAppBillingService.aidl är en AIDL-fil (Android Interface Definition Language) som definierar gränssnittet till tjänsten In-app Billing Version 3. Du kommer att använda detta gränssnitt för att göra faktureringsbegäranden genom att anropa IPC-metodsamtal.

Steg 2:

När du har lagt till AIDL-filen lägger du till BILLING-behörighet i AndroidManifest.xml :

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

Steg 3:

Skapa en signerad apk och ladda upp den till Google Developers Console. Detta krävs så att vi kan börja definiera våra produkter i appen där.

Steg 4:

Definiera alla dina produkter med olika produkt-ID och ställ in ett pris till var och en av dem. Det finns två typer av produkter (Hanterade produkter och prenumerationer). Som vi redan har sagt kommer vi att implementera fyra olika förbrukningsvaror som hanteras "item1", "item2", "item3", "item4" .

Steg 5:

Efter att ha gjort alla stegen ovan är du nu redo att börja implementera själva koden i din egen aktivitet.

Huvudaktivitet:

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

Steg 6:

När du har implementerat koden kan du testa den genom att distribuera din apk till beta / alfakanal och låta andra användare testa koden åt dig. Verkliga köp i appen kan dock inte göras i testläge. Du måste publicera din app / spel först till Play Store så att alla produkter är fullt aktiverade.

Mer information om testning av fakturering i appen hittar du här .

(Tredje part) In-App v3 Library

Steg 1: Följ först dessa två steg för att lägga till appfunktionalitet:

1. Lägg till biblioteket med:

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

2. Lägg tillåtelse i manifestfil.

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

Steg 2: Starta din faktureringsprocessor:

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

och implementera Billing Handler: BillingProcessor.IBillingHandler som innehåller fyra metoder: a. onBillingInitialized (); b. onProductPurchased (String productId, TransactionDetails-detaljer): Det är här du måste hantera åtgärder som ska utföras efter framgångsrikt köp c. onBillingError (int errorCode, Throwable error): Hantera alla fel som uppstod under köpprocessen d. onPurchaseHistoryRestored (): För återställning i appköp

Steg 3: Hur man köper en produkt.

Så här köper du en hanterad produkt:

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

Och för att köpa ett prenumeration:

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

Steg 4: Konsumera en produkt.

För att konsumera en produkt, ring bara consumePurchase-metoden.

bp.consumePurchase ("DIN PRODUKT-ID FRÅN GOOGLE SPELKONSOL HÄR");

För andra metoder relaterade till i appen, besök github



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow