質問: ### 前提・実現したいこと iOS/Androidアプリ内課金の不正なレシートによる有料会員登録を防ぐ 上記のサイトを参考にApp内課金の実装をしようとしています。 しかし、以下の内容がわかりません。 * クライアント側で接続不良によりレシートが送信できない時はどうするか? →スマホ側DBにレシート情報を保存しておき、サーバーに送信成功したかどうかを記録しておく。クライアント側はどこかのタイミング(起動時?画面遷移時?)に送信成功していないレシートがあれば送付する * サーバー側は送付されたレシートが他のユーザーで検証済かどうか確認するとあるがどのように行うのか? →送付されたレシートをDBに保存しておくのか?そして、検証成功したかどうかの情報をユーザーIDと紐付けて保持しておくのか? どなたか経験がありましたらご教示ください
回答: 課金に対する考え方としては、通常のプログラミング処理とは違い、かなりシビアな世界になってきます。 最近は課金部分を肩代わりしてくれるサービスも出てきており実装も楽になっていますが、 個人で実装する場合、課金が上手く行かなかったりすると、最悪、訴訟にも発展しかねなかったり、 そのセキュリティホールを突かれて不正利用されたりします。 よく規約やガイドラインを読んで、慎重に実装することをお薦めします。 また約款や利用規約などの法務的書類の書き方や、それに対する法律の勉強もしておくべきでしょう。 でないと、いざという時の保険として自分を守りきることができません。 課金処理に関しては、お金が動くところは特に**完全に正常であるという認識**ができて初めて一連の課金処理を**完了**させます。 つまり多くの場合、プログラミング処理途中でロストしたり、リクエストが失敗した場合は、全て不正とみなします。 ただし、再度リクエストしてもらうなどの何らかのフォロー策も必要になることを忘れないでください。 (プログラムではなくユーザサポートとしてのやりとり) iOSの課金に関して少し資料が古いかもしれませんが、こちら参考になるかと思います。 iOS課金まとめ iOSの月額課金レシート検証 あとiOSとAndroidでは課金方法も変わってきますので注意してください。 【追記】 以下に処理マトリクスを記載します。 | リクエスト | 認証結果 | レスポンス | 結果 | アプリ処理 | | --- | --- | --- | --- | --- | | 通信失敗 | - | - | 購入失敗 | 失敗しました。再実行してくださいとダイアログを出す | | 通信成功 | 購入可能と判断された | 通信完了 | 購入完了 | 正常終了のダイアログを出して有料処理に移る | | 通信成功 | 購入可能と判断された | 通信失敗 | AppStore側で購入できない | 失敗しました。再実行してくださいとダイアログを出す | | 通信成功 | 購入不可と判断された | 通信完了 | AppStore側で購入できない | 失敗しました。再実行してくださいとダイアログを出す | | 通信成功 | 購入不可と判断された | 通信失敗 | AppStore側で購入できない | 失敗しました。再実行してくださいとダイアログを出す | ※認証結果:ログイン成功、プリペイド金額があるかの判断結果とする