page.title=Implementing In-app Billing
parent.title=In-app Billing
parent.link=index.html
page.tags="inapp, billing, iap"
@jd:body

<div id="qv-wrapper">
<div id="qv">
  <h2>In this document</h2>
  <ol>
    <li><a href="#billing-add-aidl">Adding the AIDL file</a></li>
    <li><a href="#billing-permission">Updating your manifest</a></li>
    <li><a href="#billing-service">Creating a ServiceConnection</a></li>
    <li><a href="#billing-requests">Making In-app Billing requests</a>
       <ol>
       <li><a href="#QueryDetails">Querying items available for purchase</a><li>
       <li><a href="#Purchase">Purchasing an item</a></li>
       <li><a href="#QueryPurchases">Querying purchased items</a></li>
       <li><a href="#Consume">Consuming a purchase</a></li>
       <li><a href="#Subs">Implementing subscriptions</a></li>
       </ol>
    </li>
    <li><a href="#billing-security">Securing your app</a>
  </ol>
  <h2>Reference</h2>
  <ol>
    <li><a href="{@docRoot}google/play/billing/billing_reference.html">In-app Billing
    Reference (V3)</a></li>
  </ol>
  <h2>Related Samples</h2>
  <ol>
    <li><a href="{@docRoot}training/in-app-billing/preparing-iab-app.html#GetSample">Sample Application (V3)</a></li>
  </ol>
  <h2>See also</h2>
  <ol>
    <li><a href="{@docRoot}training/in-app-billing/index.html">Selling In-app Products</a></li>
  </ol>
</div>
</div>

<p>
  In-app Billing on Google Play provides a straightforward, simple interface
  for sending In-app Billing requests and managing In-app Billing transactions
  using Google Play. The information below covers the basics of how to make
  calls from your application to the In-app Billing service using the In-app Billing Version 3
  API.
</p>

<p class="note">
  <strong>Note:</strong> To see a complete implementation and learn how to test
  your application, see the <a href=
  "{@docRoot}training/in-app-billing/index.html">Selling In-app Products</a>
  training class. The training class provides a complete sample In-app Billing
  application, including convenience classes to handle key tasks that are related to
  setting up your connection, sending billing requests, processing responses
  from Google Play, and managing background threading so that you can make
  In-app Billing calls from your main activity.
</p>

<p>
  Before you start, read the <a href=
  "{@docRoot}google/play/billing/billing_overview.html">In-app Billing
  Overview</a> to familiarize yourself with concepts that make it easier
  for you to implement In-app Billing.
</p>

<p>Complete these steps to implement In-app Billing in your application:</p>

<ol>
  <li>Add the In-app Billing library to your project.</li>
  <li>Update your {@code AndroidManifest.xml} file.</li>
  <li>Create a {@code ServiceConnection} and bind it to the
{@code IInAppBillingService}.</li>
  <li>Send In-app Billing requests from your application to
{@code IInAppBillingService}.</li>
  <li>Handle In-app Billing responses from Google Play.</li>
</ol>

<h2 id="billing-add-aidl">Adding the AIDL file to your project</h2>

<p>The {@code IInAppBillingService.aidl} is an Android Interface Definition
Language (AIDL) file that defines the interface to the In-app Billing Version
3 service. You can use this interface to make billing requests by invoking IPC
method calls.</p>

<p>Complete these steps to get the AIDL file:</p>
<ol>
<li>Open the <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK Manager</a>.</li>
<li>In the SDK Manager, expand the {@code Extras} section.</li>
<li>Select <strong>Google Play Billing Library</strong>.</li>
<li>Click <strong>Install packages</strong> to complete the download.</li>
</ol>
<p>The {@code IInAppBillingService.aidl} file will be installed to {@code &lt;sdk&gt;/extras/google/play_billing/}.</p>

<p>Complete these steps to add the AIDL to your project:</p>

<ol>
  <li>Download the Google Play Billing Library to your Android project:
      <ol type="a">
      <li>Select <strong>Tools > Android > SDK Manager</strong>.</li>
      <li>Under <strong>Appearance & Behavior > System Settings > Android SDK</strong>,
          select the <em>SDK Tools</em> tab to select and download <em>Google Play Billing
          Library</em>.</li></ol>

  <li>Copy the {@code IInAppBillingService.aidl} file to your project.
    <ul>
      <li>If you are using Android Studio, complete these steps to copy the file:
        <ol type="a">
          <li>Navigate to {@code src/main} in the Project tool window.</li>

          <li>Select <strong>File > New > Directory</strong>, enter {@code aidl} in the
          <em>New Directory</em> window, and select <strong>OK</strong>.

          <li>Select <strong>File > New > Package</strong>, enter
          {@code com.android.vending.billing} in the <em>New Package</em> window, and select
          <strong>OK</strong>.</li>

          <li>Using your operating system file explorer, navigate to
          {@code &lt;sdk&gt;/extras/google/play_billing/}, copy the
          {@code IInAppBillingService.aidl} file, and paste it into the
          {@code com.android.vending.billing} package in your project.
          </li>
        </ol>
      </li>

      <li>If you are developing in a non-Android Studio environment, create the
      following directory: {@code /src/com/android/vending/billing}. Copy the
      {@code IInAppBillingService.aidl} file into this directory. Place the AIDL
      file in your project and use the Gradle tool to build your project so that
      the <code>IInAppBillingService.java</code> file is generated.
      </li>
    </ul>
  </li>

  <li>Build your application. You should see a generated file named {@code
  IInAppBillingService.java} in the {@code /gen} directory of your project.
  </li>
</ol>

<h2 id="billing-permission">Updating your app's manifest</h2>

<p>
  In-app billing relies on the Google Play application, which handles all
  of the communication between your application and the Google Play server. To use the
  Google Play application, your application must request the proper permission.
  You can do this by adding the {@code com.android.vending.BILLING} permission
  to your AndroidManifest.xml file. If your application does not declare the
  In-app Billing permission, but attempts to send billing requests, Google Play
  refuses the requests and responds with an error.
</p>

<p>
  To give your app the necessary permission, add this line in the {@code
  AndroidManifest.xml} file:
</p>

<pre>
&lt;uses-permission android:name="com.android.vending.BILLING" /&gt;
</pre>

<h2 id="billing-service">Creating a ServiceConnection</h2>

<p>
  Your application must have a {@link android.content.ServiceConnection} to
  facilitate messaging between your application and Google Play. At a minimum,
  your application must do the following:
</p>

<ul>
  <li>Bind to {@code IInAppBillingService}.
  <li>Send billing requests (as IPC method calls) to the Google Play application.</li>
  <li>Handle the synchronous response messages that are returned with each billing request.</li>
</ul>

<h3>Binding to IInAppBillingService</h3>

<p>
  To establish a connection with the In-app Billing service on Google Play,
  implement a {@link android.content.ServiceConnection} to bind your activity
  to {@code IInAppBillingService}. Override the {@link
  android.content.ServiceConnection#onServiceDisconnected
  onServiceDisconnected} and {@link
  android.content.ServiceConnection#onServiceConnected onServiceConnected}
  methods to get a reference to the {@code IInAppBillingService} instance after
  a connection is established.
</p>

<pre>
IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection() {
   &#64;Override
   public void onServiceDisconnected(ComponentName name) {
       mService = null;
   }

   &#64;Override
   public void onServiceConnected(ComponentName name,
      IBinder service) {
       mService = IInAppBillingService.Stub.asInterface(service);
   }
};
</pre>

<p>
  In your activity’s {@link android.app.Activity#onCreate onCreate} method,
  perform the binding by calling the {@link android.content.Context#bindService
  bindService} method. Pass the method an {@link android.content.Intent} that
  references the In-app Billing service and an instance of the {@link
  android.content.ServiceConnection} that you created, and explicitly set the
  Intent's target package name to <code>com.android.vending</code>&mdash;the
  package name of Google Play app.
</p>

<p class="caution">
  <strong>Caution:</strong> To protect the security of billing transactions,
  always explicitly set the intent's target package name to
  <code>com.android.vending</code>, using {@link
  android.content.Intent#setPackage(java.lang.String) setPackage()}.
  Setting the package name explicitly ensures that
  <em>only</em> the Google Play app can handle billing requests from your app,
  preventing other apps from intercepting those requests.
</p>

<p>
  The following code sample demonstrates how to set the intent's target package
  to protect the security of transactions:
</p>

<pre>&#64;Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Intent serviceIntent =
      new Intent("com.android.vending.billing.InAppBillingService.BIND");
  serviceIntent.setPackage("com.android.vending");
  bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}
</pre>

<p class="caution"><strong>Caution</strong>: To ensure that your app is secure, always use an
explicit intent when starting a {@link android.app.Service} and do not declare intent filters for
your services. Using an implicit intent to start a service is a security hazard because you cannot
be certain of the service that will respond to the intent, and the user cannot see which service
starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you call
{@link android.content.Context#bindService bindService()} with an implicit intent.</p>

<p>
  You can now use the mService reference to communicate with the Google Play
  service.
</p>

<p class="note">
  <strong>Important:</strong> Remember to unbind from the In-app Billing
  service when you are done with your {@link android.app.Activity}. If you
  don’t unbind, the open service connection could cause your device’s
  performance to degrade.
</p>

<p>
  This example shows how to perform the unbind
  operation on a service connection to In-app Billing called {@code
  mServiceConn} by overriding the activity’s {@link
  android.app.Activity#onDestroy onDestroy} method:
</p>

<pre>
&#64;Override
public void onDestroy() {
    super.onDestroy();
    if (mService != null) {
        unbindService(mServiceConn);
    }
}
</pre>

<p>
  For a complete implementation of a service connection that binds to the
  {@code IInAppBillingService}, see the <a href=
  "{@docRoot}training/in-app-billing/preparing-iab-app.html">Selling In-app
  Products</a> training class and associated sample.
</p>
<h2 id="billing-requests">Making In-app Billing requests</h2>
<p>
  After your application is connected to Google Play, you can initiate purchase
  requests for in-app products. Google Play provides a checkout interface for
  users to enter their payment method, so your application doesn't need to
  handle payment transactions directly. When an item is purchased, Google Play
  recognizes that the user has ownership of that item and prevents the user
  from purchasing another item with the same product ID until it is consumed.
  You can control how the item is consumed in your application and notify
  Google Play to make the item available for purchase again. You can also query
  Google Play to quickly retrieve the list of purchases that the
  user made. This is useful, for example, when you want to restore the user's
  purchases when your user launches your app.
</p>

<h3 id="QueryDetails">Querying for items available for purchase</h3>

<p>
  In your application, you can query the item details from Google Play using
  the In-app Billing Version 3 API. To pass a request to the In-app Billing
  service, create a {@link android.os.Bundle} that contains a String
  {@link java.util.ArrayList} of product IDs with key "ITEM_ID_LIST", where
  each string is a product ID for an purchasable item. Here is an example:
</p>

<pre>
ArrayList&lt;String&gt; skuList = new ArrayList&lt;String&gt; ();
skuList.add("premiumUpgrade");
skuList.add("gas");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList(“ITEM_ID_LIST”, skuList);
</pre>

<p>
  To retrieve this information from Google Play, call the {@code getSkuDetails}
  method on the In-app Billing Version 3 API and pass the In-app
  Billing API version (“3”), the package name of your calling app, the purchase
  type (“inapp”), and the {@link android.os.Bundle} that you created, into the method:
</p>

<pre>
Bundle skuDetails = mService.getSkuDetails(3,
   getPackageName(), "inapp", querySkus);
</pre>

<p>
  If the request is successful, the returned {@link android.os.Bundle} has a
  response code of {@code BILLING_RESPONSE_RESULT_OK} (0).
</p>

<p class="note">
  <strong>Warning:</strong> Don't call the {@code getSkuDetails} method on the
  main thread. Calling this method triggers a network request that could block
  your main thread. Instead, create a separate thread and call the {@code
  getSkuDetails} method from inside of that thread.
</p>

<p>
  To view all of the possible response codes from Google Play, see <a href=
  "{@docRoot}google/play/billing/billing_reference.html#billing-codes">In-app
  Billing Reference</a>.
</p>

<p>
  The query results are stored in a String ArrayList with key {@code
  DETAILS_LIST}. The purchase information is stored within the String in JSON
  format. To view the types of product detail information that are returned, see
  <a href=
  "{@docRoot}google/play/billing/billing_reference.html#getSkuDetails">In-app
  Billing Reference</a>.
</p>

<p>
  In this example shows how to retrieve the prices for your in-app items from the
  skuDetails {@link android.os.Bundle} that is returned from the previous code snippet:
</p>

<pre>
int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
   ArrayList&lt;String&gt; responseList
      = skuDetails.getStringArrayList("DETAILS_LIST");

   for (String thisResponse : responseList) {
      JSONObject object = new JSONObject(thisResponse);
      String sku = object.getString("productId");
      String price = object.getString("price");
      if (sku.equals("premiumUpgrade")) mPremiumUpgradePrice = price;
      else if (sku.equals("gas")) mGasPrice = price;
   }
}
</pre>

<h3 id="Purchase">Purchasing an item</h3>
<p>
  To start a purchase request from your app, call the {@code getBuyIntent}
  method on the In-app Billing service. Pass the In-app
  Billing API version (“3”), the package name of your calling app, the product
  ID for the item to purchase, the purchase type (“inapp” or "subs"), and a
  {@code developerPayload} String into the method. The {@code developerPayload} String is used
  to specify any additional arguments that you want Google Play to send back
  along with the purchase information. Here is an example:
</p>

<pre>
Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
   sku, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
</pre>

<p>
  If the request is successful, the returned {@link android.os.Bundle} has a
  response code of {@code BILLING_RESPONSE_RESULT_OK} (0) and a {@link
  android.app.PendingIntent} that you can use to start the purchase flow. To
  view all of the possible response codes from Google Play, see <a href=
  "{@docRoot}google/play/billing/billing_reference.html#billing-codes">In-app
  Billing Reference</a>.

<p>
  The next step is to extract a {@link android.app.PendingIntent} from
  the response {@link android.os.Bundle} with key {@code BUY_INTENT}, as shown here:
</p>

<pre>
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
</pre>

<p>
  To complete the purchase transaction, call the {@link
  android.app.Activity#startIntentSenderForResult startIntentSenderForResult}
  method and use the {@link android.app.PendingIntent} that you created. This
  example uses an arbitrary value of 1001 for the request code:
</p>

<pre>
startIntentSenderForResult(pendingIntent.getIntentSender(),
   1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
   Integer.valueOf(0));
</pre>

<p>
  Google Play sends a response to your {@link android.app.PendingIntent} to the
  {@link android.app.Activity#onActivityResult onActivityResult} method of your
  application. The {@link android.app.Activity#onActivityResult
  onActivityResult} method has a result code of {@code
  Activity.RESULT_OK} (1) or {@code Activity.RESULT_CANCELED} (0). To view the
  types of order information that are returned in the response {@link
  android.content.Intent}, see <a href=
  "{@docRoot}google/play/billing/billing_reference.html#getBuyIntent">In-app
  Billing Reference</a>.
</p>

<p>
  The purchase data for the order is a String in JSON format that is mapped to
  the {@code INAPP_PURCHASE_DATA} key in the response {@link
  android.content.Intent}. Here is an example:
</p>

<pre>
'{
   "orderId":"GPA.1234-5678-9012-34567",
   "packageName":"com.example.app",
   "productId":"exampleSku",
   "purchaseTime":1345678900000,
   "purchaseState":0,
   "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
   "purchaseToken":<em>"opaque-token-up-to-1000-characters"</em>
 }'
</pre>

<p class="note">
  <strong>Note:</strong> Google Play generates a token for the purchase. This
  token is an opaque character sequence that may be up to 1,000 characters
  long. Pass this entire token to other methods, such as when you consume the
  purchase, as described in <a href=
  "{@docRoot}training/in-app-billing/purchase-iab-products.html#Consume">Consume
  a Purchase</a>. Don't abbreviate or truncate this token; you must save and
  return the entire token.
</p>

<p>
  Continuing from the previous example, you receive the response code, purchase
  data, and signature from the response {@link android.content.Intent}:
</p>

<pre>
&#64;Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == 1001) {
      int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
      String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
      String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");

      if (resultCode == RESULT_OK) {
         try {
            JSONObject jo = new JSONObject(purchaseData);
            String sku = jo.getString("productId");
            alert("You have bought the " + sku + ". Excellent choice,
               adventurer!");
          }
          catch (JSONException e) {
             alert("Failed to parse purchase data.");
             e.printStackTrace();
          }
      }
   }
}
</pre>

<p class="note">
  <strong>Security Recommendation:</strong> When you send a purchase request,
  create a String token that uniquely identifies this purchase request and
  include this token in the {@code developerPayload}. You can use a randomly-generated
  string as the token. When you receive the purchase response from
  Google Play, ensure that you check the returned data signature, the {@code
  orderId}, and the {@code developerPayload} String. For added security, you
  should perform the checking on your own secure server. Verify
  that the {@code orderId} is a unique value that you have not previously
  processed and that the {@code developerPayload} String matches the token that you
  sent previously with the purchase request.
</p>

<h3 id="QueryPurchases">Querying for purchased items</h3>

<p>
  To retrieve information about purchases that are made by a user from your app, call
  the {@code getPurchases} method on the In-app Billing Version 3 service. Pass
  the In-app Billing API version (“3”), the package name of
  your calling app, and the purchase type (“inapp” or "subs") into the method. Here is an example:
</p>

<pre>
Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);
</pre>

<p>
  The Google Play service returns only the purchases made by the user account
  that is currently logged in to the device. If the request is successful, the
  returned {@link android.os.Bundle} has a response code of 0. The response
  {@link android.os.Bundle} also contains a list of the product IDs, a list of
  the order details for each purchase, and the signatures for each purchase.
</p>

<p>
  To improve performance, the In-app Billing service returns only up to 700
  products that are owned by the user when {@code getPurchase} is first called.
  If the user owns a large number of products, Google Play includes a String
  token that is mapped to the key {@code INAPP_CONTINUATION_TOKEN} in the response
  {@link android.os.Bundle} to indicate that more products can be retrieved.
  Your application can then make a subsequent {@code getPurchases} call and
  pass in this token as an argument. Google Play continues to return a
  continuation token in the response {@link android.os.Bundle} until all
  of the products that are owned by the user are sent to your app.
</p>

<p>For more information about the data that is returned by {@code getPurchases}, see
  <a href="{@docRoot}google/play/billing/billing_reference.html#getPurchases">
  In-app Billing Reference</a>. The following example shows how you can
  retrieve this data from the response:
</p>

<pre>
int response = ownedItems.getInt("RESPONSE_CODE");
if (response == 0) {
   ArrayList&lt;String&gt; ownedSkus =
      ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
   ArrayList&lt;String&gt;  purchaseDataList =
      ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
   ArrayList&lt;String&gt;  signatureList =
      ownedItems.getStringArrayList("INAPP_DATA_SIGNATURE_LIST");
   String continuationToken =
      ownedItems.getString("INAPP_CONTINUATION_TOKEN");

   for (int i = 0; i &lt; purchaseDataList.size(); ++i) {
      String purchaseData = purchaseDataList.get(i);
      String signature = signatureList.get(i);
      String sku = ownedSkus.get(i);

      // do something with this purchase information
      // e.g. display the updated list of products owned by user
   }

   // if continuationToken != null, call getPurchases again
   // and pass in the token to retrieve more items
}
</pre>


<h3 id="Consume">Consuming a purchase</h3>

<p>
  You can use the In-app Billing Version 3 API to track the ownership of
  purchased in-app products in Google Play. Once an in-app product is
  purchased, it is considered to be <em>owned</em> and cannot be purchased from Google
  Play. You must send a consumption request for the in-app product before
  Google Play makes it available for purchase again.
</p>

<p class="note">
  <strong>Important</strong>: Managed in-app products are consumable, but
  subscriptions are not.
</p>

<p>
  The way that you use the consumption mechanism in your app is up to you. Typically,
  you implement consumption for in-app products with temporary benefits
  that users may want to purchase multiple times (for example, in-game currency
  or equipment). You typically don't want to implement consumption for
  in-app products that are purchased once and provide a permanent effect (for
  example, a premium upgrade).
</p>

<p>
  To record a purchase consumption, send the {@code consumePurchase} method to
  the In-app Billing service and pass in the {@code purchaseToken} String value
  that identifies the purchase to be removed. The {@code purchaseToken} is part
  of the data that is returned in the {@code INAPP_PURCHASE_DATA} String by the Google
  Play service following a successful purchase request. This example
  records the consumption of a product that is identified with the {@code
  purchaseToken} in the {@code token} variable:
</p>

<pre>
int response = mService.consumePurchase(3, getPackageName(), token);
</pre>

<p class="caution">
  <strong>Warning:</strong> Don't call the {@code consumePurchase} method on
  the main thread. Calling this method triggers a network request that could
  block your main thread. Instead, create a separate thread and call the {@code
  consumePurchase} method from inside of that thread.
</p>

<p>
  It's your responsibility to control and track how the in-app product is
  provisioned to the user. For example, if the user purchased in-game currency,
  you should update the player's inventory with the amount of currency
  purchased.
</p>

<p class="caution">
  <strong>Security Recommendation:</strong> Send a consumption request
  before provisioning the benefit of the consumable in-app purchase to the
  user. Ensure that you receive a successful consumption response from
  Google Play before you provision the item.
</p>

<h3 id="Subs">Implementing subscriptions</h3>

<p>Launching a purchase flow for a subscription is similar to launching the
purchase flow for a product, with the exception that the product type must be set
to "subs". The purchase result is delivered to your Activity's
{@link android.app.Activity#onActivityResult onActivityResult} method, exactly
as in the case of in-app products. Here is an example:</p>

<pre>
Bundle bundle = mService.getBuyIntent(3, "com.example.myapp",
   MY_SKU, "subs", developerPayload);

PendingIntent pendingIntent = bundle.getParcelable(RESPONSE_BUY_INTENT);
if (bundle.getInt(RESPONSE_CODE) == BILLING_RESPONSE_RESULT_OK) {
   // Start purchase flow (this brings up the Google Play UI).
   // Result will be delivered through onActivityResult().
   startIntentSenderForResult(pendingIntent, RC_BUY, new Intent(),
       Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
}
</pre>

<p>To query for active subscriptions, use the {@code getPurchases} method, again
with the product type parameter set to "subs":</p>

<pre>
Bundle activeSubs = mService.getPurchases(3, "com.example.myapp",
                   "subs", continueToken);
</pre>

<p>The call returns a {@code Bundle} with all of the active subscriptions that are owned by
the user. When a subscription expires without renewal, it no longer appears
in the returned {@code Bundle}.</p>

<h2 id="billing-security">Securing your application</h2>

<p>To help ensure the integrity of the transaction information that is sent to
your application, Google Play signs the JSON string that contains the response
data for a purchase order. Google Play uses the private key that is associated
with your application in the Developer Console to create this signature. The
Developer Console generates an RSA key pair for each application.<p>

<p class="note"><strong>Note:</strong> To find the public key portion of this key
pair, open your application's details in the Developer Console, click
<strong>Services &amp; APIs</strong>, and review the field titled
<strong>Your License Key for This Application</strong>.</p>

<p>The Base64-encoded RSA public key that is generated by Google Play is in binary
encoded, X.509 subjectPublicKeyInfo DER SEQUENCE format. It is the same public
key that is used with Google Play licensing.</p>

<p>When your application receives this signed response, you can
use the public key portion of your RSA key pair to verify the signature.
By performing signature verification, you can detect any responses that have
been tampered with or that have been spoofed. You can perform this signature
verification step in your application; however, if your application connects
to a secure remote server, Google recommends that you perform the signature
verification on that server.</p>

<p>For more information about best practices for security and design, see <a
href="{@docRoot}google/play/billing/billing_best_practices.html">Security and
Design</a>.</p>