【In-app Billing Ver.3】通信断にて消費の結果を受信できない場合の挙動

600 visualizações
Pular para a primeira mensagem não lida

xypno

não lida,
4 de jun. de 2014, 22:03:4804/06/2014
para android-...@googlegroups.com
はじめまして。
以下のような仕様にて、アプリ内課金の機能を実装しております。

1)アプリ内アイテム購入後、消費(IInAppBillingService.consumePurchase())を実行
2)消費完了(BILLING_RESPONSE_RESULT_OK 返却)のタイミングでユーザにアイテム付与
3)購入後、消費完了前に通信断等があった場合に備えてリストア機能を実装
4)リストア機能では、まず IInAppBillingService.getPurchases() で購入履歴を取得
5)購入履歴中の購入済みのものに対して消費を実行し、完了したものについてアイテムを付与

動作テストとして、2)の consumePurchase() の呼び出し直後に通信断が発生するようにし、
テストを行いました。

通信断の方法として、A)機内モードにする、B)WiFiアクセスポイントのWAN側のケーブルを抜く
を行いました。※ B)は端末側で通信断が判断できない場合テスト

その結果、
A)では、4)5)のリストア処理にて正常にアイテムの付与が可能
B)では、4)にて購入履歴にて未付与のアイテムが取得できたのにも関わらず、
消費(consumePurchase())の結果が、BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED
となった。(数回のテストで何度か発生)

という状況でした。
B)に関して、買ったのに受け取れなかったというユーザクレームに
繋がりそうな挙動のため、対策を取りたいと考えておりますが、
なぜこのような挙動となるのかご存知の方や、対策を取られた方が
いらっしゃいましたらアドバイスを頂きたく、よろしくお願いいたします。

Hirokazu Fukami

não lida,
4 de jun. de 2014, 22:12:0404/06/2014
para android-...@googlegroups.com
こんにちはfkmです。

1)と2)は逆にしたほうがよいのでは? と思いました。

2-1)アプリ内アイテム購入後、ユーザーにアイテム付与(レシートIDをキーにして保存)
2-2)消費(IInAppBillingService.consumePurchase())を実行

通信断のケースを考えてみます。
A)アイテム付与のリクエストが送れなかった
==>次回のアプリ起動でqueryし、再送するのでOK
B)アイテム付与のリクエストを送った直後に通信断
==>次回のアプリ起動でqueryし、再送し、サーバーで重複チェックでひっかかるのでOK
C)消費のAPI呼び出しで通信断(呼び出し失敗)
==>Bと同じ
D)消費のAPI呼び出しが終わった後通信断(アプリが落ちた?)
==>queryでアイテムがでてこなくなるのでOK
> --
> このメールは Google グループのグループ「Android-SDK-Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-sdk-ja...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-sdk-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

xypno

não lida,
4 de jun. de 2014, 23:02:1404/06/2014
para android-...@googlegroups.com
fkmさま、こんにちは。
早速の返信ありがとうございます。

なるほどなるほど。レシートIDとアイテムを紐づけておくことで
消費前の付与が可能になりますね。

今回はスタンドアローンアプリという背景もあり
複数所持できるアイテムをまとめて管理してしまっているため
個別にレシートIDを紐付るのが、データ設計の都合上
若干ハードルが高くはあるのですが、検討してみます。
ありがとうございます!
A mensagem foi excluída

本間竜司

não lida,
4 de jun. de 2014, 23:06:3904/06/2014
para android-...@googlegroups.com
ちなみに、下記の記述で付与(provisioningなので直訳するとアイテムの使用
になるのでしょうか)は消費の後にするべきと読み取れるのですが、
みなさんはどのようにされているのでしょうかね。。?

---
Security Recommendation: You must send a consumption request before provisioning
the benefit of the consumable in-app purchase to the user.
Make sure that you have received a successful consumption response from
Google Play before you provision the item.
---

Responder a todos
Responder ao autor
Encaminhar
0 nova mensagem