質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1990閲覧

【Unity】アプリ内課金でサーバー検証する際の手順とは?(Android)

nakamu

総合スコア82

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/04/10 06:13

1、下記で取得したレシートをサーバーにそのまま投げる
2、サーバー側でレシートの中にあるsignatureをUnityのライセンスキーから作ったPemファイルで復号化
3、復号化されたsignatureを?・・・

signatureを何と照合するんでしょうか?

C#

1 // 決済成功時 2 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) 3 { 4 Debug.Log("レシート"); 5 Debug.Log(args.purchasedProduct.receipt); 6 if (String.Equals(args.purchasedProduct.definition.id, kProductIDNonConsumable, StringComparison.Ordinal)) 7 { 8 // UnityIAP上のID 9 Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id)); 10 } 11 else 12 { 13 Debug.Log("PurchaseProcessingResult Else"); 14 } 15 return PurchaseProcessingResult.Pending; 16 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「アプリ内課金 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 06:50

編集2020/04/10 07:09
mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamu

2020/04/10 08:45

なるほどライセンスキーとレシート署名のデコードで一致するかどうか! 1 注文IDが一致するか 2 パッケージが自分のアプリのパッケージと一致しているか 3 購入対象のアイテムIDとレシート内のアイテムIDが一致しているか こちらの追加のチェック項目iOSとかぶる部分あるかと思うんですが、 1の項目の検証の場合、Androidですと "TransactionID"=>"GPA.XXXX-XXXX-XXXX-XXXXX"と"json"=> "..."の中にあるorderIdが一致しているかどうかをチェックするという事で間違いないでしょうか? また、3の項目の検証の場合、フロント側でレシートと一緒に追加で対象のアイテムIDを送っておく必要があるということでしょうか?
mingos

2020/04/10 09:13 編集

一般的にチェックするべき項目として挙げましたが、 Androidの場合、レシートの中に完全な情報が入っている事と、 1購入1レシートとなっているので、レシート内のJSONから対象のアイテムIDを見れば 良いという判断はあると思います。 自分の場合はアイテムIDとレシートをサーバにパラメータとして 送って一致するかどうかを念の為チェックしていますが、不要かもしれません。
nakamu

2020/04/10 12:00

確かにAndroidは1購入1レシートで済みますもんね。 iOSも実装するのでmingosさんと同様にアイテムIDも一緒に送ろうと思います! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問