「アプリ内課金 Android レシート検証」で検索するとすぐに情報が見つかります。
https://www.google.co.jp/search?hl=ja&q=%E3%82%A2%E3%83%97%E3%83%AA%E5%86%85%E8%AA%B2%E9%87%91+Android+%E3%83%AC%E3%82%B7%E3%83%BC%E3%83%88%E6%A4%9C%E8%A8%BC&lr=lang_ja
普通に不正なレシートを送信してくるユーザがいますので、
サーバサイドで照合する必要があります。
私はRails(Ruby)を使っているのでRailsでの検証方法を記載します。
お使いのサーバサイドの言語次第で実装は変わりますので、そこはご自身の環境に合わせてください。
UnityのAndroidのレシートはこのような形をしています。
json
1{
2 "Store":"GooglePlay",
3 "TransactionID": "注文ID(GPA.XXXX-XXXX-XXXX-XXXXX)",
4 "Payload": "{\"json\":\"レシートJSON\",\"signature\":\"署名\",....}"
5}
このままのJSON文字列args.purchasedProduct.receiptを
サーバに送信しておき、サーバではPayloadの文字列をさらにJSONとしてパースする事になります。
上記のJSONを文字列としてそのままサーバへ送信したものとして、サンプルコードを記載します。
サーバにPOSTされたUnityのレシートから、レシート検証に必要な情報を取り出す
ruby
1# Unityから送信したレシート
2unity_receipt = JSON.parse(params[:receipt])
3=> {"Store"=>"GooglePlay", "TransactionID"=>"GPA.XXXX-XXXX-XXXX-XXXXX", "Payload"=>"{\"json\":...., \"signature\":....,}"
4
5# GooglePlayのレシートと署名を取り出す
6data = JSON.parse(unity_receipt['Payload'])
7=> {"json"=> "...", "signature" => "...", ....}
8
9receipt = data['json'] # レシートJSON文字列
10signature = data['signature'] # レシートの署名(Base64エンコードされた文字列)
レシートと署名の検証
Rubyではpemファイルを作る必要はありません。
ruby
1# GooglePlayのライセンスキー
2license_key = 'MIIBI....'
3
4verifier = OpenSSL::PKey::RSA.new(Base64.decode64(license_key))
5verifier.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(signature), receipt)
6=> true/false
trueが返ってくればレシートが正しいという事になります。
これで正しいレシートかどうかの検証はできるようになりましたが、
他にも以下の観点でのチェックが必要です。
- 注文IDが一致するか
- パッケージが自分のアプリのパッケージと一致しているか
- 購入対象のアイテムIDとレシート内のアイテムIDが一致しているか
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/10 08:45
2020/04/10 09:13 編集
2020/04/10 12:00