公開日: 2020 年 12 月 2 日
Google Play 請求サービスでは、アプリで Google Play ストアでデジタル商品や定期購入を販売できるだけでなく、カタログ、料金、定期購入を管理するためのツール、便利なレポート、ユーザーに使い慣れた Google Play ストアによる精算フローを利用できます。これは、Google Play ストアで公開され、デジタル商品を販売するアプリに必須の要件です。
Google Play Billing API には独自の用語があり、クライアント コンポーネントとバックエンド コンポーネントが含まれています。このセクションでは、Digital Goods API と信頼できるウェブ アクティビティの使用に固有の API のごく一部について説明します。本番環境のアプリに統合する前に、Google Play 請求サービスのドキュメントを読み、コンセプトを理解してください。
基本的なフロー
Google Play ストアでデジタル商品を提供するには、Google Play ストアでカタログを構成し、PWA から Google Play ストアを支払い方法として接続します。
手順は次のとおりです。
- Google Play Console のメニューで [商品] をクリックします。既存のアプリ内アイテムと定期購入を表示します。
- [商品を作成] をクリックして新しい商品を追加します。
- 商品 ID、名前、説明、価格を追加します。後で必要になるため、意味のある覚えやすいプロダクト ID を作成します。作成した ID は変更できません。
- 定期購入を作成する場合は、請求対象期間も指定する必要があります。定期購入の特典をリストアップし、無料試用、お試し価格、猶予期間、再定期購入オプションなどの機能を追加できます。
- [有効にする] をクリックして商品を利用できるようにします。
必要に応じて、Play Developers API を使用して商品を追加することもできます。
カタログを構成したら、次は PWA から購入手続きフローを構成します。Digital Goods API と Payment Request API を組み合わせて使用します。
Digital Goods API を使用して商品の価格を取得する
Google Play 請求サービスを使用している場合は、ユーザーに表示される価格がストアの掲載情報の価格と一致するようにしてください。これらの価格を手動で同期することは不可能であるため、Digital Goods API では、ウェブ アプリケーションが基盤となる支払いプロバイダに価格をクエリする方法が用意されています。
// The SKU for the product, as defined in the Play Store interface
async function populatePrice(sku) {
try {
// Check if the Digital Goods API is supported by the browser.
if (window.getDigitalGoodsService) {
// The Digital Goods API can be supported by other Payments provider.
// In this case, we're retrieving the Google Play Billing provider.
const service =
await window.getDigitalGoodsService("https://play.google.com/billing");
// Fetch product details using the `getDetails()` method.
const details = await service.getDetails([sku]);
if (details.length === 0) {
console.log(`Could not get SKU: "${sku}".`);
return false;
}
// The details contain both the price and the currenncy.
item = details[0];
const value = item.price.value;
const currency = item.price.currency;
const formattedPrice = new Intl.NumberFormat(navigator.language, {
style: 'currency', currency: currency }).format(value);
// Display the price to the user.
document.getElementById("price").innerHTML = formattedPrice;
} else {
console.error("Could not get price for SKU \"" + sku + "\".");
}
} catch (error) {
console.log(error);
}
return false;
}
Digital Goods API のサポートを確認するには、window
オブジェクトで getDigitalGoodsService()
が使用可能かどうかを確認します。
次に、Google Play の課金システム ID をパラメータとして window.getDigitalGoodsService()
を呼び出します。これは Google Play Billing のサービス インスタンスを返します。他のベンダーは Digital Goods API のサポートを実装し、異なる ID を持つことができます。
最後に、Google Play Billing オブジェクトへの参照で getDetails()
を呼び出し、アイテムの SKU をパラメータとして渡します。このメソッドは、ユーザーに表示できる商品の価格と通貨の両方を含む詳細オブジェクトを返します。
購入手続きを開始します。
Payment Request API は、ウェブでの購入フローを可能にし、Google Play 請求の統合にも使用されます。Payment Request API を初めて使用する場合は、Payment Request API の仕組みをご覧ください。
Google Play 請求サービスで API を使用するには、https://play.google.com/billing
というサポートされているメソッドを持つ支払い手段を追加する必要があります。SKU を、計測デバイスのデータの一部として追加します。
const supportedInstruments = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku
}
}];
次に、通常どおり PaymentRequest
オブジェクトをビルドし、通常どおり API を使用します。
const request = new PaymentRequest(supportedInstruments, details);
購入を承認する
トランザクションが完了したら、Digital Goods API を使用して支払いを承認します。PaymentRequest
のレスポンス オブジェクトには、トランザクションの確認に使用できるトークンが含まれています。
const response = await request.show();
const token = response.details.token;
const service = await window.getDigitalGoodsService("https://play.google.com/billing");
await service.acknowledge(token, 'onetime');
Digital Goods API と Payment Request API は、ユーザーの ID を認識しません。そのため、バックエンドで購入をユーザーに関連付け、購入したアイテムにユーザーがアクセスできるようにするのは、お客様の責任となります。購入をユーザーに関連付けるときは、購入トークンを保存してください。購入がキャンセルまたは払い戻しされたかどうか、定期購入がまだ有効かどうかを確認する際に必要になることがあります。バックエンドでこのようなケースを処理するためのエンドポイントが提供されているため、Real Time Developer Notifications API と Google Play Developer API をご覧ください。
既存の利用資格を確認する
ユーザーがプロモーション コードを利用した可能性があります。または、商品の定期購入を既に行っている可能性があります。ユーザーに適切な利用資格があることを確認するには、デジタル商品サービスで listPurchases()
コマンドを呼び出します。これにより、お客様がアプリで行ったすべての購入が返されます。また、未承認の購入を承認して、ユーザーが利用資格を正しく利用できるようにすることもできます。
const purchases = await itemService.listPurchases();
for (p of purchases) {
if (!p.acknowledged) {
await itemService.acknowledge(p.purchaseToken, 'onetime');
}
}