In-App Purchase Verification (購入検証)

MobileAppTracking™ (MAT) 内の収益レポート機能には、アプリ内購入一つ一つを独立して検証する、高度なレシート検証メカニズムが含まれています。本機能は不正購入による収入を破棄し、当社ダッシュボード内で見られる収益額が最も正確になるよう徹底させます。

Apple iTunes または Google Play 経由でのアプリ内購入は、MAT プラットフォームではイベントとして測定されます。アプリ内購入の検証プロセスは、当社 SDK がアプリ内購入のレシート ID (Android)/レシートデータ (iOS) を収集することで機能しており、後に SDK が当社プラットフォームにこれらのアプリ内購入の購入検証ステータスが保留中に設定されていることを通知します。その後プラットフォームはストア API をクエリして、アプリ内購入が検証されたかどうかを確認します。検証されたアプリ内購入のみが承認済みイベントとして測定され、それに従い収益が加算されます。

検証プロセス

検証プロセスは、イベントの測定および関連付けの後に行われる分離および独立したプロセスです。このため、検証プロセスにより測定および関連付けプロセスが停滞/遅延することは決してありません。

当社 SDK は Apple iTunes および Google Play からのレシート ID (Android)/レシートデータ (iOS) の収集をサポートするよう設定されているため、実装するとアプリ内購入イベント測定時これらの値が含まれます。購入に関するイベント測定のリクエストにレシート ID (Android)/レシートデータ (iOS) が含まれている場合、プラットフォームは Google Play または Apple iTunes との検証を自動的に試行します。

In_App_Purchase_Verification_1_Verification_Process_kzc

プラットフォームがレシート ID のあるイベントを測定すると、イベントの購入検証ステータスが 「Pending (保留)」に設定されます。イベント測定の 60 分後に、検証プロセスのキューに入れられます。購入が成功であったか否かを確認するため、検証プロセスにはレシート ID (Android)/レシートデータ (iOS) が、およびクエリーには Google Play または Apple iTunes API が必要です。

購入が成功であった場合、イベントの購入検証ステータスが 「Verified (検証済み)」
に設定され、集約された収益が適宜加算されます。購入が成功でなかった場合、イベントの購入検証ステータスが 「Failed (失敗)」に設定され、収益は加算されません。また本プロセスは、レシート ID を基に送信される重複購入をチェックしブロックします。

注記:iOS アプリ内で自動更新可能デジタル購読を提供している場合、provide your iTunes Connect Shared Secret in the MAT platform(iTunes Connect Shared Secret を MAT プラットフォームに入力) して、MAT が検証に利用できるようにします。自動更新可能購読により、ユーザーはアプリ内コンテンツを購入できるようになり、当該購入はユーザーが購読をキャンセルしない限り期間終了時に自動更新されます。

MAT iOS SDK による iTunes アプリ内購入

v3.9 以降、MAT iOS SDK は成功したアプリ内購入 (IAP) イベントの自動購入イベント測定をサポートしています。本機能は、以下の設定方法でコールして有効化できます:

[Tune automateIapEventMeasurement:YES];

IAP イベント測定を自動化したら、重複イベント測定を回避するため、成功 IAP トランザクションの明示的 measureEvent 、コールを追加すべきではありません。古い sdk バージョンから 3.9 にアップグレードし、かつ IAP イベント測定を自動化する場合は、成功 IAP トランザクションに対応する measureEvent コールを必ず削除してください。

代わりに IAP 購入イベントを手動で測定する場合MATEvent インスタンスを作成し、IAP トランザクションに関連するそのプロパティを設定してから measureEvent をコールすることが可能です。
以下のコードスニペットには、アプリ内購入 (IAP) トランザクションレシートが含まれているサンプルの手動 measureEvent コールが示されています:

SKProduct *product = ...; // product being purchased with the current transaction
SKPaymentTransaction *transaction = ...; // current in-app-purchase transaction
TuneEvent *event = [TuneEvent eventWithName:@"purchase"];
event.refId = transaction.transactionIdentifier;
event.revenue = revenue;
event.currencyCode = currencyCode;
event.receipt = receiptData;
event.transactionState = transaction.transactionState;
TuneEventItem *item = [TuneEventItem eventItemWithName:@"apple" unitPrice:1.5 quantity:2];
event.eventItems = @[item];
[Tune measureEvent:event];

古いバージョン 2.5-3.8.x を使用している場合、自動 IAP イベント測定は利用できません。IAP 購入イベントを測定するため、アプリ内購入が行われたときに iTunes から受領したトランザクションレシートを含めることができるオーバーロード measureAction メソッドをコール可能です。
一般的な IAP イベント測定の詳細なコードサンプルをこちらで閲覧可能です:Measure Apple iTunes In-App Purchases as Events (Apple iTunes アプリ内購入をイベントとして測定する)。

iOS のアプリ内購入を検証する場合、検証済み購入には購入検証コード 0 が与えられます。 ただし購入が検証されていない場合は多くの理由が考えられるため、以下の表に列記します。

iOS コード 購入検証ステータス 説明 検証された収益 コンバージョンステータス
-3 無効なバンドル 有効なレシートだが異なるサイトのバンドル ID を含む。 いいえ 却下済み
-2 不明なエラー 当社試行が起こったいくつかのエラー。 いいえ 却下済み
-1 レシートなし 検証するレシートなし。 いいえ 承認済み
0 検証済み こ ’ のレシートの検証に成功しました。 はい 承認済み
21000 判読できない JSON オブジェクト アプリストアが貴社提供の JSON オブジェクトを判読できませんでした。 いいえ 却下済み
21002 変形されたレシートデータ レシート-データ プロパティ内のデータが変形されていました。 いいえ 却下済み
21003 検証に失敗 レシートを認証できませんでした。 いいえ 却下済み
21004 無効な共有シークレット 入力された共有シークレットが、アカウントのファイルにある共有シークレットと一致しません。 いいえ 却下済み
21005 レシートサーバー利用不可 レシートサーバーは現在利用できません。 いいえ 却下済み
21006 IAP 購読期限切れ このレシートは有効ですが購読が期限切れです。このステータスコードがサーバーに返される場合、応答の一環として、レシートデータもデコードされ返されます。 いいえ 却下済み
21007 サンドボックスレシートがプロダクションへ 本レシートはサンドボックスレシートですが、検証のためプロダクションサービスへ送信されました。 いいえ 却下済み
21008 プロダクションレシートがサンドボックスへ 本レシートはプロダクションレシートですが、検証のためサンドボックスサービスへ送信されました。 いいえ 却下済み

 

Android SDK による Google Play アプリ内購入

Google Play によるアプリ内購入イベントを測定するには、当社 Android SDK 2.6+ 使用する必要があります。Google Playのアプリ内請求システムでイベントを結び付けるには、instructions (指示書) 経由で請求システムに結び付けられているサービスを実装します。

以下のコードスニペットには、レシート ID (購入データ) のあるサンプル measureEvent コールが表示されています。onActivityResult メソッドで、”BUY_INTENT” インテントを受領した後に当社 measureEvent 機能をコールし、purchaseData および dataSignature 値を構文解析します:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == 1001) {
     int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
     String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
     String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
 
     if (resultCode == RESULT_OK) {
        mobileAppTracker.measureEvent(new MATEvent("purchase")
                                         .withRevenue(0.99)
                                         .withCurrencyCode("USD")
                                         .withReceipt(purchaseData, dataSignature));
     }
   }
}

重要:IAP レシートデータを利用してアプリ内購入を検証するためには、Google 公開キーを MAT アカウントに設定する必要があります。Google 公開キーは、Securing Your Application section (「アプリケーションを確保する」セクション) で提供される Android 開発者向け文書の指示に従い、見つけることが可能です。Google 公開キーを入手したら、この値をモバイルアプリの詳細ページ (Mobile Apps (モバイルアプリ) > Your Mobile App (あなたのモバイルアプリ) > Details Edit (詳細編集) > Google Public Key (Google 公開キー) にペーストします。

IAP レシートデータが当社に渡されると、プラットフォームが当該イベントについて購入検証を実行します。

Android のアプリ内購入を検証する場合、検証済み購入には購入検証コード 0 が与えられます。Android のその他ステータスコードが見られる場合は、いくつかの異なるエラーが起こったと考えられます。

Android コード 購入検証ステータス 説明 検証された収益 コンバージョンステータス
-3 OpenSSL エラー OpenSSL コールによるエラー。 いいえ 却下済み
-2 不明なエラー 当社試行が起こったいくつかのエラー。 いいえ 却下済み
-1 レシートなし 検証するレシートなし。 いいえ 承認済み
0 検証済み このレシートの検証に成功しました。 はい 承認済み
1 検証に失敗 データまたは署名は検証されませんでした。 いいえ 却下済み
2 無効なシークレットキー シークレットキーが変形されています。 いいえ 却下済み

どのアプリ内イベントを測定すべきかに関する詳細は、In-App Events (アプリ内イベント):Which Ones You Should be Measuring and Why (測定すべきものとその理由) をお読みください。