Home » Android » Android Core » How to Integrate In App Purchase Billing in Android

About Manish Srivastava

Manish Srivastava
I have been a mobile software consultant + developer(Java, J2ME, Android) for over 2 years. I have done enterprise level development for large and small companies alike. Around 2010,I started doing Development for my customers.I always build clean, mobile friendly, semantic applicattion for every customer. For my clients, I get 100% involved, dedicated to making sure they get the best performance from the appliaction. I strive for long term results. I truly enjoy Mobile Development, and am very passionate about it. This enables me to do the best job for my clients.

How to Integrate In App Purchase Billing in Android

Hello Friends! Today I am going to share very useful blog for In App Purchase in Android. Google provide In App Billing faculty in Android. In App Purchase is a very easy and secure way for make payment online. Please follow my blog step by step:

Screen Shot

  1. Create a new Project in Android.
  2. Create MainActivity.java class.
  3. Add activity_main.xml in your res/layout folder.
  4. Add Billing services and permission in Manifest.xml.

Do’s

  1. Create sign apk for your application.
  2. Upload your apk on Google play store.
  3. Create product for your application.
  4. wait for 6-12 hour for update item’s on store.
  5. Copy Key of your Google account and paste it into BillingSecurity.java class Line number 135-
    String base64EncodedPublicKey = "PUT YOUR PUBLIC KEY HERE";
  6. Give Billing permissions in Manifest.xml
  7. Add
    IMarketBillingService.java in com.android.vending.billing package.

Don’t

  1. Don’t use emulator for testing its does not support Billing Services.
  2. Don’t use unsigned apk for Billing services.
  3. Don’t share your key with any one.

My Code-

1)MainActivity.java

package com.manish.inapppurchase;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
 Button btn1, btn2, btn3;
 private Context mContext=this;
 private static final String TAG = "Android BillingService";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  btn1 = (Button) findViewById(R.id.button1);
  btn2 = (Button) findViewById(R.id.button2);
  btn3 = (Button) findViewById(R.id.button3);
  btn1.setOnClickListener(this);
  btn2.setOnClickListener(this);
  btn3.setOnClickListener(this);
  
   startService(new Intent(mContext, BillingService.class));
         BillingHelper.setCompletedHandler(mTransactionHandler);
 }
 public Handler mTransactionHandler = new Handler(){
  public void handleMessage(android.os.Message msg) {
   Log.i(TAG, "Transaction complete");
   Log.i(TAG, "Transaction status: "+BillingHelper.latestPurchase.purchaseState);
   Log.i(TAG, "Item purchased is: "+BillingHelper.latestPurchase.productId);
   
   if(BillingHelper.latestPurchase.isPurchased()){
    showItem();
   }
  };
 
};
 @Override
 public void onClick(View v) {
  if (v == btn1) {
   if(BillingHelper.isBillingSupported()){
    BillingHelper.requestPurchase(mContext, "android.test.purchased");
         } else {
          Log.i(TAG,"Can't purchase on this device");
          btn1.setEnabled(false); // XXX press button before service started will disable when it shouldnt
         }
   Toast.makeText(this, "Shirt Button", Toast.LENGTH_SHORT).show();
  }
  if (v == btn2) {
   if(BillingHelper.isBillingSupported()){
    BillingHelper.requestPurchase(mContext, "android.test.purchased");
         } else {
          Log.i(TAG,"Can't purchase on this device");
          btn2.setEnabled(false); // XXX press button before service started will disable when it shouldnt
         }
   Toast.makeText(this, "TShirt Button", Toast.LENGTH_SHORT).show();
  }
  if (v == btn3) {
   if(BillingHelper.isBillingSupported()){
    BillingHelper.requestPurchase(mContext, "android.test.purchased");
         } else {
          Log.i(TAG,"Can't purchase on this device");
          btn3.setEnabled(false); // XXX press button before service started will disable when it shouldnt
         }
   Toast.makeText(this, "Denim Button", Toast.LENGTH_SHORT).show();
  }

 }

 private void showItem() {
  //purchaseableItem.setVisibility(View.VISIBLE);
 }

 @Override
 protected void onPause() {
  Log.i(TAG, "onPause())");
  super.onPause();
 }
 
 @Override
 protected void onDestroy() {
  BillingHelper.stopService();
  super.onDestroy();
 }
}

2)activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0099CC"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="150dp"
        android:layout_height="35dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:background="#FFFFFF"
        android:text="Shirt for 5.4$" />

    <Button
        android:id="@+id/button2"
        android:layout_width="150dp"
        android:layout_height="35dp"
        android:layout_below="@+id/button1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:background="#FFFFFF"
        android:text="Tshirt for 7.4$" />

    <Button
        android:id="@+id/button3"
        android:layout_width="150dp"
        android:layout_height="35dp"
        android:layout_below="@+id/button2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:background="#FFFFFF"
        android:text="Denim for 10.7$" />

</RelativeLayout>


3)manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.manish.inapppurchase"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="16" />

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.manish.inapppurchase.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".BillingService" />

        <receiver android:name=".BillingReceiver" >
            <intent-filter>
                <action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
                <action android:name="com.android.vending.billing.RESPONSE_CODE" />
                <action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

4) Zip Code
 

Reference: How to Integrate In App Purchase Billing in Android from our JCG partner Manish Srivastava at the Android Hub 4 you blog.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you our best selling eBooks for FREE!

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

and many more ....

 

2 comments

  1. Hi Manish,
    As illustrated in this example “http://developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample”, it uses “IInAppBillingService.aidl” file for InApp transactions. But your project does not contain this file. So how exactly your transactions take place. Also please let me know, if in my project, I am making one java package to be of type purchasable, then how to consume it and how to enable it.
    Thanks
    Yunus

  2. hi Manish,
    i will use your source but how to know transaction is complete or not..?
    please give me detail overview regarding in-app purchase. i will want only selling
    virtual coins. than how to i will check transaction is done. please help me,if its possible than
    make me a demo source for me asa possible.

Leave a Reply

Your email address will not be published. Required fields are marked *

*


8 − = seven

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Want to take your Java Skills to the next level?
Grab our programming books for FREE!
  • Save time by leveraging our field-tested solutions to common problems.
  • The books cover a wide range of topics, from JPA and JUnit, to JMeter and Android.
  • Each book comes as a standalone guide (with source code provided), so that you use it as reference.
Last Step ...

Where should we send the free eBooks?

Good Work!
To download the books, please verify your email address by following the instructions found on the email we just sent you.