Краткий обзор. Добавьте проверку подписи кликов, чтобы избежать ответственности за мошенничество и чтобы мошеннические клики не атрибутировались к вашей рекламной сети.
О подписи кликов
Используя минимальные технологии, мошенники могут отправлять клики от имени рекламной сети и создавать тысячи или даже миллионы фальшивых кликов, которые отправляются в AppsFlyer. Иногда сами рекламные сети не знают об этой проблеме.
Чтобы рекламная сеть могла убедиться, что клики, атрибутируемые ей AppsFlyer, действительно исходят из рекламной сети, а не от мошенника, создающего фальшивые клики, рекламные сети должны обозначать клики подписями HMAC-SHA256.
Подпись кликов также предотвращает блокировку трафика рекламной сети вследствие клик-флудинга. Это значит, что если рекламная сеть достигает порога блокировки кликов из-за чрезвычайно высокого уровня клик-флудинга, AppsFlyer перестает записывать и атрибутировать клики до конца дня.
Подписи позволяют AppsFlyer проверять клики и следить за тем, чтобы информация о кликах не была изменена мошенниками.
- Подтвержденные клики регистрируются и атрибутируются к рекламной сети
-
Недействительные клики отклоняются и:
- Доступны в отчетах Protect360 для рекламных сетей (не для рекламодателей). Узнать больше
- Без влияния на коэффициент конверсии или порог блокировки кликов в рекламной сети
Интеграция подписи кликов
Сценарий
На схеме ниже показан процесс от первоначальной разработки и базовых тестов до производственных тестов и, наконец, производства.
Процедура
Предварительные условия: Токен API V2.0 от администратора для авторизации API подписи кликов.
Чтобы подписать свои клики:
-
Сгенерируйте секретный ключ с помощью API для генерирования секретных ключей.
Практические рекомендации: Создавайте и используйте новый секретный ключ каждые 24 часа со сроком действия 36 часов. -
Разработайте на своих серверах код, который вызывает API для генерирования секретных ключей, берет секретный ключ и генерирует подпись HMAC-SHA256. См. пример кода.
Вы можете использовать другие API согласно таблице ниже. - Код добавляет следующее к вашим 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-адрес содержит специальные символы или пробелы в вашей ссылке до создания подписи клика. Генерирование подписи сначала приводит к ошибке верификации.
Создание подписи клика
Чтобы создать подпись клика, необходимо выполнить следующее:
- Создайте JSON, используя приведенный ниже список атрибутов и правила JSON
- Создайте подпись из этого JSON с помощью HMAC56
Список атрибутов
Для подписи кликов и вовлечения поддерживается следующий список атрибутов.
Порядок | Параметр | Обязательно / Нет | Примечания |
---|---|---|---|
1 | link_domain | Да |
Домен из URL-адреса клика Например:
|
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, ¶ms)
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 | Примечания |
---|---|
Генерирование секретного ключа | Сгенерируйте секретные ключи для использования в подписи. |
Отмена секретного ключа | Аннулируйте взломанные секретные ключи. |
Тест | Отправляйте отдельные клики для тестирования подписи. |
Настройка режима |
Настройте режим подписи кликов:
|
Настройка автоматического выключателя |
Настройте режим автоматического выключателя, который защищает рекламную сеть от слишком большого количества заблокированных кликов:
|
Получение конфигурации |
Получайте данные о режиме и идентификаторы активных секретных ключей. |
Отчет |
Получайте статистику по успешным и неудачным кликам, когда система работает в режиме «только отчеты» или «включено». Используйте данные для тестирования подписи кликов без ущерба для производства и реального трафика. |
Исключение приложения | Настройте идентификаторы приложений, подлежащих исключению из подписи кликов. |
Удаление исключенного приложения | Настройте идентификаторы приложений, которые будут включены в подпись кликов после исключения. |
Устаревшие версии
Эти версии не следует использовать, они приведены только для справки
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 |
|
Ответ 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% кликов за час не проходят проверку подписи.
Это необходимо для защиты вашего бизнеса от потенциальных технических проблем и позволяет найти причину аномалии:
- Если вы считаете, что подпись работает должным образом, а клики блокируются правильно, отключите автоматический выключатель, используя метод настройки автоматического выключателя.
-
Если вы считаете, что клики блокируются неправильно:
- Убедитесь, что у вас есть действительный секретный ключ, проверив настройку подписи кликов с помощью метода получения конфигурации.
- Используйте отчет о подписи кликов, чтобы получить дополнительную информацию о заблокированных кликах и изучить источники (идентификаторы агентств/приложений) и причины недействительных кликов.
- Если вы обнаружили проблему с конкретным приложением из-за нестандартной интеграции, исключите это приложение из проверки подписи кликов с помощью API исключения приложений.
-
Если вы обнаружили проблему с конфигурацией, выполните следующие действия:
- Продолжите работу в режиме «только отчеты».
- Внесите исправления в процесс подписи кликов со своей стороны.
- Проверьте результаты в отчете по подписи кликов и повторно включите проверку подписи кликов, когда увидите, что проверка кликов происходит должным образом.
Вопросы и ответы
В: Как протестировать подпись кликов без ущерба для производства? О: Есть два способа тестирования подписи кликов:
|
В: В чем разница между токеном API и секретным ключом? О: Токен API: Используется для авторизации и запуска API подписи кликов. В каждой рекламной сети есть только один. Токен AppsFlyer API V2.0 нужно получить у администратора Секретный ключ: Используется для генерирования подписи. Используйте метод генерирования секретного ключа для создания секретных ключей. Рекламная сеть отвечает за генерирование новых секретных ключей. См. раздел «Особенности» для получения дополнительной информации. |
В: Подпись кликов можно применять только к определенным кампаниям? О: Нет. Подпись кликов применяется ко всем кликам в рекламной сети. Можно исключить определенные приложения из подписи кликов, но нельзя исключать только определенные кампании. |
Особенности
Специфика |
Описание |
---|---|
Подпись клика | Подпись должна происходить на серверах рекламной сети. |
Секретный ключ |
|
API отчетов | Обновленная статистика по проверке кликов агрегируется ежечасно. |