Re: [Android-SDK-Japan:2239] App in billing:Subscriptionの購読期限の取得について

2,038 views
Skip to first unread message

Ryosuke Matsuuchi

unread,
Jul 28, 2012, 3:20:54 PM7/28/12
to android-...@googlegroups.com
aki 様

Developer Console で利用しているアカウントと Google Play Android Developer API を利用する
アカウントが一致する必要がある (異なっていると Google Play Android Developer API の呼び出しはエラーになる)
のは仕様です。 この仕様になっている理由の一つは、第三者による情報の盗み見を予防するためです。

Developer Console で利用しているアカウントが、 Google Play Android Developer API ではご利用いただけない
という状況なのでしょうか?

- Ryosuke


2012/7/27 aki <akito...@gmail.com>
はじめまして。akiと申します。
アプリ内課金の定期購読の有効性のチェックについて質問させていただきます。
 
アプリ側で、購読期限を取得するには、
Google Play Android Developer APIを利用すれば、時間が取得可能だということまでは分かったのですが、
Developer Console で利用しているアカウントと違うアカウントから Google API を利用する場合、エラーとなるとの投稿を見ました。
(実際、Apis Exploreにて確認したところ、取得できませんでした)
購読期限に関してはアプリの所有者でなければ取得できず、直接アプリから取得するのではなく、何からしらを介さないといけないということでしょうか?
 
間に、サービスを挟むことは考えておりませんので、
その場合、RESTORE_TRANSACTIONSリクエストにて購入履歴を取得するしかないのでしょうか?
 
ご助言いただければ幸いです。

--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/d1946I04VF4J にアクセスしてください。
このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。



--
- Ryosuke Matsuuchi | Developer Advocate, Android | Google


aki

unread,
Jul 29, 2012, 1:34:36 AM7/29/12
to android-...@googlegroups.com
Ryosuke様
ご回答ありがとうございます。
第三者からは取得できない旨、理解いたしました。
>Developer Console で利用しているアカウントが、 Google Play Android Developer API ではご利用いただけない
という状況なのでしょうか?
こちらに関しては、
アプリ内で月額課金の有効期限を取得し、その時間を用いて、権限が有効であるかどうか判断することを考えておりました。
ユーザー各々が自分自身の課金状態を取得できるものと思っていたため、
アプリ内で購入したユーザー自身が、OAthを利用し、アクセスを許可し、購入期限を取得する流れを想定していた、
といったことから、デベロッパーのアカウントではないアカウントで利用しようとしていました。
アプリ内から何も介さずに、有効期限を各ユーザーが取得するには、
購入情報の購入日あたりから考えるしかないのでしょうか?
お手数おかけしますが、ご存知でしたらご助言いただければ幸いです。
aki
 

2012年7月29日日曜日 4時20分54秒 UTC+9 Ryosuke Matsuuchi:
aki 様

Developer Console で利用しているアカウントと Google Play Android Developer API を利用する
アカウントが一致する必要がある (異なっていると Google Play Android Developer API の呼び出しはエラーになる)
のは仕様です。 この仕様になっている理由の一つは、第三者による情報の盗み見を予防するためです。

Developer Console で利用しているアカウントが、 Google Play Android Developer API ではご利用いただけない
という状況なのでしょうか?

- Ryosuke


2012/7/27 aki <akito...@gmail.com>
はじめまして。akiと申します。
アプリ内課金の定期購読の有効性のチェックについて質問させていただきます。
 
アプリ側で、購読期限を取得するには、
Google Play Android Developer APIを利用すれば、時間が取得可能だということまでは分かったのですが、
Developer Console で利用しているアカウントと違うアカウントから Google API を利用する場合、エラーとなるとの投稿を見ました。
(実際、Apis Exploreにて確認したところ、取得できませんでした)
購読期限に関してはアプリの所有者でなければ取得できず、直接アプリから取得するのではなく、何からしらを介さないといけないということでしょうか?
 
間に、サービスを挟むことは考えておりませんので、
その場合、RESTORE_TRANSACTIONSリクエストにて購入履歴を取得するしかないのでしょうか?
 
ご助言いただければ幸いです。

--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/d1946I04VF4J にアクセスしてください。
このグループに投稿するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。

Ryosuke Matsuuchi

unread,
Jul 29, 2012, 8:20:05 AM7/29/12
to android-...@googlegroups.com
aki様

こんにちは。 Google 松内です。

> アプリ内から何も介さずに、有効期限を各ユーザーが取得するには、
> 購入情報の購入日あたりから考えるしかないのでしょうか?

もしご自身のサーバーを運用されている場合には、その開発者サーバー
にてご自身で API を用意して
    アプリ ⇔ 開発者サーバー ⇔ Google Play Android Developer API
の通信により有効期限を取得する、というのが一つの方法です。
この場合、開発者サーバー ⇔ Google Play Android Developer API の
通信はアプリのユーザーのアカウントではなく、 Developer Console
でご利用いただいている開発者アカウントをご利用いただくことにな
ります。

もうひとつの方法は、既に推察されているとおり、購入時刻 (PURCHASE_STATE_CHANGED
によりアプリに渡される purchaseTime 値) をもとにアプリ内で有効
期限を計算していただくという方法です。 これはご自身で日付/時刻
計算のロジックを実装していただいてもよいと思いますし、一般のオー
プンソースのライブラリ (例 : org.joda.time.DateTime.plusMonths() 
をご利用いただくのも一つの方法かと思います。

ただし一般に、アプリに対して送られる状態変化の通知から判ることは
  ・PURCHASE_STATE_CHANGED 通知により purchaseState:3 (expired)
   が送られてくるまでの間はその Subscription は有効である
というものですので、この通知だけを頼りにすると、期限時刻のとき
にたまたま端末が PURCHASE_STATE_CHANGED 通知を受信でき
なかった場合などに状態が判断できなくなることがあります。

Subscription 購読が期限時刻後に正しく更新されたのか、または
Subscription が継続されなかった (by ユーザー操作 or 決済の失敗) のかを
クライアント側 only (サーバー処理なし) のコードで判別するには、たとえば
  ・期限満了後に PURCHASE_STATE_CHANGED の受信がない場合には
   適切なタイミングで RESTORE_TRANSACTIONS を呼び出してその
   Subscription がまだ有効かどうかを確認する
といったような工夫が必要になります。
 
これらの手法や各種のアプローチ (サーバー側のプログラミングも含む) については、
下記資料にもいくつか対応例が記述されておりますのでご参照ください。
 
Subscriptions.  Android Developers.
http://developer.android.com/guide/google/play/billing/billing_subscriptions.html#implementing
(とくに "Checking subscription validity" の節を参照してください )

- Ryosuke


2012/7/29 aki <akito...@gmail.com>
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/cpGHkGvaScAJ にアクセスしてください。

このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。

aki

unread,
Jul 31, 2012, 1:56:09 AM7/31/12
to android-...@googlegroups.com
Google 松内様
 
下記件、丁寧なご回答ありがとうございます。
手法に関しましては大体の目安を付けることができました。
 
もう少し確認させていただきたいのですが、
 
・購入日時(purchaseTime)は継続購読の場合、自動更新が確認されたタイミングで購入日時も更新されるのでしょうか?
・継続購読をキャンセルし、いったん無効(purchaseState:3 (expired))になったとき再び購入を行った場合、
 新たに注文IDが発効され、履歴が2件となるにでしょうか?もしくは同一の購入情報が更新されるのでしょうか?
 
度々申し訳ないのですが、お教えいただければ幸いです。
 
aki
 

2012年7月29日日曜日 21時20分05秒 UTC+9 Ryosuke Matsuuchi:
aki 様
2012/7/27 aki <akito...@gmail.com>
このグループに投稿するには、android-sdk-japan...@googlegroups.com にメールを送信してください。

このグループから退会するには、android-sdk-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。



--
- Ryosuke Matsuuchi | Developer Advocate, Android | Google


--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/cpGHkGvaScAJ にアクセスしてください。

このグループに投稿するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。

aki

unread,
Aug 6, 2012, 1:54:13 AM8/6/12
to android-...@googlegroups.com
城様

ご回答ありがとうございます。

>> ・購入日時(purchaseTime)は継続購読の場合、

自動更新が確認されたタイミングで購入日時も更新されるのでしょうか?
>現状ですと、Developer Console の 登録(Subscriptions)で設定した金額の新しい購入が発生します。

>> ・継続購読をキャンセルし、いったん無効(purchaseState:3 (expired))になったとき再び購入を行った場合、
>>  新たに注文IDが発効され、履歴が2件となるにでしょうか?もしくは同一の購入情報が更新されるのでしょうか?
>0円の注文2件、設定価格の注文2件の4件になるはずです。

上記についてなのですが、
通常の継続でも、新たに期限切れが発生し、購入が発生するため、キャンセルを行い無効になった場合も同じ動きであるということなのですね。

Re: [Android-SDK-Japan:2219] Re: Google Play Subscription 決済機能 (月額課金・年額課金) 提供開始についてのお知らせ
こちらのほうで、継続購入の場合、PurchaseTokenは変わらないとのことだったので、
ステータスも継続の場合変化しないものだと思っていました・・・。

ただ、RestoreTransactionにて、取得したJSONデータを確認しているところ、1件の購入に対して、1件の注文情報のみしか送られてきていないようです。
販売者の注文受信トレイを確認してみても、最初のうちは0円の請求が発生していたのですが、最近では発生しなくなっており、
そのあたりも関係するのでしょうか・・・。0円請求にはバグもあったようなのでそのあたりが修正されたのかなと思っておりました。。。

また、これはこちらで試した結果なのですが、Subscriptionの場合のみ、
キャンセル(及び払い戻し)を行った場合、PurchaseStatusの変化はあるが、
プッシュ通知は飛ばない(マーケットアプリからSTATUS_CHANGEが送られてくることはない)ようなのです。
ガイドラインなどでは、PUSH通知を利用するることと書かれているため、expiredやPurchasedは送られてくると思っていますが、
そのあたりご経験ありますでしょうか?
1ヶ月待たなくては、更新の確認ができないのがつらいところです・・・。


>Google Playの Subscriptions に関しては、
>まだ安定していない部分が多く、
>Google各方面に問い合わせても「仕様です」「・・・(返信なし)」の状況です。
>現状、松内さま以外からはまともに返信をいただけませんでした。

そうですね、、、情報も少なくなかなか、明確な仕様を把握できていないところです。
こちらでの情報は本当に感謝しております。


aki


2012年7月29日日曜日 4時20分54秒 UTC+9 Ryosuke Matsuuchi:
aki 様

Developer Console で利用しているアカウントと Google Play Android Developer API を利用する
アカウントが一致する必要がある (異なっていると Google Play Android Developer API の呼び出しはエラーになる)
のは仕様です。 この仕様になっている理由の一つは、第三者による情報の盗み見を予防するためです。

Developer Console で利用しているアカウントが、 Google Play Android Developer API ではご利用いただけない
という状況なのでしょうか?

- Ryosuke


2012/7/27 aki <akito...@gmail.com>
はじめまして。akiと申します。
アプリ内課金の定期購読の有効性のチェックについて質問させていただきます。
 
アプリ側で、購読期限を取得するには、
Google Play Android Developer APIを利用すれば、時間が取得可能だということまでは分かったのですが、
Developer Console で利用しているアカウントと違うアカウントから Google API を利用する場合、エラーとなるとの投稿を見ました。
(実際、Apis Exploreにて確認したところ、取得できませんでした)
購読期限に関してはアプリの所有者でなければ取得できず、直接アプリから取得するのではなく、何からしらを介さないといけないということでしょうか?
 
間に、サービスを挟むことは考えておりませんので、
その場合、RESTORE_TRANSACTIONSリクエストにて購入履歴を取得するしかないのでしょうか?
 
ご助言いただければ幸いです。

--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/d1946I04VF4J にアクセスしてください。
このグループに投稿するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。

Ryosuke Matsuuchi

unread,
Aug 6, 2012, 10:18:06 AM8/6/12
to android-...@googlegroups.com
aki様, 城様,

こんにちは。 Google 松内です。

>>> ・購入日時(purchaseTime)は継続購読の場合、自動更新が確認された
>>>   タイミングで購入日時も更新されるのでしょうか?
>> 現状ですと、Developer Console の 登録(Subscriptions)で設定した金額
>> の新しい購入が発生します。
>>> ・継続購読をキャンセルし、いったん無効(purchaseState:3 (expired))
>>>  になったとき再び購入を行った場合、新たに注文IDが発効され、履歴が2件
>>>  となるにでしょうか?もしくは同一の購入情報が更新されるのでしょうか?
>> 0円の注文2件、設定価格の注文2件の4件になるはずです。
> 上記についてなのですが、通常の継続でも、新たに期限切れが発生し、購入
> が発生するため、キャンセルを行い無効になった場合も同じ動きであるとい
> うことなのですね。
> Re: [Android-SDK-Japan:2219] Re: Google Play Subscription 決済機能 (月額課金・年額課金) 提供開始についてのお知らせ
> こちらのほうで、継続購入の場合、PurchaseTokenは変わらないとのこと
> だったので、ステータスも継続の場合変化しないものだと思っていまし
> た・・・。


Checkout管理画面の Order Inbox において、購読開始のときに 2 つの注文 
(0円の注文 + その数分後に本来の価格の注文) が生成されるのは初期の 
Subscription 機能の仕様でした。 これはもともと内部処理の都合の結果 
起こっていた挙動で、ユーザー体験に影響を与えないように意図されていた
ものでした。 その後、(不要な混乱を避けるためにも) 7/25 頃に処理内容
が改善されました。 私の方でも動作確認を続けておりますが、日本時間 
7/27 頃以降は この 0円注文は生成されずに、購読開始後すぐに本来の価格
の注文が生成されておりますので、ご確認いただけますでしょうか。

同時に、「Google 注文番号 (orderId)」の生成が即、「purchaseToken」
「PURCHASE_STATE_CHANGED 通知」につながるわけではない点について、ご
理解いただけますようにお願いします。 例えば、次のようなシナリオがあ
るとすると:
  1. 7/20 09:00 ユーザーが monthly subscription を購入
  2. 8/20 09:00 更新 (決済成功)
  3. 8/25 13:00 ユーザーがその monthly subscription を (Google Play 
                のUI上で) キャンセル
  4. 9/20 09:00 期限終了

この場合の期待される挙動は次のようになります:
  1. 7/20 09:00 ユーザーが monthly subscription を購入
      - 決済 orderId:O1 が生成されます
      - purchaseToken:P1 がその購入に紐付けられます
      - PURCHASE_STATE_CHANGED (purchaseState:0 (purchased)) が端
        末に送られます
      - Google Play Android Developer API の get method において 
        validUntilTimestampMsec: 8/20 09:00 が返されます
  2. 8/20 09:00 更新 (決済成功)
      - 決済 orderId:O2 が生成されます (O1とは別の決済)
      - purchaseToken は P1 のまま変化しません
      - PURCHASE_STATE_CHANGED は送られません
      - これ以降、Google Play Android Developer API の get method に
        おいて validUntilTimestampMsec: 9/20 09:00 が返されます
  3. 8/25 13:00 ユーザーがその monthly subscription を (Google Play 
                のUI上で) キャンセル
      - 決済 O1, O2 はキャンセルされません
      - purchaseToken は P1 のまま変化しません
      - PURCHASE_STATE_CHANGED は送られません
      - これ以降、Google Play Android Developer API の get method に
        おいて autoRenewing: false が返されます
  4. 9/20 09:00 購読期限終了
      - purchaseToken は P1 のまま変化しません
      - PURCHASE_STATE_CHANGED (purchaseState:3 (expired)) が端末に
        送られます


> ただ、RestoreTransactionにて、取得したJSONデータを確認しているとこ
> ろ、1件の購入に対して、1件の注文情報のみしか送られてきていないよう
> です。販売者の注文受信トレイを確認してみても、最初のうちは0円の請求
> が発生していたのですが、最近では発生しなくなっており、そのあたりも関
> 係するのでしょうか・・・。0円請求にはバグもあったようなのでそのあた
> りが修正されたのかなと思っておりました。。。


RESTORE_TRANSACTIONS を呼び出した後、アプリに対しては 1件の 
subscription 購入に対してそれぞれ 1件づつ注文情報 (purchaseTime, 
purchaseState, purchaseToken, orderId, ...) が送られるのは仕様です。  
purchaseState:0 (purchased) の場合には、orderId には最後に成功した決
済の Google 注文番号が入っています。


> また、これはこちらで試した結果なのですが、Subscriptionの場合のみ、
> キャンセル(及び払い戻し)を行った場合、PurchaseStatusの変化はある
> が、プッシュ通知は飛ばない(マーケットアプリからSTATUS_CHANGEが送ら
> れてくることはない)ようなのです。ガイドラインなどでは、PUSH通知を利
> 用するることと書かれているため、expiredやPurchasedは送られてくると
> 思っていますが、そのあたりご経験ありますでしょうか?


デベロッパーが Checkout 管理画面から手動で決済をキャンセルした場合の
挙動については、私のほうでもひきつづき動作確認しております (情報が若
干混乱しております、すみません)。 私の方でも動作確認ができ次第、改め
てこちらの forum にも共有したいと思います。

- Ryosuke


2012/8/6 aki <akito...@gmail.com>
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/mDgWo4JHwOYJ にアクセスしてください。

このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。

aki

unread,
Aug 8, 2012, 3:23:36 AM8/8/12
to android-...@googlegroups.com
Google 松内様

細かな説明ありがとうございます。
更新タイミングではPURCHASE_STATE_CHANGEDは送られてこないのですね。
更新タイミングに再取得しステータスおよび、購入日を確認する手段をとる予定です。

また、ご説明頂いたように、validUntilTimestampMsecが7月20日9時に購入であれば、8月20日9時となるかと思うのですが、
APIで確認したところ、validUntilTimestampMsecとinitiationTimestampMsecの差がちょど1ヶ月後ではない場合が
何度か高い確率で確認できました。決済タイミングやキャンセルなどが関係あるのでしょうか・・・?

{
"kind": "androidpublisher#subscriptionPurchase",
"initiationTimestampMsec": "1343294251000",
"validUntilTimestampMsec": "1345979845752",
"autoRenewing": false
...
}

aki



2012年8月6日月曜日 23時18分06秒 UTC+9 Ryosuke Matsuuchi:
2012/8/6 aki <akito...@gmail.com>
aki 様
2012/7/27 aki <akito...@gmail.com>
このグループに投稿するには、android-sdk-japan...@googlegroups.com にメールを送信してください。

このグループから退会するには、android-sdk-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。



--
- Ryosuke Matsuuchi | Developer Advocate, Android | Google


--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/mDgWo4JHwOYJ にアクセスしてください。

このグループに投稿するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-japan+unsubscribe@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
Reply all
Reply to author
Forward
0 new messages