メインコンテンツへスキップ

概要

リワード広告のサーバーサイド検証(SSV, Server-Side Verification) を使用すると、ユーザーが広告の視聴を完了した際に、Adropサーバーが指定したサーバーURLへコールバックを送信します。サーバー側で報酬付与を直接検証することで、不正を防止できます。 コールバックペイロードはAPIキーで暗号化されているため、URLが外部に露出してもAPIキーを持つ主体のみが内容を復号できます。

設定方法

1

APIキーの準備

SSVコールバックのペイロード復号に使用するAPIキーを先に発行してください。プロジェクトにアクティブなAPIキーが1つ以上ある場合にSSVを登録できます。発行方法は連携 & APIキードキュメントを参照してください。
2

SSVの登録

コンソールの**[管理]** > [連携] > リワード広告SSVセクションで**[+ リワード広告SSVを登録]**ボタンを押します。
項目説明
URL報酬完了時に呼び出すサーバーURL。https://で始まる必要があります。
APIキーコールバックペイロードの復号に使用するAPIキー。デフォルトは最新のアクティブキー。
3

SDKでuserId / customDataを渡す

SDKでsetServerSideVerificationOptions()を使ってuserIdcustomDataを設定すると、その値がコールバックペイロードに含まれてサーバーへ送信されます。各プラットフォームの設定方法は以下のドキュメントを参照してください。
登録・編集時はHTTPS URLのみ許可され、プライベートIP(localhost、10.x、172.16〜31.x、192.168.x、169.254.x)はブロックされます。

リクエスト仕様

Adropサーバーは次のようにコールバックを送信します。
項目
MethodPOST
Content-Typeapplication/json
リトライ最大3回(0ms / 1s / 2sの間隔)
タイムアウト1回あたり5秒
成功条件HTTP 200レスポンス
リクエストボディはAES-256-GCMで暗号化されて送信されます。
{
  "encrypted": "<ivHex>:<tagHex>:<ciphertextHex>"
}
各区間はコロン(:)で区切られたhex文字列です。復号後に得られる平文JSONの仕様は以下のとおりです。
フィールド説明
projectstringAdropプロジェクトID
appstringAdropアプリID
unitstringAdrop広告ユニットID
adNetworkstring広告ネットワーク識別子
adUnitstring広告ネットワーク内のユニット識別子
userIdstring?SDKで設定したユーザー識別子
customDatastring?SDKで設定したカスタムデータ
rewardItemstring報酬アイテム名
rewardAmountnumber報酬数量
transactionIdstringトランザクションID(重複防止用の一意な値)
timestampnumberコールバック発生時刻(Unix ms)
transactionIdは一意な値です。サーバーですでに処理したtransactionIdを再度受信した場合は、重複報酬を付与しないよう冪等(idempotent)に処理することを推奨します。

ペイロードの復号

AES-256-GCMの鍵は、APIキー原文をSHA-256でハッシュした32バイトです。

Node.js

import { createDecipheriv, createHash } from 'node:crypto'
import express from 'express'

function decryptSsvPayload(encrypted, apiKey) {
  const [ivHex, tagHex, ciphertextHex] = encrypted.split(':')
  const key = createHash('sha256').update(apiKey).digest() // 32バイト

  const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(ivHex, 'hex'))
  decipher.setAuthTag(Buffer.from(tagHex, 'hex'))

  const plaintext = Buffer.concat([
    decipher.update(Buffer.from(ciphertextHex, 'hex')),
    decipher.final()
  ]).toString('utf8')

  return JSON.parse(plaintext)
}

const app = express()

app.post('/ssv-callback', express.json(), (req, res) => {
  const payload = decryptSsvPayload(req.body.encrypted, process.env.ADROP_API_KEY)
  // payload.userId, payload.customData, payload.rewardAmountなどで報酬付与処理
  res.sendStatus(200)
})

Python

import hashlib
import json
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def decrypt_ssv_payload(encrypted: str, api_key: str) -> dict:
    iv_hex, tag_hex, ciphertext_hex = encrypted.split(':')
    key = hashlib.sha256(api_key.encode()).digest()  # 32バイト

    aesgcm = AESGCM(key)
    # AESGCMはciphertext + tagが連結された形式を想定
    plaintext = aesgcm.decrypt(
        bytes.fromhex(iv_hex),
        bytes.fromhex(ciphertext_hex) + bytes.fromhex(tag_hex),
        None
    )
    return json.loads(plaintext)
SSVコールバックは、URLが外部に露出してもAdrop APIキーを持つ主体のみが復号できるよう設計されています。SSVに連携されたAPIキーが漏洩した場合は、サーバー側で直ちに廃棄し、連携メニューで新しいAPIキーに差し替えてください。

編集と削除

登録済みのSSVは、リワード広告SSVセクション右側のメニューから編集・削除できます。
  • 編集: URLまたは連携するAPIキーを変更します。
  • 削除: コールバックは呼び出されなくなります。削除後もSDKのuserId / customDataはAdrop内部のSSVログに保存されます。

関連ドキュメント

連携 & APIキー

APIキーの発行・管理・廃棄方法

レポートAPI

キャンペーン成果およびバックフィル収益データをAPIで照会する方法