2012年5月26日

【Android】月額課金の実装を翻訳してみた 2


Androidの月額課金の実装を翻訳してみたの続き
途中まで出すが、随時公開していきます。

参考:Subscriptions | Android Developers


[以下、意訳]
誤訳がありましたらお教え願います。

トランザクションの復元


定期購読はユーザアカウントの購入タイプによって管理されますので、端末内に定期購読商品のトランザクションを必要なときに復元可能です。ユーザがアプリを端末にインストールした時や、アン再インストールした時には、アプリはユーザがすでに支払い済みの定期購読商品のトランザクションをアプリ内に復元する必要があります。

定期購読商品のトランザクションを復元する方法はMessaging sequenceで説明されている方法と同じです。アプリからGoogle PlayにRESTORE_TRANSACTIONSのリクエストを送信します。Google Playは2つのBroadcast Intentを非同期で送信します。1つはRESPONSE_CODE intentで、もう1つはPURCHASE_STATE_CHANGED intentです。

PURCHASE_STATE_CHANGED intentはトークンを含めた購買の詳細を復元するためのnotification IDを含んでいます。呼び出しの戻り値のBundleは端末内に復元する為のアプリ内課金の詳細をJSON配列として含んでいます。

アプリは復元された購入ステータスやその他手続きの詳細を保存出来ます。その情報を使用し、アプリから定期購読が有効かどうかをチェック出来ます。Security and Designをよく読み、それらの情報をセキュアーに保つ方法をとって下さい。

定期購読の妥当性チェック


定期購読は時間制の商品の為、正しく支払いをする為にはアプリからその購入情報が有効かどうかをチェックする必要があります。アプリは購入された定期購読商品の有効性を起動時、もしくは課金コンテンツにアクセスする前にチェックする必要があります。

In-app Billingでは、購入ステータスをチェックする事で定期購読の妥当性(購入済みかキャンセルか)を監視出来ます。また、ステータスは必要なときにいつでもチェック出来ます。Google Playはいつ定期購読の購入ステータスが変わったかを2つの方法で提供しています。

  • In-app Billing Notifications. Google Playから定期購読のステータスが変更された場合にPush通知がアプリに飛んできます。アプリは最新の購入ステータスをPush通知によって与えられた購入トークンによってチェックし保存する事で、起動時にそのステータスをチェックする事が出来ます。
  • Google Play Android Developer API. HTTPベースのAPIを使用し、Google Playへアクセスして現在の定期購読商品の購入ステータスを知る事が出来ます。それぞれのpurchaseTokenに対してアプリケーションサーバに購入ステータスを保存する事が出来ます。詳細は下記のGoogle Play Android Developer APIを参照して下さい。

ほとんどのケース、特にアプリケーションサーバを用意してユーザの定期購読の状態を管理している場合、上記の両方を組み込む事をお勧めします。A typical implementation might work like this:

  • ユーザが新しく定期購読商品の購入に成功した場合、アプリからアプリケーションサーバへ通知します。サーバでは購入トークンやユーザ名などの情報をセキュアな状態で保存します。
  • アプリから有効期限を知る事は出来無いので、サーバからGoogle Playへアクセスして有効期限を取得し、購入情報と一緒に保存してきます。
  • この状態になると、サーバは有効期限を知っているので、Google Playへ期限内に再度アクセスする必要がなくなります。有効期限内は定期購読がキャンセルされていない確認出来ます。
  • 端末上のアプリ側では、購入ステータスが変化するたびにアプリケーションサーバのステータスをアップデートし、ステータスを端末上でも保存します。

もし両方の方法を使用するのであれば、下記を推奨します。

  • アプリから購入状態をチェックしたいのだが、アプリケーションサーバへアクセス出来無い、もしくはアプリケーションサーバが無い場合、最新のnotificationで受け取った状態を使用する。
  • もしアプリケーションサーバへアクセス出来るのであれば、サーバから購入ステータスを取得し、notificationで受け取った情報へ上書きする。

必要であれば、RESTORE_TRANSACTIONSリクエストを使用し、すべてのアプリ内課金の情報を取得し、端末上へ保存して使用して下さい。ただし、RESTORE_TRANSACTIONSを何度も使用する事はパフォーマンスへの影響を考え推奨していません。

どの方法を利用しようとも、定期購読の有用性は起動時、課金コンテンツへアクセスする場合、ゲームレベルが変化した場合など都度行う事を推奨します。

Table 1. PURCHASE_STATE_CHANGED intentで受け取れる定期購読購入情報のpurchaseState
StatepurchaseState ValueComments
Purchased successfully0Sent at original purchase only (not at recurring billing cycles).
Cancelled1Sent at original purchase only if the purchase has failed for some reason.
Refunded2The purchase was refunded.
Subscription expired3Sent if a subscription expires because of non-payment or user cancelation.

商品ページでのキャンセルもしくは購読状態の照会


In-app Billingではアプリ内から直接購読状態の照会やキャンセルをするAPIを用意しておりません。代わりに、Play Storeのアプリを開き、My Appsのページを開けば購読状態の管理が出来るようになっております。My Apps画面では、ユーザはアプリ毎に購読商品のリストを参照でき、リストの1つをタップする事で、アプリの商品ページへ遷移します。そこで購読状態の照会やキャンセルをする事が出来ます。

これらをアプリ内から簡潔に行う為に"View My Subscriptions"か"Manage Subscriptions"ボタンのようなものを画面内に作り、Play StoreのMy Appsページを直接開けるようにする事をおすすめします。

上記を行うためには、ACTION_VIEW intentを作成し、アプリの詳細ページを開く為に market:// URI を含めて投げます。下記がその例になります。

Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setData(Uri.parse("market://details?id=com.example.app"));
  startActivity(intent);

詳細はOpening the app details page from your Android appを参照して下さい。


ごめんなさい。疲れたので今日はここまでです。
続き:Androidの月額課金の実装を翻訳してみた 3