blob: a245cdd2daf2098b60875d364765a25e48364a5d [file] [log] [blame]
<h1>In-App Payments Service</h1>
<table class="intro">
<tr>
<td><strong>Description:</strong></td>
<td>Use the In-App Payments Service to sell digital and virtual goods within a Chrome app.</td>
</tr>
<tr>
<td><strong>Availability:</strong></td>
<td>Chrome 29</td>
</tr>
<tr>
<td><strong>Sample:</strong></td>
<td><a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/in-app-payments">in-app-payments</a></td>
</tr>
<tr>
<td><strong>Learn more:</strong></td>
<td>
<a href="https://support.google.com/chrome_webstore/answer/1053354">Google Wallet</a>; <br>
<a href="https://developers.google.com/commerce/wallet/digital/docs/">Google Wallet for Digital Goods</a></td>
</tr>
</table>
<h2 id="overview">Overview</h2>
<p>
You can use the In-App Payments Service to sell digital and virtual goods within your app.
The In-App Payments Service, which is embedded in Chrome, communicates with the
<a href="https://support.google.com/chrome_webstore/answer/1053354">Google Wallet</a>
servers and handles all the required checkout details, so your app does not have to process any financial transactions.
The In-App Payments Service requires you to package a JavaScript file,
<a href="https://raw.github.com/GoogleChrome/chrome-app-samples/master/in-app-payments/buy.js">buy.js</a>,
with your app to trigger the purchase flow.
</p>
<h2 id="flow">Purchase flow</h2>
<p>
When a customer clicks a "Buy" button in your app to make a purchase, the In-App Payments Service displays a payment processing window
on top of your application window:
</p>
<img src="{{static}}/images/in-app-payments-review.png"
width="569"
alt="screenshot: in-app-payments review dialog">
<p>
When the user clicks the "Buy" button in the payment processing window, the Google Wallet server processes the payment
and displays a purchase confirmation dialog to the user, as shown below.
The success or failure callback in your app is invoked appropriately.
</p>
<img src="{{static}}/images/in-app-payments-confirmation.png"
width="563"
alt="screenshot: in-app-payments confirmation dialog">
<p>
If the user is not signed up for Google Wallet, the In-App Payments Service takes the user through the sign-up flow:
</p>
<img src="{{static}}/images/in-app-payments-set-up.png"
width="565"
alt="screenshot: Google wallet set up dialog">
<h2 id="sample-code">Sample code</h2>
<p>
The following code snippet illustrates how to initiate the purchase flow in an app.
The parameters for the <code>buy()</code> method are described below.
</p>
<pre>
google.payments.inapp.buy({
parameters: {},
jwt: 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIxNDIwNDk' +
'1MzA5NDM1MjE2ODU3MSIsImF1ZCI6Ikdvb2dsZSI' +
'sInR5cCI6Imdvb2dsZS9wYXltZW50cy9pbmFwcC9' +
'zdWJzY3JpcHRpb24vdjEiLCJpYXQiOjEzNTg0NTc' +
'yNjksImV4cCI6MjM1ODQxMjMzNDMsInJlcXVlc3Q' +
'iOnsiaW5pdGlhbFBheW1lbnQiOnsicHJpY2UiOiI' +
'xMC41MCIsImN1cnJlbmN5Q29kZSI6IlVTRCIsInB' +
'heW1lbnRUeXBlIjoicHJvcmF0ZWQifSwicmVjdXJ' +
'yZW5jZSI6eyJwcmljZSI6IjQuOTkiLCJjdXJyZW5' +
'jeUNvZGUiOiJVU0QiLCJzdGFydERhdGUiOiIxMzU' +
'4NDYzMjY5IiwiZnJlcXVlbmN5IjoibW9udGhseSI' +
'sIm51bVJlY3VycmVuY2VzIjoiMTIifSwibmFtZSI' +
'6IlBpZWNlIG9mIENha2UiLCJkZXNjcmlwdGlvbiI' +
'6IkEgZGVsaWNpb3VzIHBpZWNlIG9mIHZpcnR1YWw' +
'gY2FrZSIsInNlbGxlckRhdGEiOiJZb3VyIERhdGE' +
'gSGVyZSJ9fQ.sXd39R7MNNfDFa-jnlTNu2C2te-_' +
'x9--87Phfdr5GrE',
success: logSuccess,
failure: logFailure
});
</pre>
<h2 id="how-to">How to use the Service</h2>
<p>Using the In-App Payments Service in an app is similar to using the
<a href="https://developers.google.com/commerce/wallet/digital/docs/">Google Wallet for Digital Goods API</a> in a web site.
The integration steps below are based on the
<a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial">Google Wallet for Digital Goods Tutorial</a>,
but there are a few key differences for Apps. These differences are summarized below and described in detail in the
integration steps.
</p>
<ul>
<li>You can use pre-generated JSON Web Tokens (JWTs) in your app, rather than using a server to generate the tokens.</li>
<li>You must package the <a href="https://raw.github.com/GoogleChrome/chrome-app-samples/master/in-app-payments/buy.js">buy.js</a>
library with your app, and load the library from its location in your package.</li>
<li>You must call the <code>buy()</code> method with an extra parameter called <code>parameters</code>.</li>
<li>The UI to process payments is displayed in a separate window on top of your application window, rather than in an iframe.</li>
</ul>
<p>Follow these steps to use the In-App Payments Service in your app:</p>
<ol>
<li><a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial#1">Generate a JSON Web Token (JWT) for each item to be purchased.</a>
<div class="indent-small">
You can generate JWTs using a server, or you can pre-generate JWTs for use in your app.
<p class="warning">
Note: If you use pre-generated JWTs, you should generate the JWTs outside of your app, and include
the generated tokens in your app.
<strong>NEVER</strong> include the Seller secret you use to generate tokens in your app.
If you need to generate JWTs dynamically, you should use a server.
</p>
</div>
</li>
<li>Include <a href="https://raw.github.com/GoogleChrome/chrome-app-samples/master/in-app-payments/buy.js">buy.js</a> in your app.
<div class="indent-small">
Due to the security restrictions in the
<a href="contentSecurityPolicy.html">Content Security Policy</a> for Chrome apps,
you cannot include the <a href="https://raw.github.com/GoogleChrome/chrome-app-samples/master/in-app-payments/buy.js">buy.js</a>
library from an external location. Instead, you must package the library with your app, and load it from the packaged location.
</div>
</li>
<li><a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial#3">Create success and failure callback handlers.</a>
<div class="indent-small">
Success and failure callback handlers let your app react to the purchase flow's completion.
</div>
</li>
<li><a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial#4">Call buy().</a>
<div class="indent-small">
When a customer clicks a "Buy" button in your app, call <code>buy()</code> to initiate the purchase flow.
<p>
For Apps, you must call <code>buy()</code> with an extra parameter called <code>parameters</code>.
This parameter currently has one field, <code>env</code>, which specifies the environment in which to process a payment.
You can set this field to either <code>prod</code> (production server that accepts real credit cards), or
<code>sandbox</code> (test server that accepts test credit cards to simulate transactions).
The default setting is <code>sandbox</code>.
</p>
</div>
</li>
<li>(Optional) <a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial#5">Acknowledge purchase notification.</a>
<div class="indent-small">
You can specify a postback URL to make sure that the customer has paid for an item.
</div>
</li>
<li><a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial#6">Get set up as a seller on Google Wallet.</a>
<div class="indent-small">
You must sign up for Google Wallet for digital goods in order to use the In-App Payments Service.
</div>
</li>
<li><a href="https://developers.google.com/commerce/wallet/digital/docs/tutorial#7">Switch to the production server.</a>
<div class="indent-small">
Switch from the sandbox server to the production server and test your app using real credit cards.
</div>
</li>
</ol>
<h2 id="recurring">Recurring billing</h2>
<p>The In-App Payments Service supports automated recurring billing. To set up recurring billing, follow the
instructions for setting up
<a href="https://developers.google.com/commerce/wallet/digital/docs/subscriptions">subscriptions</a>
for the Google Wallet for Digital Goods API,
but note again the differences described above (you can use pre-generated JWT tokens;
you must package <a href="https://raw.github.com/GoogleChrome/chrome-app-samples/master/in-app-payments/buy.js">buy.js</a>
with your app; and you must specify an additional parameter in the call to <code>buy()</code>).
<h2 id="sample-app">Sample app</h2>
<p>
For a simple app that demonstrates how to use the In-App Payments Service, see:
</p>
</ul>
<li><a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/in-app-payments">source code</a></li>
<li><a href="https://chrome.google.com/webstore/detail/moldiohggmfllblgmikpeoagipenlcae">published app</a> (requires Chrome 29 or higher)</li>
</ul>
<p>
You can install and run the published app from the Chrome Web Store to try out the in-app payment purchase flow.
The app has options to use either the production server or the sandbox server. When testing with the sandbox server,
use these <a href="https://developers.google.com/commerce/wallet/digital/docs/testing">test credit card numbers</a>,
which pass basic checks by the Google Wallet for Digital Goods system.
</p>