AppsFlyerのS2SイベントAPIを使って、サーバー側でアプリイベントを処理する

## やりたいこと
アカウント登録や購入処理など、サーバー側で行われる処理をAppsFlyerで扱えるようにする。

### S2SイベントAPIについて

サーバー側で処理するアプリイベントについては、**サーバー側でAppsFlyerへイベント情報を送信**することで、アプリイベントと同様に扱えるようになります。
そこで必要になるのが**S2SイベントAPI**です。公式ドキュメントは[こちら。](https://support.appsflyer.com/hc/ja/articles/207034486 "AppsFlyer S2S")
こちらについての記事があまり無かったので、今回書いてみることにしました。サーバーサイドの言語はPHPを想定します。

:::note warn
S2SイベントAPIの利用にはAppsFlyerの**Enterpriseプラン**である必要があります。
:::

## やること
サーバー側で、購入処理などイベントが発生した際に、S2SイベントAPIにイベント情報をPOSTします。
公式ドキュメントの以下図「S2S」部分を実装します。
![処理フロー図](https://support.appsflyer.com/hc/article_attachments/360007947177/S2S_us-en.png "処理フロー図")

以下の開発者向けページに、APIのパラメータなど詳しく書かれています。

https://dev.appsflyer.com/hc/reference/post_s2s_inappevent

また上記サイトでは、フォームに値を入力して「Try It!」ボタンを押すと、送信の検証ができます。大変便利ですね。
~~※ただしサイト言語を日本語すると、なぜか認証パラメータのキーが日本語になり送信失敗するので、利用する場合は英語にしましょう。~~
（2023/03/22 10:20追記）
こちら修正されていました！

### AppsFlyerへPOSTする
早速実装してみます。
以下はPHPでcurlを使用してS2SイベントAPIに「purchase_item」というイベントをPOSTするコードになります。
※認証キーなど各種値は、無効なサンプル値です。

```PHP:Post2AF.php
$postData = [
    'appsflyer_id' => '1415211453000-6513894',        // AppsFlyerID
    'eventName' => 'purchase_item',                   // Event Name
    'eventValue' => [                                 // Event Value
        'af_revenue' => 1000,    // 金額
        'af_currency' => 'JPY',  // 通貨コード
        'item_id' => 5,          // 任意のカスタム値
    ]
];

$appId = 'id123456789';  // アプリ識別子
$authenticationKey = 'authenticationKeyValue'; // 認証キー
$postDataJson = json_encode($postData);
$url = 'https://api2.appsflyer.com/inappevent/' . $appId;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'accept: application/json',
    'authentication: ' . $authenticationKey,
    'content-type: application/json'
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postDataJson);

curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

echo $responseCode; // 正常ならば200が出力される
```
正常終了後、AppsFlyerに反映されるまでしばらくかかります。15〜30分ほど待てば、AppsFlyer管理画面の「アプリイベント」に「purchase_item」が追加されます。
また、「ローデータ出力」からCSV出力すれば、eventValueで指定した値が記載されていることと思います。

### 送信パラメータについて
* __認証キー__
APIを呼び出す際に必要な認証情報です。AppsFlyer管理画面の「アプリ設定」ページの「DEVキー」に表示されてる英数字の乱数のような値です。

* __アプリ識別子__
アプリを識別するための一意のIDです。
AppsFlyer管理画面の「アプリ設定」ページURLの「appId」パラメータの値として表示されます。
https://hq1.appsflyer.com/apps/settings?appId=[ここの値]
Androidアプリの場合は、アプリのバンドルIDがアプリ識別子になります。iOSアプリの場合は、「id123456789」のような値がアプリ識別子になります。

* __AppsFlyerID__
アプリの初回起動時にAppsFlyerから付与される一意の端末識別子です。
「1415211453000-6513894」といった値です。
アプリ側で取得し、サーバー側に送信する必要があります。

* __Event Name__
アプリ内で発生するイベントの名前を指します。

* __Event Value__
イベントの値を配列で指定します。
任意の値の指定もできますが、特定のキーとバリューを設定することで、イベントの種類に応じた詳細な情報を記録することもできます。例えば、af_revenueなどを指定すると金額として計上してくれます（詳細は[こちら](https://dev.appsflyer.com/hc/reference/post_s2s_inappevent "AppsFlyer S2S Dev")）。
値の指定がない場合（とりあえず該当APIが叩かれた回数を測りたいだけなど）は空欄にします。

上記が送信の際に必須となる項目となります。
他にもいろいろ追加できますので、[開発者向けページ](https://dev.appsflyer.com/hc/reference/post_s2s_inappevent "AppsFlyer S2S Dev")を参考に、必要であれば適宜追加してください。

## 最後に
いかがでしたでしょうか。
サーバー側の処理があるアプリでは、S2SイベントAPIを利用することで、より柔軟な分析が行えます。
AppsFlyerには他にも分析のためのさまざまな手段が用意されています。これらを有効活用して、アプリの利用促進に繋げましょう。

## 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを募集しております。

私は元々、自社開発企業にて開発を行っていましたが、自分の可能性を広げるべく、受託開発メインのイーディーエーに転職を決意しました。
イーディーエーに入社を決めた理由は、以下の3点です。
・多種多様な案件がある
・様々なことに挑戦できる
・かつフルリモートで勤務できる

様々な案件に挑戦し、スキルを身に付けたい。そしてフルリモートで仕事以外の時間も充実させたいという方は、ぜひ採用情報ページに足を運んでいただければと思います。
https://eda-inc.jp/recruit/
みなさまからのご応募をお待ちしております。