Android Inappbilling Simple Usage
21-01-2019MainActivity
public class MainActivity extends AppCompatActivity implements IabBroadcastReceiver.IabBroadcastListener { private InAppBillingHelper inappbillingHelper; private static final int IN_APP_BILLING_REQUEST_CODE = 10001; private static final String SKU_TEST = "android.test.purchased"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initInappBillingHelper(); btnClick.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { inappbillingHelper.launchPurchase(SKU_TEST); } }); } private void initInappBillingHelper() { inappbillingHelper= new InAppBillingHelper(this,IN_APP_BILLING_REQUEST_CODE, new InAppBillingHelperResponse() { @Override public void success(Purchase purchase) { appBillingSuccess(purchase); } @Override public void fail() { appBillingFail(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { MainActivity.super.onActivityResult(requestCode,resultCode,data); } }); } private void appBillingSuccess(Purchase purchase) { Toast.makeText(getApplicationContext(), "Satın alma başarılı", Toast.LENGTH_LONG).show(); } private void appBillingFail() { Toast.makeText(getApplicationContext(), "Satın alma başarısız", Toast.LENGTH_LONG).show(); } public void onResume() { super.onResume(); inAppBillingHelper.registerReceiver(); } @Override public void onPause() { super.onPause(); inAppBillingHelper.unregisterReceiver(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == IN_APP_BILLING_REQUEST_CODE) inappbillingHelper.onActivityResult(requestCode, resultCode, data); else super.onActivityResult(requestCode,resultCode,data); } @Override public void receivedBroadcast() { inappbillingHelper.receivedBroadcast(); } }
InAppBillingHelper
package com.dinibilgiyarismasiapp.Utils; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.dinibilgiyarismasiapp.MainActivity; import com.dinibilgiyarismasiapp.R; import com.dinibilgiyarismasiapp.inappbilling.IabBroadcastReceiver; import com.dinibilgiyarismasiapp.inappbilling.IabHelper; import com.dinibilgiyarismasiapp.inappbilling.IabResult; import com.dinibilgiyarismasiapp.inappbilling.Inventory; import com.dinibilgiyarismasiapp.inappbilling.Purchase; import java.util.Date; import java.util.UUID; public class InAppBillingHelper { private static final String TAG = "InAppBilling"; private static final String SKU_TEST = "android.test.purchased"; private IabBroadcastReceiver mBroadcastReceiver; private IabHelper mHelper; private AppCompatActivity appCompatActivity; private InAppBillingHelperResponse inappbillingHelperResponse; private int requestCode; public InAppBillingHelper(AppCompatActivity appCompatActivity, int requestCode, InAppBillingHelperResponse inappbillingHelperResponse) { this.appCompatActivity = appCompatActivity; this.inappbillingHelperResponse = inappbillingHelperResponse; this.requestCode=requestCode; initIabHelper(); } public void launchPurchase(String skuType) { try { mHelper.launchPurchaseFlow(this.appCompatActivity, skuType, this.requestCode, mPurchaseFinishedListener, UUID.randomUUID().toString()); } catch (Exception e) { complain(e.getMessage()); } } private IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper .OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase); // if we were disposed of in the meantime, quit. if (mHelper == null) return; if (result.isFailure()) { complain("Satın alma hatası: " + result); setWaitScreen(false); return; } if (!verifyDeveloperPayload(purchase)) { complain("Satın alma hatası. Authenticity verification failed."); setWaitScreen(false); return; } Log.d(TAG, "Purchase successful."); try { mHelper.consumeAsync(purchase, mConsumeFinishedListener); } catch (IabHelper.IabAsyncInProgressException e) { complain("Another async operation in progress."); setWaitScreen(false); } } }; private IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper .OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result); // if we were disposed of in the meantime, quit. if (mHelper == null) return; // We know this is the "gas" sku because it's the only one we consume, // so we don't check which sku was consumed. If you have more than one // sku, you probably should check... if (result.isSuccess()) { // successfully consumed, so we apply the effects of the item in our // game world's logic, which in our case means filling the gas tank a bit Log.d(TAG, "Consumption successful. Provisioning."); paymentSuccess(purchase); //mTank = mTank == TANK_MAX ? TANK_MAX : mTank + 1; // saveData(); // alert("You filled 1/4 tank. Your tank is now " + String.valueOf(mTank) + "/4 // full!"); } else { complain("Error while consuming: " + result); paymentFail(); } //updateUi(); setWaitScreen(false); Log.d(TAG, "End consumption flow."); } }; private void paymentSuccess(Purchase purchase) { this.inappbillingHelperResponse.success(purchase); alert("Payment success. " + purchase.getOrderId()); if (SKU_TEST.equals(purchase.getSku())) { SharedPreferencesUtil.writeLong(appCompatActivity, "REKLAM_KADIRMA_ZAMANI", new Date().getTime()); } } private void paymentFail() { alert("Payment fail"); this.inappbillingHelperResponse.fail(); } private void initIabHelper() { mHelper = new IabHelper(appCompatActivity, this.appCompatActivity.getString(R.string.api_key)); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { Log.d(TAG, "Setup finished."); if (!result.isSuccess()) { // Oh noes, there was a problem. complain("Problem setting up in-app billing: " + result); return; } // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // IAB is fully set up. Now, let's get an inventory of stuff we own. Log.d(TAG, "Setup successful. Querying inventory."); try { mHelper.queryInventoryAsync(mGotInventoryListener); } catch (IabHelper.IabAsyncInProgressException e) { complain("Error querying inventory. Another async operation in progress."); } } }); } private IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper .QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { Log.d(TAG, "Query inventory finished."); // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // Is it a failure? if (result.isFailure()) { complain("Failed to query inventory: " + result); return; //todo comment out return } Log.d(TAG, "Query inventory was successful."); /* * Check for items we own. Notice that for each purchase, we check * the developer payload to see if it's correct! See * verifyDeveloperPayload(). */ // Do we have the premium upgrade? Purchase testPurchase = inventory.getPurchase(SKU_TEST); boolean isTest = (testPurchase != null && verifyDeveloperPayload(testPurchase)); // Check for gas delivery -- if we own gas, we should fill up the tank immediately if (isTest) { Log.d(TAG, "We have gas. Consuming it."); try { mHelper.consumeAsync(inventory.getPurchase(SKU_TEST), mConsumeFinishedListener); } catch (IabHelper.IabAsyncInProgressException e) { complain("Error consuming gas. Another async operation in progress."); } return; } setWaitScreen(false); Log.d(TAG, "Initial inventory query finished; enabling main UI."); } }; boolean verifyDeveloperPayload(Purchase p) { String payload = p.getDeveloperPayload(); /* * TODO: verify that the developer payload of the purchase is correct. It will be * the same one that you sent when initiating the purchase. * * WARNING: Locally generating a random string when starting a purchase and * verifying it here might seem like a good approach, but this will fail in the * case where the user purchases an item on one device and then uses your app on * a different device, because on the other device you will not have access to the * random string you originally generated. * * So a good developer payload has these characteristics: * * 1. If two different users purchase an item, the payload is different between them, * so that one user's purchase can't be replayed to another user. * * 2. The payload must be such that you can verify it even when the app wasn't the * one who initiated the purchase flow (so that items purchased by the user on * one device work on other devices owned by the user). * * Using your own server to store and verify developer payloads across app * installations is recommended. */ return true; } void setWaitScreen(boolean set) { // findViewById(R.id.screen_main).setVisibility(set ? View.GONE : View.VISIBLE); //findViewById(R.id.screen_wait).setVisibility(set ? View.VISIBLE : View.GONE); } void complain(String message) { Log.e(TAG, "**** TrivialDrive Error: " + message); alert("Error: " + message); } void alert(String message) { AlertDialog.Builder bld = new AlertDialog.Builder(appCompatActivity); bld.setMessage(message); bld.setNeutralButton("Tamam", null); Log.d(TAG, "Showing alert dialog: " + message); bld.create().show(); } public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data); if (mHelper == null) return; // Pass on the activity result to the helper for handling if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { // not handled, so handle it ourselves (here's where you'd // perform any handling of activity results not related to in-app // billing... inappbillingHelperResponse.onActivityResult(requestCode, resultCode, data); } else { Log.d(TAG, "onActivityResult handled by IABUtil."); } } public void receivedBroadcast() { Log.d(TAG, "Received broadcast notification. Querying inventory."); try { mHelper.queryInventoryAsync(mGotInventoryListener); } catch (IabHelper.IabAsyncInProgressException e) { complain("Error querying inventory. Another async operation in progress."); } } public void registerReceiver(){ mBroadcastReceiver = new IabBroadcastReceiver((IabBroadcastReceiver.IabBroadcastListener) appCompatActivity); IntentFilter broadcastFilter = new IntentFilter(IabBroadcastReceiver.ACTION); appCompatActivity.registerReceiver(mBroadcastReceiver,broadcastFilter); } public void unregisterReceiver(){ appCompatActivity.unregisterReceiver(mBroadcastReceiver); } }
InAppBilllingHelperResponse
package com.dinibilgiyarismasiapp.Utils; import android.content.Intent; import com.dinibilgiyarismasiapp.inappbilling.Purchase; public interface InAppBillingHelperResponse { void success(Purchase purchase); void fail(); void onActivityResult(int requestCode, int resultCode, Intent data); }