수색…


소모품 인앱 구매

소비 가능 관리 제품은 게임 내 통화, 게임 라이프, 파워 업 등과 같이 여러 번 구입할 수있는 제품입니다.

이 예제에서 우리는 4 개의 다른 소모품 관리 제품 "item1", "item2", "item3", "item4" 를 구현하려고합니다.

요약 단계 :

  1. 인앱 결제 라이브러리를 프로젝트 (AIDL 파일)에 추가하십시오.
  2. AndroidManifest.xml 파일에 필요한 권한을 추가하십시오.
  3. Google 개발자 콘솔에 서명 된 apk를 배포합니다.
  4. 제품을 정의하십시오.
  5. 코드를 구현하십시오.
  6. 인앱 결제 테스트 (선택 사항)

1 단계:

먼저 AIDL 파일을 여기 Google 문서에 명확하게 설명 된대로 프로젝트에 추가해야합니다.

IInAppBillingService.aidl 은 인앱 결제 버전 3 서비스에 대한 인터페이스를 정의하는 Android 인터페이스 정의 언어 (AIDL) 파일입니다. 이 인터페이스를 사용하여 IPC 메소드 호출을 호출하여 대금 청구 요청을합니다.

2 단계:

AIDL 파일을 추가 한 후 AndroidManifest.xml 에 BILLING 권한을 추가하십시오.

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

3 단계 :

서명 된 apk를 생성하여 Google Developers Console에 업로드하십시오. 인앱 제품을 정의 할 수 있으려면이 과정이 필요합니다.

4 단계 :

다른 제품 ID로 모든 제품을 정의하고 가격을 각각으로 설정하십시오. 제품에는 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 스토어에 게시하여 모든 제품이 완전히 활성화되도록해야합니다.

인앱 결제 테스트에 대한 자세한 내용은 여기를 참조하십시오 .

(타사) 인앱 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);

Billing Handler : 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의 제품 ID');

앱 방문 github 와 관련된 다른 메소드



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow