# トランザクションイベントの記録

> Track in-app purchases and failed transactions to measure revenue and monitor transaction health.

`transaction` イベントを使用して、正常に行われたアプリ内課金を追跡します。このイベントには、1 回のトランザクションで購入された複数のアイテムや通貨をキャプチャするための配列や特別な `Product` オブジェクトが含まれます。トランザクションイベントの構造体には、`productsSpent` および `productsReceived` を記録するための複数の `Product` オブジェクトが格納されます。

失敗したトランザクションは専用の `transactionFailed` イベントで追跡されます。これには、購入トランザクションに関する詳細や、その失敗の理由が含まれます。これは、ダッシュボードの収益指標には影響しません。

SDK または REST API を介して `transaction` および `transactionFailed` イベントを手動で送信できます。[Unity IAP](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/manual/Overview.html) バージョン 4.2 以上を使用している場合、これらのイベントは自動的に送信されます。

**重要**: IAP プラグインも使用しているときにトランザクションを Analytics に手動で送信すると、それらが 2 回カウントされ、かさ上げされた収益がレポートされます。

> **Warning:**
>
> **重要**: Apple および Google の **サンドボックス購入** から受信したトランザクションイベントは、**Analytics** > **SQL Data Explorer** (SQL データエクスプローラー) ツールで確認できますが、ダッシュボードの Revenue (収益) レポートには影響しません。

### イベントの手動送信##record-automatically-using-the-iap-plug-in

`transaction` および `transactionFailed` イベントは、ダッシュボードの収益 KPI の下でイベントを処理および追跡するために照合する必要のある事前定義済みスキーマを持つ標準イベントです。これらのスキーマについては、[イベントマネージャー](event-manager) のドキュメントを参照してください。

## 正常な購入のレポート##send-events-manually

以下の例では、`transaction` イベントは、実際のドルを使用してゲーム内通貨と複数のアイテムが入った宝箱を購入するプレイヤーを記録します。このイベントとパラメーターの詳細については、[イベントマネージャー](event-manager) を参照してください。

以下のコードを使用して `transaction` イベントを作成します。

```cs
public void SendTransaction()
{
	var productsReceived = new Product()
	{
		Items = new List<Item>()
		{
			new Item(){ ItemName = "Golden Battle Axe"      , ItemType = "Weapon", ItemAmount = 1},
			new Item(){ ItemName = "Flaming Sword"          , ItemType = "Weapon", ItemAmount = 1},
			new Item(){ ItemName = "Jewel Encrusted Shield" , ItemType = "Armour", ItemAmount = 1}
		},
		VirtualCurrencies = new List<VirtualCurrency>()
		{
			new VirtualCurrency()
			{
				VirtualCurrencyName = "Gold",
				VirtualCurrencyType = "PREMIUM",
				VirtualCurrencyAmount = 100
			}
		}
	};

	var productsSpent = new Product()
	{
		RealCurrency = new RealCurrency()
		{
			RealCurrencyType = "USD",
			RealCurrencyAmount = 499
		}
	};

	AnalyticsService.Instance.Transaction(new TransactionParameters()
	{
		ProductsReceived = productsReceived,
		ProductsSpent = productsSpent,
		TransactionID = "100000576198248",
		TransactionName = "IAP - A Large Treasure Chest",
		TransactionType = TransactionType.PURCHASE,
		TransactionServer = TransactionServer.APPLE,
		TransactionReceipt = "ewok9Ja81............991KS=="
	});
}
```

## 失敗した購入のレポート##validate-transactions

`transactionFailed` イベントは、失敗したアプリ内課金をキャプチャします。購入は、ネットワーク障害、支払いの失敗、デバイス設定など、いくつかの理由で失敗する可能性があります。

以下の例では、`transactionFailed` イベントは、プレイヤーが実際のドルを使用してゲーム内通貨と複数のアイテムが入った宝箱を購入しようとしたが、ユーザーが購入をキャンセルしたことを記録します。このイベントとパラメーターの詳細については、[イベントマネージャー](event-manager) のドキュメントを参照してください。

以下のコードを使用して `transactionFailed` イベントを作成します。

```cs
public void SendTransactionFailed()
{
	var productsReceived = new Product()
	{
		items = new List<Item>()
		{
			new Item(){ ItemName = "Golden Battle Axe"      , ItemType = "Weapon", ItemAmount = 1},
			new Item(){ ItemName = "Flaming Sword"          , ItemType = "Weapon", ItemAmount = 1},
			new Item(){ ItemName = "Jewel Encrusted Shield" , ItemType = "Armour", ItemAmount = 1}
		},
		VirtualCurrencies = new List<VirtualCurrency>()
		{
			new VirtualCurrency()
			{
				VirtualCurrencyName = "Gold",
				VirtualCurrencyType = "PREMIUM",
				VirtualCurrencyAmount = 100
			}
		}
	};

	var productsSpent = new Product()
	{
		RealCurrency = new RealCurrency()
		{
			RealCurrencyType = "USD",
			RealCurrencyAmount = 499
		}
	};

	AnalyticsService.Instance.TransactionFailed(new TransactionFailedParameters 
	{
		FailureReason = "cancelled",
		ProductsReceived = productsReceived,
		ProductsSpent = productsSpent,
		TransactionID = "100000576198248",
		TransactionName = "IAP - A Large Treasure Chest",
		TransactionType = TransactionType.PURCHASE,
		TransactionServer = TransactionServer.APPLE
	});
}
```

## IAP プラグインを使用した自動的な記録

[Unity IAP](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/manual/Overview.html) で作成されたトランザクションは、イベントを手動で送信したときと同じ `transaction` イベントスキーマを使用して Analytics に自動的に転送されます。トランザクションイベントは、Analytics で使用可能な収益 KPI に影響します。失敗したトランザクションは、`transactionFailed` イベントの下で IAP プラグインによって自動的に追跡されます。

## トランザクションの検証

トランザクション検証では、トランザクションが合法な購入かどうかを確認します。

プラットフォームでは、ダッシュボードに表示されている収益が真正な収益であり、ハッキングまたは改造されたゲームの結果ではないことを確認するために、iOS および Android ストアでトランザクションレシート検証を実施できます。

トランザクション検証を使用するには、以下を行う必要があります。

* 関連するストアの検証キーを提供して、Analytics プラットフォームがストアのレシートを検証できるようにします。これは、[ダッシュボード](https://dashboard.unity3d.com/) の **Project Settings** (プロジェクト設定) で行うことができます。
* レシート検証パラメーターを `transaction` イベントに追加して、トランザクションを検証する必要があることをプラットフォームに通知します (これは、ストアによって異なります)。

トランザクションイベントには、IAP レシート検証サービスで使用される `revenueValidated` パラメーターが含まれます。これは、収益検証を使用している場合には自動的に設定されます。使用可能な値は以下のとおりです。

| 値 | 結果                                         |
| - | ------------------------------------------ |
| 0 | このトランザクションは、収益検証サービスを使用しておらず、収益チャートに含まれます。 |
| 1 | このトランザクションは検証に合格し、収益チャートに含まれます。            |
| 2 | このトランザクションは検証に不合格で、収益チャートに含まれません。          |
| 3 | このトランザクションはエラーのため検証できず、収益チャートに含まれません。      |

### Apple ストア##report-successful-purchases

Analytics では、iOS トランザクションに対してレシート検証が自動的に試行されます。レシートを検証するには以下を iOS トランザクションに追加します。

```plaintext
"transactionServer": "APPLE",
"transactionID":"100000576198248",
"transactionReceipt": "ewok9Ja81............991KS=="
```

`transactionReceipt ` は、Apple から返された BASE 64 エンコードレシートデータです。[Apple レシート検証](https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html) の詳細については、Apple 開発者ウェブサイトを参照してください。

### Google Play##report-failed-purchases

Google 公開鍵を提供する必要があります。Google キーを更新するには、**Project Settings** (プロジェクト設定) > **In-app purchase** (アプリ内課金) (IAP) 設定に移動し、Google ライセンスキーを設定します。

レシートを検証するには以下を Android トランザクションへのトランザクションイベントに追加します。

```plaintext
"transactionServer":"GOOGLE",
"transactionReceipt":"{
	\"orderId\":\"GPA.1234-5678-9012-34567\",
	\"packageName\":\"com.example.app\",
	\"productId\":\"exampleSku\",
	\"purchaseTime\":1345678900000,
	\"purchaseState\":0,
	\"developerPayload\":\"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ\",
	\"purchaseToken\":\"opaque-token-up-to-1000-characters\"
}", 
"transactionReceiptSignature":"rNvoHwiBdLSW+........VncbYVJ61fmfsQ=="
```

**重要**: トランザクションレシートと秘密鍵はレシートを検証するために `transactionReceiptSignature` を生成するため、Google によって提供され、ネストされた JSON オブジェクトではなく文字列として渡される正確な文字列である必要があります。
