スマフォでの課金機構のレシート検証について
概要
まとめる。
追記
Unity 5.5でのIAP の話を追加
語彙
ticketIdについて:
購入に際して対応するIdをサーバ側で先行して配布する、そのId。
連番などでないユーザーIdに紐づいた推測されにくい値が推奨。
購入手順は、
・プレイヤーが購入するアイテムを選ぶ
・サーバに問い合わせてサーバでticketIdを生成
・購入処理開始(プレイヤーに購入しますかY/Nをプラットフォーム機構で表示)
・キャンセルだったら無視(できればticketIdが終わったことをサーバに通知)
・購入成功であれば、プラットフォームのtransactionIdを未完了にしたまま、サーバへとreceipt + ticketIdを送付
・サーバ側でレシート検証
・レシートそのほかの検証がOKであれば、クライアントに結果を送付
・クライアント側でプラットフォームのtransactionIdを完了にしてDone
iOSの検証について
・ticketId & ユーザー情報で、実際に購買が行われていたかどうかチェック
・receiptをAppleに問い合わせる。0以外のstatusがある場合はダメ
・bundle_idがこのAppのCFBundleIdentifierか
・product_idがticketのものと一致するか
・帰って来たレスポンスのtransactionIdで、過去このアプリで使われた全てのtransactionIdとの重複をチェック
(チーターは他のアプリのticketを送ってきたりするので、すでに誰かが処理済みのtransactionだったら蹴る、とか。)
-> OK
Androidの検証について
・ticketId & ユーザー情報で、実際に購買が行われていたかどうかチェック
・receiptを復号
Base64Decode -> 公開鍵暗号
・内部に含まれているDeveloperPayloadに、ticketIdが含まれているかどうかチェック(もしかしたら入ってないかもしれない?)
(チーターは他のアプリのticketを送ってきたりするので。)
-> OK
参考
「iOS/Androidアプリ内課金の不正なレシートによる有料会員登録を防ぐ」
http://inside.pixiv.net/entry/2014/12/09/111310
Unity5.5以降のIAPについて
「Unity IAP サーバ側で検証~みたいなのを実装してた」
http://sassembla.github.io/Public/2017:01:05%2017-46-38/2017:01:05%2017-46-38.html
補:InitiatePurchaseでのpayloadについて
全然情報がない。
http://qiita.com/kivatek/items/e93e9cf11eba3fba176c
データ形式見せてくれてるけどドキュメントと整合性取らねば。
Unity社の実装
https://bitbucket.org/Unity-Technologies/unity-iap-samples.git
使ってない。役立たずーーー!!! これじゃ実際に試すしかないじゃん。もーーー。
payloadはAndroidでのみ効果があるのかな?
試すしかなさそう。
-> Productのインスタンス保持してたらちゃんとtransactionIdが生えたりしたので、無事比較することができた。
これで同一性に関しては保持できた。よかった、、、、
で、payloadは、これたぶんAndroid側はデータに入るんだと思う。
で、check時に内部を見れば良さげ。