| page.title=In-app Billing API | |
| parent.title=In-app Billing | |
| parent.link=index.html | |
| page.tags="billing, inapp, iap" | |
| @jd:body | |
| <div id="qv-wrapper"> | |
| <div id="qv"> | |
| <h2>Topics</h2> | |
| <ol> | |
| <li><a href="#producttypes">Product Types</a> | |
| <ol> | |
| <li><a href="#managed">Managed In-app Products</a></li> | |
| <li><a href="#subs">Subscriptions</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#purchase">Purchasing Items</a></li> | |
| <li><a href="#consume">Consuming In-app Products</a> | |
| <ol> | |
| <li><a href="#consumetypes">Non-consumable and Consumable In-app Products</a></li> | |
| <li><a href="#managingconsumables">Managing Consumable Purchases</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#caching">Local Caching</a></li> | |
| </ol> | |
| <h2>Reference</h2> | |
| <ol> | |
| <li><a href="{@docRoot}google/play/billing/billing_reference.html">In-app Billing | |
| Reference (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> | |
| The In-app Billing Version 3 API makes it easier for you to integrate In-app | |
| Billing into your applications. The features in this version include improved | |
| synchronous purchase flow, APIs to let you easily track ownership of | |
| consumable goods, and local caching of in-app purchase data. | |
| </p> | |
| <h2 id="producttypes">Product Types</h2> | |
| <p> | |
| You define your products using the Google Play Developer Console, including | |
| product type, SKU, price, description, and so on. For more information, see | |
| <a href="{@docRoot}google/play/billing/billing_admin.html">Administering | |
| In-app Billing</a>. The Version 3 API supports managed in-app products and | |
| subscriptions. | |
| </p> | |
| <h3 id="managed">Managed In-app Products</h3> | |
| <p> | |
| Managed in-app products are items that have their ownership information | |
| tracked and managed by Google Play. When a user purchases a managed in-app | |
| item, Google Play stores the purchase information for each item on a per-user | |
| basis. This enables you to later query Google Play at any time to restore the | |
| state of the items a specific user has purchased. This information is | |
| persistent on the Google Play servers even if the user uninstalls the | |
| application or if they change devices. | |
| </p> | |
| <p> | |
| If you are using the Version 3 API, you can also consume managed items within | |
| your application. You would typically implement consumption for items that | |
| can be purchased multiple times (such as in-game currency, fuel, or magic | |
| spells). Once purchased, a managed item cannot be purchased again until you | |
| consume the item, by sending a consumption request to Google Play. To learn | |
| more about in-app product consumption, see <a href="#consume">Consuming | |
| Items</a>. | |
| </p> | |
| <h3 id="subs">Subscriptions</h3> | |
| <p> | |
| A subscription is a product type offered in In-app Billing that lets you sell | |
| content, services, or features to users from inside your app with recurring | |
| monthly or annual billing. You can sell subscriptions to almost any type of | |
| digital content, from any type of app or game. To understand how | |
| subscriptions work, see <a href= | |
| "{@docRoot}google/play/billing/billing_subscriptions.html">In-app Billing | |
| Subscriptions</a>. | |
| </p> | |
| <p> | |
| With the Version 3 API, you can use the same purchase flow for buying | |
| subscriptions and retrieving subscription purchase information as with in-app | |
| products. For a code example, see <a href= | |
| "{@docRoot}google/play/billing/billing_integrate.html#Subs">Implementing | |
| Subscriptions</a>. | |
| </p> | |
| <p class="caution"> | |
| <strong>Important</strong>: Unlike in-app products, subscriptions cannot be | |
| consumed. | |
| </p> | |
| <h2 id="purchase">Purchasing Items</h2> | |
| <div class="figure" style="width:430px"> | |
| <img src="{@docRoot}images/in-app-billing/v3/iab_v3_purchase_flow.png" id="figure1" height="530"/> | |
| <p class="img-caption"> | |
| <strong>Figure 1.</strong> The basic sequence for a purchase request. | |
| </p> | |
| </div> | |
| <p>A typical purchase flow with the Version 3 API is as follows:</p> | |
| <ol> | |
| <li>Your application sends a {@code isBillingSupported} request to Google | |
| Play to determine that the target version of the In-app Billing API that you | |
| are using is supported. | |
| </li> | |
| <li>When your application starts or user logs in, it's good practice to check | |
| with Google Play to determine what items are owned by the user. To query the | |
| user's in-app purchases, send a {@code getPurchases} request. If the request | |
| is successful, Google Play returns a {@code Bundle} containing a list of | |
| product IDs of the purchased items, a list of the individual purchase | |
| details, and a list of the signatures for the purchases. | |
| </li> | |
| <li>Usually, you'll want to inform the user of the products that are | |
| available for purchase. To query the details of the in-app products that you | |
| defined in Google Play, your application can send a {@code getSkuDetails} | |
| request. You must specify a list of product IDs in the query request. If the | |
| request is successful, Google Play returns a {@code Bundle} containing | |
| product details including the product’s price, title, description, and the | |
| purchase type. | |
| </li> | |
| <li>If an in-app product is not owned by the user, you can initiate a | |
| purchase for it. To start a purchase request, your application sends a {@code | |
| getBuyIntent} request, specifying the product ID of the item to purchase, | |
| along with other parameters. You should record the product ID when you create | |
| a new in-app product in the Developer Console. | |
| <ol type="a"> | |
| <li>Google Play returns a {@code Bundle} that contains a {@code | |
| PendingIntent} which your application uses to start the checkout UI for | |
| the purchase. | |
| </li> | |
| <li>Your application launches the pending intent by calling the {@code | |
| startIntentSenderForResult} method. | |
| </li> | |
| <li>When the checkout flow finishes (that is, the user successfully | |
| purchases the item or cancels the purchase), Google Play sends a response | |
| {@code Intent} to your {@code onActivityResult} method. The result code | |
| of the {@code onActivityResult} has a result code that indicates whether | |
| the purchase was successful or canceled. The response {@code Intent} | |
| contains information about the purchased item, including a {@code | |
| purchaseToken} String that is generated by Google Play to uniquely | |
| identify this purchase transaction. The {@code Intent} also contains the | |
| signature of the purchase, signed with your private developer key. | |
| </li> | |
| </ol> | |
| </li> | |
| </ol> | |
| <p> | |
| To learn more about the Version 3 API calls and server responses, see | |
| <a href="{@docRoot}google/play/billing/billing_reference.html">In-app Billing | |
| Reference</a>. | |
| </p> | |
| <h2 id="consume">Consuming In-app Products</h2> | |
| <p> | |
| You can use the consumption mechanism to track the user's ownership of in-app | |
| products. | |
| </p> | |
| <p> | |
| In Version 3, all in-app products are managed. This means that the user's | |
| ownership of all in-app item purchases is maintained by Google Play, and your | |
| application can query the user's purchase information when needed. When the | |
| user successfully purchases an in-app product, that purchase is recorded in | |
| Google Play. Once an in-app product is purchased, it is considered to be | |
| "owned". In-app products in the "owned" state cannot be purchased from Google | |
| Play. You must send a consumption request for the "owned" in-app product | |
| before Google Play makes it available for purchase again. Consuming the | |
| in-app product reverts it to the "unowned" state, and discards the previous | |
| purchase data. | |
| </p> | |
| <div class="figure" style="width:420px"> | |
| <img src="{@docRoot}images/in-app-billing/v3/iab_v3_consumption_flow.png" | |
| id="figure2" height="300"/> | |
| <p class="img-caption"> | |
| <strong>Figure 2.</strong> The basic sequence for a consumption request. | |
| </p> | |
| </div> | |
| <p> | |
| To retrieve the list of product's owned by the user, your application sends a | |
| {@code getPurchases} call to Google Play. Your application can make a | |
| consumption request by sending a {@code consumePurchase} call. In the request | |
| argument, you must specify the in-app product's unique {@code purchaseToken} | |
| String that you obtained from Google Play when it was purchased. Google Play | |
| returns a status code indicating if the consumption was recorded | |
| successfully. | |
| </p> | |
| <h3 id="consumetypes">Non-consumable and Consumable In-app Products</h3> | |
| <p> | |
| It's up to you to decide if you want to handle your in-app products as | |
| non-consumable or consumable items. | |
| </p> | |
| <dl> | |
| <dt> | |
| Non-consumable Items | |
| </dt> | |
| <dd> | |
| Typically, you would not implement consumption for in-app products that can | |
| only be purchased once in your application and provide a permanent benefit. | |
| Once purchased, these items will be permanently associated to the user's | |
| Google account. An example of a non-consumable in-app product is a premium | |
| upgrade or a level pack. | |
| </dd> | |
| <dt> | |
| Consumable items | |
| </dt> | |
| <dd> | |
| In contrast, you can implement consumption for items that can be made | |
| available for purchase multiple times. Typically, these items provide | |
| certain temporary effects. For example, the user's in-game character might | |
| gain life points or gain extra gold coins in their inventory. Dispensing | |
| the benefits or effects of the purchased item in your application is called | |
| <em>provisioning</em> the in-app product. You are responsible for | |
| controlling and tracking how in-app products are provisioned to the users. | |
| <p class="note"> | |
| <strong>Important:</strong> Before provisioning the consumable in-app | |
| product in your application, you must send a consumption request to | |
| Google Play and receive a successful response indicating that the | |
| consumption was recorded. | |
| </p> | |
| </dd> | |
| </dl> | |
| <h3 id="managingconsumables">Managing consumable purchases in your application</h3> | |
| <p>Here is the basic flow for purchasing a consumable in-app product:</p> | |
| <ol> | |
| <li>Launch a purchase flow with a {@code getBuyIntent} call | |
| </li> | |
| <li>Get a response {@code Bundle}from Google Play indicating if the purchase | |
| completed successfully. | |
| </li> | |
| <li>If the purchase was successful, consume the purchase by making a {@code | |
| consumePurchase} call. | |
| </li> | |
| <li>Get a response code from Google Play indicating if the consumption | |
| completed successfully. | |
| </li> | |
| <li>If the consumption was successful, provision the product in your | |
| application. | |
| </li> | |
| </ol> | |
| <p> | |
| Subsequently, when the user starts up or logs in to your application, you | |
| should check if the user owns any outstanding consumable in-app products; if | |
| so, make sure to consume and provision those items. Here's the recommended | |
| application startup flow if you implement consumable in-app products in your | |
| application: | |
| </p> | |
| <ol> | |
| <li>Send a {@code getPurchases} request to query the owned in-app products | |
| for the user. | |
| </li> | |
| <li>If there are any consumable in-app products, consume the items by calling | |
| {@code consumePurchase}. This step is necessary because the application might | |
| have completed the purchase order for the consumable item, but stopped or got | |
| disconnected before the application had the chance to send a consumption | |
| request. | |
| </li> | |
| <li>Get a response code from Google Play indicating if the consumption | |
| completed successfully. | |
| </li> | |
| <li>If the consumption was successful, provision the product in your | |
| application. | |
| </li> | |
| </ol> | |
| <h2 id="caching">Local Caching</h2> | |
| <p> | |
| Because the Google Play client now caches In-app Billing information locally | |
| on the device, you can use the Version 3 API to query for this information | |
| more frequently, for example through a {@code getPurchases} call. Unlike with | |
| previous versions of the API, many Version 3 API calls will be serviced | |
| through cache lookups instead of through a network connection to Google Play, | |
| which significantly speeds up the API's response time. | |
| </p> |