Подпись кликов для рекламных сетей

Краткий обзор. Добавьте проверку подписи кликов, чтобы избежать ответственности за мошенничество и чтобы мошеннические клики не атрибутировались к вашей рекламной сети. 

О подписи кликов

Используя минимальные технологии, мошенники могут отправлять клики от имени рекламной сети и создавать тысячи или даже миллионы фальшивых кликов, которые отправляются в AppsFlyer. Иногда сами рекламные сети не знают об этой проблеме. 

Чтобы рекламная сеть могла убедиться, что клики, атрибутируемые ей AppsFlyer, действительно исходят из рекламной сети, а не от мошенника, создающего фальшивые клики, рекламные сети должны обозначать клики подписями HMAC-SHA256.

Подпись кликов также предотвращает блокировку трафика рекламной сети вследствие клик-флудинга. Это значит, что если рекламная сеть достигает порога блокировки кликов из-за чрезвычайно высокого уровня клик-флудинга, AppsFlyer перестает записывать и атрибутировать клики до конца дня.

Подписи позволяют AppsFlyer проверять клики и следить за тем, чтобы информация о кликах не была изменена мошенниками.

  • Подтвержденные клики регистрируются и атрибутируются к рекламной сети 
  • Недействительные клики отклоняются и: 
    • Доступны в отчетах Protect360 для рекламных сетей (не для рекламодателей). Узнать больше
    • Без влияния на коэффициент конверсии или порог блокировки кликов в рекламной сети

Интеграция подписи кликов

Сценарий

На схеме ниже показан процесс от первоначальной разработки и базовых тестов до производственных тестов и, наконец, производства. 

Click_signing_integration_flow.png

Процедура

Предварительные условия: Токен API V2.0 от администратора для авторизации API подписи кликов.

Чтобы подписать свои клики:

  1. Сгенерируйте секретный ключ с помощью API для генерирования секретных ключей.
    Практические рекомендации: Создавайте и используйте новый секретный ключ каждые 24 часа со сроком действия 36 часов. 
  2. Разработайте на своих серверах код, который вызывает API для генерирования секретных ключей, берет секретный ключ и генерирует подпись HMAC-SHA256. См. пример кода.
    Вы можете использовать другие API согласно таблице ниже.
  3. Код добавляет следующее к вашим URL-адресам кликов: 
    • Параметр expires, содержащий временную метку Unix (в формате UTC), после которой рекламная сеть не претендует на клик
    • Подпись HMAC-SHA256.
      Пример:
      https://app.appsflyer.com/com.app.id?pid=adnetwork_int&c=my_campaign&clickid=sdkfjasksjskdfj9845weh&af_siteid=12345&expires=1597657118&signature_v2=8fnDVzZP_WRZnv3KNJaREOEfvB5p9oRc_XlKEvUo8gk

 Примечание

Убедитесь, что URL-адрес содержит специальные символы или пробелы в вашей ссылке до создания подписи клика. Генерирование подписи сначала приводит к ошибке верификации.

Создание подписи клика

Чтобы создать подпись клика, необходимо выполнить следующее:

  1. Создайте JSON, используя приведенный ниже список атрибутов и правила JSON
  2. Создайте подпись из этого JSON с помощью HMAC56

Список атрибутов

Для подписи кликов и вовлечения поддерживается следующий список атрибутов.

Порядок Параметр Обязательно / Нет Примечания
1 link_domain Да

Домен из URL-адреса клика Например:

  • app.appsflyer.com
  • myapp.onelink.me
  • click.mycustomdomain.com
2 link_path Да Путь к URL-адресу клика без обратной косой черты впереди.
app-id для одноплатформенных ссылок и template-id для OneLink
3 pid Да  
4 af_prt Нет  
5 af_siteid Да  
6 clickid Да Одноразовый уникальный идентификатор клика
7 expires Да Срок действия клика
8 af_engagement_type Нет  
9 af_click_lookback Нет  
10 af_viewthrough_lookback Нет  
11 af_reengagement_window Нет  
12 is_retargeting Нет  
13 af_ip Нет  
14 advertising_id Нет  
15 oaid Нет  
16 fire_advertising_id Нет  
17 idfa Нет  
18 idfv Нет  

Атрибуты и правила JSON

Порядок и внешний вид атрибутов

  • В JSON должны быть поддерживаемые параметры в URL-адресе вовлечения со значением
  • Атрибуты должны быть перечислены в JSON в порядке, указанном в таблице выше

Пустые атрибуты

  • Атрибуты, перечисленные в JSON, не могут быть пустыми значениями или содержать только пробелы

Структура данных JSON

  • Структура данных JSON должна представлять собой массив атрибутов
    • Каждый атрибут будет иметь формат [«ключ», «значение»]
      Пример: 
      [["key-1","value-1"],["key-2","value-2"]...["key-n","value-n"]]

Экранирование значения атрибута

  • Значения в JSON должны быть записаны в строках нижнего регистра, как определено в стандарте JSON.

Пробелы JSON

  • JSON необходимо сжать. В нем не должно быть пробелов, табуляций или символов новой строки между значениями.

Алгоритм подписи 

  • Используйте HMacSha256 с секретным ключом для создания подписи для JSON
  • Закодируйте подпись с помощью Base64 без заполнения
  • Добавьте подпись к URL-адресу клика с параметром signature_v2

//generate a signature from the click url and encode it with base64 without padding String generatedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(mac.doFinal(jsonString.getBytes()));

Пример подписи

Создание примера подписи

Пример URL-адреса для перехода по ссылке OneLink (для нескольких платформ):

https://yourbrand.onelink.me/qsWL?pid=mediasource_int&advertising_id=12345678-1234-1234-1234-123456789012
&af_ad_type=video&af_adset=MMP&clickid=sdkfjasksjskdfj9845weh&af_siteid=my_site&af_viewthrough_lookback=2h&c=my_campaign
&expires=1689695615

Пример объекта json для подписи (до удаления пробелов):


[
	["link_domain","yourbrand.onelink.me"],
	["link_path","qswl"],
	["pid","mediasource_int"],
	["af_siteid","my_site"],
	["clickid","12345"],
	["expires","1689695615"]
]

Пример объекта json для подписи (после удаления пробелов)


[["link_domain","yourbrand.onelink.me"],["link_path","qswl"],["pid","mediasource_int"],["template-id","qswl"],["af_siteid","my_site"],["clickid","12345"],["expires","1689695615"]]

URL-адрес последнего клика с подписью:

https://yourbrand.onelink.me/qsWL?pid=mediasource_int&advertising_id=12345678-1234-1234-1234-123456789012
&af_ad_type=video&af_adset=MMP&af_siteid=my_site&af_viewthrough_lookback=2h&c=my_campaign
&expires=1689695615
&signature_v2=WIfCmfLAPSsVrBTqCqfihMeLCnbE4dIAlhHF84WsiWA

Примеры кода

signing-supported-params.json


[
  {"index":1, "name":"pid", "mandatory":true},
  {"index":2, "name":"af_prt", "mandatory":false},
  {"index":3, "name":"af_siteid", "mandatory":true},
  {"index":4, "name":"clickid", "mandatory":true},
  {"index":5, "name":"expires", "mandatory":true},
  {"index":6, "name":"af_engagement_type", "mandatory":false},
  {"index":7, "name":"af_click_lookback", "mandatory":false},
  {"index":8, "name":"af_viewthrough_lookback", "mandatory":false},
  {"index":9, "name":"af_reengagement_window", "mandatory":false},
  {"index":10, "name":"is_retargeting", "mandatory":false},
  {"index":11, "name":"af_ip", "mandatory":false},
  {"index":12, "name":"advertising_id", "mandatory":false},
  {"index":13, "name":"oaid", "mandatory":false},
  {"index":14, "name":"fire_advertising_id", "mandatory":false},
  {"index":15, "name":"idfa", "mandatory":false},
  {"index":16, "name":"idfv", "mandatory":false}
]

signature-example.go


package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/url"
	"os"
	"strings"
	"time"
)

type Param struct {
	Name      string
	Mandatory bool
}

func LoadSupportedParams() ([]Param, error) {
	path := "./signing-supported-params.json"
	jsonFile, _ := os.Open(path)
	defer jsonFile.Close()
	byteValue, err := io.ReadAll(jsonFile)
	if err != nil {
		return nil, errors.New("failed loading " + path)
	}
	var params []Param
	_ = json.Unmarshal(byteValue, &params)
	return params, nil
}

func computeHmac256(message, secret string) (res string, errResult error) {
	defer func() {
		if r := recover(); r != nil {
			errResult = r.(error)
			fmt.Println("failed to invoke ComputeHmac256. err: %+v", errResult)
			res = ""
			return
		}
	}()

	key := []byte(secret)
	h := hmac.New(sha256.New, key)
	h.Write([]byte(message))
	return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(h.Sum(nil)), nil
}

// this function accepts a click url, a ttl for the click in seconds, and the list of supported params
// the function:
// 1. adds the expiration to the click based on the provided ttl
// 2. builds a json for the signature
// 3. create an HMAC256 signature
// 4. adds the signature to the click url
func signURLV2(originalURL string, secret string, clickTtlSeconds int64, supportedParams []Param) (signedURL string, err error) {

	//add an expiration to the click
	expires := time.Now().UTC().Unix() + clickTtlSeconds
	urlWithExpired := fmt.Sprintf("%s%s%d", originalURL, "&expires=", expires)

	//parse the url
	parsedURL, err := url.Parse(urlWithExpired)
	if err != nil {
		return "", errors.New("failed parsing URL")
	}

	//build a json from the url
	jsonStr, err := buildJSONFromURLV2(parsedURL, supportedParams)
	if err != nil {
		return "", err
	}

	//create a signature
	signatureV2, err := computeHmac256(jsonStr, secret)
	if err != nil {
		fmt.Println("Failed to computeHMAC256 for url %s. err: %+v", jsonStr, err)
		return "", errors.New("fail to computeHMAC256 for url")
	}

	//add the signature to the url
	signedURL = fmt.Sprintf("%s%s%s", urlWithExpired, "&signature_v2=", signatureV2)

	return signedURL, nil

}

// this function builds a json from a given click url.
// It returns a string representation of the json ready to be signed.
func buildJSONFromURLV2(parsedURL *url.URL, supportedParams []Param) (string, error) {
	//initiate an empty json in the structure [[key-1,val-1],[key-2,val-2]...[key-n,val-n]]
	var jsonData [][2]string

	//add the url host domain to the json
	domain := parsedURL.Host
	param := [2]string{"link_domain", domain}
	jsonData = append(jsonData, param)

	//add the path (app-id or template-id) to the json
	path := parsedURL.Path
	if len(path) > 1 {
		param := [2]string{"link_path", path[1:]}
		jsonData = append(jsonData, param)
	}

	//loop over the ordered list of supported parameters and add them to the json
	for i := 0; i <len(supportedParams); i++ {name := supportedParams[i].Name val := parsedURL.Query().Get(name) if len(val) > 0 {
			param := [2]string{name, val}
			jsonData = append(jsonData, param)
		} else if supportedParams[i].Mandatory {
			return "", errors.New("missing mandatory param: " + name)
		}
	}

	//generate string representation of the json object
	jsonObj, _ := json.Marshal(jsonData)
	return strings.ToLower(string(jsonObj)), nil
}

func main() {

	supportedParams, err := LoadSupportedParams()
	if err != nil {
		fmt.Println("Error: ", err)
		os.Exit(1)
	}

	var secretKey = "tqJU4Qd/eFTEWfqW7KCG9asDO0bmZoFzv8GY3VPSPAM="
	var clickTtlSeconds int64 = 60
	var originalUrl = "https://yourbrand.onelink.me/qsWL?pid=mediasource_int&advertising_id=12345678-1234-1234-1234-123456789012&clickid=1234&af_ad_type=video&af_adset=MMP&af_siteid=my_site&af_viewthrough_lookback=2h&c=my_campaign"

	fmt.Println("Original URL: ", originalUrl)

	signedUrl, err := signURLV2(originalUrl, secretKey, clickTtlSeconds, supportedParams)
	if err != nil {
		fmt.Println("Error: ", err)
		os.Exit(1)
	} else {
		fmt.Println("Signed URL: ", signedUrl)
	}
}

API подписи кликов

AppsFlyer предоставляет API, которые позволяют рекламным сетям управлять процессом подписи кликов и тестировать его. См. список API в таблице ниже и следующие разделы с информацией, необходимой для использования API.

API подписи кликов

Метод API Примечания
Генерирование секретного ключа Сгенерируйте секретные ключи для использования в подписи.
Отмена секретного ключа Аннулируйте взломанные секретные ключи.
Тест Отправляйте отдельные клики для тестирования подписи.
Настройка режима

Настройте режим подписи кликов: 

  • отключено (по умолчанию): проверка подписи клика не выполнена.
  • только отчеты (тестовый режим): AppsFlyer проверяет подписи кликов, но не блокирует клики с недействительными подписями. Рекламная сеть может использовать API отчетов для получения статистики по успешным/неуспешным кликам. Используйте его для тестирования подписи кликов без ущерба для производства и реального трафика.
  • включено: AppsFlyer блокирует клики с недействительными или отсутствующими подписями.
Настройка автоматического выключателя

Настройте режим автоматического выключателя, который защищает рекламную сеть от слишком большого количества заблокированных кликов:

  • включено (по умолчанию): если система Protect360 обнаружит, что слишком большое количество кликов помечено как недействительные, то для защиты рекламной сети от потенциально ошибочной блокировки кликов выполните следующие действия:
    • Настройте режим перехода API в режим «только отчеты».
    • Кроме того, в рекламную сеть отправляется электронное сообщение с уведомлением, подтверждающим правильность настройки API подписи кликов.
  • выключено: Protect360 продолжает блокировать все клики, помеченные как недействительные, даже если процент блокировки необычно высок.
Получение конфигурации

Получайте данные о режиме и идентификаторы активных секретных ключей.

Отчет

Получайте статистику по успешным и неудачным кликам, когда система работает в режиме «только отчеты» или «включено». Используйте данные для тестирования подписи кликов без ущерба для производства и реального трафика.

Исключение приложения Настройте идентификаторы приложений, подлежащих исключению из подписи кликов. 
Удаление исключенного приложения Настройте идентификаторы приложений, которые будут включены в подпись кликов после исключения.

Устаревшие версии

Эти версии не следует использовать, они приведены только для справки

V1 (устарел)

Метод генерирования секретного ключа

Основные сведения о генерировании секретных ключей

Категория Элемент

Описание

Запрос HTTP-метод POST
Путь

https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours>

Заголовок авторизации 
Ответ Результаты Секретный ключ возвращается в формате JSON
  Лимит запросов Максимум 2 активных секретных ключа одновременно

Запрос API

Метод

POST https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours>

Параметры

Параметр

Описание
ttlHours
  • Срок действия секретного ключа, в часах, от 1 до 1440 часов.
  • По умолчанию — 36 часов.

Ответ JSON

Ключ

Описание

secret-key-id

Идентификатор секретного ключа

secret key

Секретный ключ для подписи клика

expiration

Отсчет времени в миллисекундах

Пример генерирования секретного ключа curl и ответ

Запрос curl


curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=36' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'

Ответ JSON

{
	"secret-key-id": "59ad6547-affc-45eb-a6c9-9805f88ee755",
	"secret-key": "zGW6Rhrmb8+vuhHtL/Kp6rW5Ci9PNsjH1J5MGO9SIeg=",
	"expiration": 1610533263
}

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод отмены секретного ключа

Основные сведения об отмене секретных ключей

Категория Элемент

Описание

Запрос HTTP-метод DELETE
Путь

https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id>

Заголовок авторизации 
Ответ Результаты Не указан

Запрос API

Метод

DELETE https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id>

Параметры

Параметр

Описание
secret-id

Идентификатор секретного ключа, который нужно аннулировать

Пример генерирования секретного ключа curl и ответ

Запрос curl


curl --location --request DELETE 'https://hq1.appsflyer.com/api/p360-click-signing/secret/59ad6547-affc-45eb-a6c9-9805f88ee755' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод тестирования

Основные сведения о тестировании

Категория Элемент

Описание

Запрос HTTP-метод POST
Путь

https://hq1.appsflyer.com/api/p360-click-signing/test

Заголовок авторизации 
Ответ Результаты Возвращает в формате JSON

Запрос API

Метод

POST https://hq1.appsflyer.com/api/p360-click-signing/test

Параметры

Параметр

Описание
url

URL-адрес клика (включая подпись) для тестирования

Ответ JSON

Ключ

Описание

test-status

Пройден или не пройден

message

Причина, по которой тест не пройден. Например:

  • Отсутствующая подпись
  • Недопустимая подпись
  • Срок действия истек 

Пример тестирования curl и ответ

Запрос curl


curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/test' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}' \
--header 'Content-Type: application/json' \
--data-raw '{
   "url": "https://app.appsflyer.com/com.app.id?pid=adnetwork_int&c=my_campaign&clickid=sdkfjasksjskdfj9845weh&af_site_id=12345&expires=1597657118&signature=8fnDVzZP_WRZnv3KNJaREOEfvB5p9oRc_XlKEvUo8gk"
}'

Ответ JSON

{
	"test-status":"Passed / Failed",
	"message": "Invalid signature"
}

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод настройки режима

Основные сведения о настройке режима

Категория Элемент

Описание

Запрос HTTP-метод POST
Путь

https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode>

Заголовок авторизации 
Ответ Результаты Возвращает в формате JSON

Запрос API

Метод

POST https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode>

Параметры

Параметр

Описание
mode

Варианты:

  • включена
    Внимание! Установите режим «включено» только после нескольких часов работы в режиме «только отчеты» и проверьте отчеты, чтобы убедиться, что конфигурация верна и все клики прошли проверку подписи.
  • выключено
  • только отчеты

Пример настройки режима curl

Запрос curl


curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/config/mode/report-only' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

400 Bad request

Неверный режим

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод настройки автоматического выключателя

Основные сведения о настройке автоматического выключателя

Категория Элемент

Описание

Запрос HTTP-метод POST
Путь

https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker

Заголовок авторизации 
Ответ Результаты Статус HTTP

Запрос API

Метод

POST https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker

Тело запроса JSON

Параметр

Описание
status
  • включена
  • выключено

Пример настройки автоматического выключателя curl и ответ

Запрос curl


curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/config/circuit-breaker' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
--data-raw '{
"status":"enabled"
}'

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

400 Bad request

Неверный статус

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Получение метода настройки

Основные сведения о получении конфигурации

Категория Элемент

Описание

Запрос HTTP-метод GET
Путь

https://hq1.appsflyer.com/api/p360-click-signing/config

Заголовок авторизации 
Ответ Результаты Возвращает в формате JSON

Запрос API

Метод

GET https://hq1.appsflyer.com/api/p360-click-signing/config

Ответ JSON

Ключ

Описание

mode

Один из следующих:

  • включено
  • выключено
  • только отчеты
circuit-breaker-config

Объект JSON, содержащий статус, один из следующих:

  • включено
  • выключено

active-key-ids

Массив JSON с активными ключами:

  • идентификатор секретного ключа: случайно сгенерированный идентификатор секретного ключа
  • срок действия: отсчет срока действия секретного ключа в миллисекундах

excluded-app-ids

Массив JSON с идентификаторами исключенных приложений

Пример получения конфигурации curl и ответ

Запрос curl


curl --location --request GET 'https://hq1.appsflyer.com/api/p360-click-signing/config' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'

Ответ JSON

{
	"mode": "report-only",
	"active-key-ids": [
		{
			"secret-key-id": "59ad6547-affc-45eb-a6c9-9805f88ee755",
			"expiration": 1610533263
		}
	],
	"excluded-app-ids": [
		"app-id-1", 	"app-id-2"
	]

}

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод отчета

Основные сведения об отчетах

Категория Элемент

Описание

Запрос HTTP-метод GET
Путь

https://hq1.appsflyer.com/api/p360-click-signing/report

Заголовок авторизации 
Ответ Результаты Возвращает в формате CSV

Запрос API

Метод

GET https://hq1.appsflyer.com/api/p360-click-signing/report

Параметры

Параметр

Описание
start-date

Дата и время начала для отчета. Формат: yyyy-mm-ddThh

end-date

Дата и время окончания для отчета. Формат: yyyy-mm-ddThh

Для API требуются как дата начала, так и дата окончания, или ни одна из них. Если дата начала/окончания не указана, в отчете отображаются результаты за последние 24 часа.

Ответ в формате CSV

Столбец

Описание

time

Дата и время кликов. Формат: yyyy-mm-ddThh

total_clicks

Общее количество кликов за отчетный период

valid_clicks

Количество действительных кликов за отчетный период

missing_signature

Количество кликов с отсутствующей подписью за отчетный период

expired_clicks

Количество кликов с истекшим сроком действия за отчетный период

invalid_signature

Количество кликов с недействительной подписью за отчетный период

no_active_secrets

Количество кликов, отклоненных из-за отсутствия активных секретных ключей в системе (обычно когда система работает в режиме «только отчеты»)

Пример тестирования curl и ответ

Запрос curl


curl --location --request GET 'https://hq1.appsflyer.com/api/p360-click-signing/report?start-date=2021-01-07T07&end-date=2021-01-17T12' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}' \

Ответ в формате CSV

time

total_clicks

valid_clicks

missing_signature

expired_clicks

invalid_signature

no_active_signatures

2021-01-17T07

928082156

928082156

 0

 0

 0

 0

2021-01-17T08

923796132

923796132

 0

 0

 0

 0

2021-01-17T09

917541373

917541373

 0

 0

 0

 0

2021-01-17T10

909977064

909977064

 0

 0

 0

 0

2021-01-17T11

965104299

965104299

 0

 0

 0

 0

2021-01-17T12

975134824

975134824

 0

 0

 0

 0

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод исключения приложения

Основные сведения о методе исключения приложения

Категория Элемент

Описание

Запрос HTTP-метод POST
Путь

https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>

Заголовок авторизации 
Ответ Результаты Не указан

Запрос API

Метод

POST https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>

Параметры

Параметр

Описание
app-id

Идентификатор приложения, которое должно быть исключено из проверки подписи клика

Пример исключения приложения curl

Запрос curl


curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/appname.com' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Метод удаления исключенного приложения

Основные сведения о методе удаления исключенного приложения

Категория Элемент

Описание

Запрос HTTP-метод DELETE
Путь

https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>

Заголовок авторизации 
Ответ Результаты Не указан

Запрос API

Метод

DELETE https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>

Параметры

Параметр

Описание
app-id

Идентификатор приложения, которое должно быть удалено из списка приложений, исключенных из проверки подписи клика

Пример удаления исключенного приложения curl

Запрос curl


curl --location --request DELETE 'https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/appname.com' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'

Коды ответа HTTP

Коды ответа

Код 

Сообщение

Примечания

200 OK

 

401 Не авторизовано

Неверный или отсутствующий заголовок авторизации

Пример кода

package sign;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

.
.
.

String clickUrl = "https://app.appsflyer.com/com.app.id?pid=adnetwork_int&c=my_campaign&clickid=sdkfjasksjskdfj9845weh&af_site_id=12345";
String secretKey = "secret_key"; 
int ttlMinutes = 5;


//add expiration to the click URL
long expiration = System.currentTimeMillis() + (60000L * ttlMinutes);
clickUrl += "&expires="+expiration;

//create a SecretKey object from the given key string
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);

//generate a signature from the click url and encode it with base64 without padding
String generatedSignature =     
Base64.getUrlEncoder().withoutPadding().encodeToString(mac.doFinal(clickUrl.getBytes()));

//add the signature to the click URL
String signedClickUrl = clickUrl + "&signature=" + generatedSignature;

Дополнительные сведения

Устранение неполадок

AppsFlyer прекращает проверку подписи кликов и возвращается в режим «только отчеты», когда более 90% кликов за час не проходят проверку подписи.

Это необходимо для защиты вашего бизнеса от потенциальных технических проблем и позволяет найти причину аномалии:

  • Если вы считаете, что подпись работает должным образом, а клики блокируются правильно, отключите автоматический выключатель, используя метод настройки автоматического выключателя.
  • Если вы считаете, что клики блокируются неправильно:
    1. Убедитесь, что у вас есть действительный секретный ключ, проверив настройку подписи кликов с помощью метода получения конфигурации.
    2. Используйте отчет о подписи кликов, чтобы получить дополнительную информацию о заблокированных кликах и изучить источники (идентификаторы агентств/приложений) и причины недействительных кликов.
  • Если вы обнаружили проблему с конкретным приложением из-за нестандартной интеграции, исключите это приложение из проверки подписи кликов с помощью API исключения приложений.
  • Если вы обнаружили проблему с конфигурацией, выполните следующие действия:
    1. Продолжите работу в режиме «только отчеты».
    2. Внесите исправления в процесс подписи кликов со своей стороны.
    3. Проверьте результаты в отчете по подписи кликов и повторно включите проверку подписи кликов, когда увидите, что проверка кликов происходит должным образом.

Вопросы и ответы

В: Как протестировать подпись кликов без ущерба для производства?

О: Есть два способа тестирования подписи кликов:

  1. Используйте API для тестирования. Этот метод полезен на этапе разработки для тестирования подписей одиночных кликов.
  2. Используйте режим «только отчеты». Режим «только отчеты» проверяет подписи кликов и показывает, какие клики можно заблокировать, но не блокирует недействительные клики. Таким образом, вы можете проверить, работает ли подпись кликов без ущерба для реального трафика.

В: В чем разница между токеном API и секретным ключом?

ОТокен API: Используется для авторизации и запуска API подписи кликов. В каждой рекламной сети есть только один. Токен AppsFlyer API V2.0 нужно получить у администратора

Секретный ключ: Используется для генерирования подписи. Используйте метод генерирования секретного ключа для создания секретных ключей. Рекламная сеть отвечает за генерирование новых секретных ключей. См. раздел «Особенности» для получения дополнительной информации.

В: Подпись кликов можно применять только к определенным кампаниям?

О: Нет. Подпись кликов применяется ко всем кликам в рекламной сети. Можно исключить определенные приложения из подписи кликов, но нельзя исключать только определенные кампании.

Особенности

Специфика

Описание

Подпись клика Подпись должна происходить на серверах рекламной сети.
Секретный ключ
  • В рекламных сетях могут быть одновременно активны не более двух секретных ключей.
  • Срок действия каждого секретного ключа ограничен.
  • Клики, подписанные с использованием секретных ключей с истекшим сроком действия, отклоняются.
API отчетов Обновленная статистика по проверке кликов агрегируется ежечасно.