De un vistazo: Agrega la validación de firma a los clics para evitar responsabilidades por fraude y para que los clics fraudulentos no se atribuyan a tu red de publicidad.
Acerca de la firma de clics
Con un mínimo de tecnología, los estafadores pueden enviar clics en nombre de una red de publicidad y crear miles, o incluso millones, de clics falsos que se envían a AppsFlyer. A veces, las propias redes de publicidad no son conscientes del problema.
Para que una red de publicidad se asegure de que los clics que AppsFlyer le atribuye proceden realmente de la red de publicidad y no de un estafador que crea clics falsos, las redes de publicidad deben firmar sus clics con firmas HMAC-SHA256.
La firma de clics también evita que el tráfico de la red de publicidad se bloquee debido a inundaciones de clics. Esto significa que si una red publicidad alcanza el umbral de bloqueo de clics debido a un nivel extremo de inundación de clics, AppsFlyer deja de registrar y atribuir sus clics durante el resto del día .
Las firmas permiten que AppsFlyer valide los clics y asegurarse de que la información de clics no haya sido manipulada por estafadores.
- Los clics validados se registran y se atribuyen a la red de publicidad
-
Los clics invalidados se rechazan y:
- Están disponibles en los reportes de Protect360 para las redes de publicidad (no para los anunciantes). Saber más
- No afectan la tasa de conversión ni el umbral de bloqueo de clics de la red de publicidad
Integración de la firma clic
Flujo
El siguiente gráfico describe el flujo desde el desarrollo inicial y las pruebas básicas hasta las pruebas de producción y, por último, hasta la producción.
Procedimiento
Requisito previo: Token de la API V2.0 del administrador para autorizar la API de firma de clics.
Para firmar tus clics:
-
Genera una clave secreta con la API Generar clave secreta.
¡Práctica recomendada!/span> Genera y utiliza una nueva clave secreta cada 24 horas, con una caducidad de 36 horas. -
Desarrolla el código en tus servidores que llame a la API Generar clave secreta, tome la clave secreta y genere una firma HMAC-SHA256. Ver ejemplo de código.
Puedes utilizar las demás API tal y como se describe en la tabla siguiente. - El código añade lo siguiente a las URL de tus clics:
- Un parámetro de caducidad que contiene una marca de tiempo Unix (en UTC) después de la cual la red de publicidad no reclama el clic.
- La firma HMAC-SHA256.
Ejemplo: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
Nota
Asegúrate de que cualquier codificación URL de caracteres especiales o espacios en tu enlace se produce antes de que se genere la firma de clic. Generar primero la firma provoca un fallo en la verificación.
Crear una firma de clic
Para crear una firma de clic debes:
- Construir un JSON utilizando la lista de atributos y reglas JSON que se indican a continuación
- Crear la firma a partir de este JSON utilizando HMAC56
Lista de atributos
La siguiente lista de atributos es compatible con la firma por clic y engagement.
Orden | Parámetro | Obligatorio | Notas |
---|---|---|---|
1 | link_domain | Sí |
El dominio de la URL de clic Por ejemplo:
|
2 | link_path | Sí | La ruta de la URL del clic sin incluir una barra invertida inicial. app-id para enlaces de plataforma única o template-id para OneLink |
3 | pid | Sí | |
4 | af_prt | No | |
5 | af_siteid | Sí | |
6 | clickid | Sí | Un identificador único de un solo uso del clic |
7 | Caduca | Sí | pulsa en caducidad |
8 | af_engagement_type | No | |
9 | af_click_lookback | No | |
10 | af_viewthrough_lookback | No | |
11 | af_reengagement_window | No | |
12 | is_retargeting | No | |
13 | af_ip | No | |
14 | advertising_id | No | |
15 | oaid | No | |
16 | fire_advertising_id | No | |
17 | idfa | No | |
18 | idfv | No |
Reglas de atributos y JSON
Orden y apariencia de los atributos
- Los parámetros admitidos en la URL de engagement con un valor deben estar en el JSON
- Los atributos deben figurar en el JSON en el orden indicado en la tabla anterior
Atributos vacíos
- Los atributos listados en el JSON no pueden ser valores vacíos o contener sólo espacios
Estructura de datos JSON
- La estructura de datos JSON debe ser una matriz de atributos
- Cada atributo tendrá el formato ["key", "value"].
Ejemplo:[["key-1","value-1"],["key-2","value-2"]...["key-n","value-n"]]
- Cada atributo tendrá el formato ["key", "value"].
Escape de valores de atributos
- Los valores del JSON deben escribirse en minúsculas, tal y como se define en el estándar JSON.
Espacios JSON
- El JSON debe estar compactado. No debe contener espacios en blanco, tabuladores ni caracteres de nueva línea entre los valores.
Algoritmo de firma
- Utiliza HmacSHA256 con la clave secreta para crear la firma para el JSON
- Codificar la firma con Base64 sin relleno
- Añadir la firma a la URL de clic con un parámetro 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()));
Ejemplo de firma
Construir un ejemplo de firma
Ejemplo de URL de clic en OneLink (multiplataforma):
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
Ejemplo de objeto json para la firma (antes de eliminar los espacios en blanco):
[
["link_domain","yourbrand.onelink.me"],
["link_path","qswl"],
["pid","mediasource_int"],
["af_siteid","my_site"],
["clickid","12345"],
["expires","1689695615"]
]
Ejemplo de objeto json para la firma (tras eliminar los espacios en blanco)
[["link_domain","yourbrand.onelink.me"],["link_path","qswl"],["pid","mediasource_int"],["template-id","qswl"],["af_siteid","my_site"],["clickid","12345"],["expires","1689695615"]]
URL del clic final con la firma:
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
Ejemplos de código
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 de firma por clic
AppsFlyer proporciona API que permiten a las redes de publicidad gestionar y probar el proceso de firma de clics. Consulta la lista de API en la tabla siguiente y las secciones que siguen con la información necesaria para utilizar la API.
API de firma por clic
Método API | Observaciones |
---|---|
Generar clave secreta | Generar las claves secretas que se utilizarán en la firma. |
Revocar la clave secreta | Anular las claves secretas comprometidas. |
Prueba | Enviar clics individuales para probar la firma. |
Configurar modo |
Configurar el modo de firma de clic:
|
Configurar disyuntor |
Configura el modo del disyuntor que protege la red de publicidad de tener demasiados clics bloqueados:
|
Obtener configuración |
Obtén el modo y los ID de las claves secretas activas. |
Reporte |
Obtén las estadísticas sobre clics correctos y fallidos cuando el sistema esté en modo de sólo reporte o activado. Utilízalo para probar la firma de clics sin afectar a la producción ni al tráfico real. |
Excluir aplicación | Configura los ID de aplicación que se excluirán de la firma por clic. |
Eliminar la aplicación excluida | Configura los ID de aplicación para que se incluyan en la firma por clic después de haber sido excluidos. |
Versiones heredadas
Estas versiones no deben utilizarse y se enumeran únicamente a título de referencia
V1: heredado
Método de generación de clave secreta
Generar clave secreta básica
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | POST |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours> |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | La clave secreta se devuelve en un JSON |
Límite de solicitud | Máximo de 2 claves secretas activas a la vez |
Solicitud API
Método
POST https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours>
Parámetros
Parámetro |
Descripción |
---|---|
ttlHours |
|
Respuesta JSON
Clave |
Descripción |
---|---|
secret-key-id |
Un ID para la clave secreta |
Clave secreta |
La clave secreta para la firma clic |
caducidad |
Tiempo en milisegundos |
Generar clave secreta curl ejemplo y respuesta
Solicitud de 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.}'
Respuesta JSON
{
"secret-key-id": "59ad6547-affc-45eb-a6c9-9805f88ee755",
"secret-key": "zGW6Rhrmb8+vuhHtL/Kp6rW5Ci9PNsjH1J5MGO9SIeg=",
"expiration": 1610533263
}
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Método de revocación de la clave secreta
Revocar clave secreta básica
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | DELETE |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id> |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Vacío |
Solicitud API
Método
DELETE https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id>
Parámetros
Parámetro |
Descripción |
---|---|
secret-id |
ID de la clave secreta que se va a revocar |
Generar clave secreta curl ejemplo y respuesta
Solicitud de 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.}'
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Método de prueba
Conceptos básicos
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | POST |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/test |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Devuelve en un JSON |
Solicitud API
Método
POST https://hq1.appsflyer.com/api/p360-click-signing/test
Parámetros
Parámetro |
Descripción |
---|---|
URL |
La URL del clic (incluida la firma) que se va a probar |
Respuesta JSON
Clave |
Descripción |
---|---|
test-status |
Aprobado o fallido |
mensaje |
Motivo del fallo de la prueba. Por ejemplo,
|
Ejemplo de curl de prueba y respuesta
Solicitud de 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"
}'
Respuesta JSON
{
"test-status":"Passed / Failed",
"message": "Invalid signature"
}
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Configurar método de modo
Configuración básica del modo
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | POST |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode> |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Devuelve en un JSON |
Solicitud API
Método
POST https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode>
Parámetros
Parámetro |
Descripción |
---|---|
Modo |
Opciones:
|
Ejemplo de configuración del modo curl
Solicitud de 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.}'
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
400 | Solicitud incorrecta |
Modo no válido |
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Configurar el método del disyuntor
Configuración básica de disyuntores
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | POST |
Ruta |
https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Estado HTTP |
Solicitud API
Método
POST https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker
Cuerpo de la solicitud JSON
Parámetro |
Descripción |
---|---|
Estado |
|
Configurar disyuntor curl ejemplo y respuesta
Solicitud de 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"
}'
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
400 | Solicitud incorrecta |
Estado no válido |
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Obtener método de configuración
Obtener la configuración básica
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | GET |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/config |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Devuelve en un JSON |
Solicitud API
Método
GET https://hq1.appsflyer.com/api/p360-click-signing/config
Respuesta JSON
Clave |
Descripción |
---|---|
Modo |
Uno de:
|
circuit-breaker-config |
Un objeto JSON que contiene el estado, uno de:
|
active-key-ids |
Una matriz JSON que contiene las claves activas:
|
excluded-app-ids |
Una matriz JSON con ID de aplicaciones excluidas |
Obtener configuración curl ejemplo y respuesta
Solicitud de 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.}'
Respuesta 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"
]
}
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Método de reporte
Informe básico
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | GET |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/report |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Devuelve en un CSV |
Solicitud API
Método
GET https://hq1.appsflyer.com/api/p360-click-signing/report
Parámetros
Parámetro |
Descripción |
---|---|
start_date |
Fecha y hora de inicio del reporte. Formato: aaaa-mm-dd |
Fecha de finalización |
Fecha y hora de finalización del reporte. Formato: aaaa-mm-dd |
La API requiere tanto start-date como end-date o ninguna de las dos. Si no se indican las fechas de inicio y fin, el reporte mostrará los resultados de las últimas 24 horas. |
Respuesta CSV
Columna |
Descripción |
---|---|
time |
Fecha y hora de los clics. Formato aaaa-mm-dd |
Total de clics |
Número total de clics durante el periodo del reporte |
valid_clicks |
Número de clics válidos durante el periodo del reporte |
missing_signature |
Número de clics sin firma durante el periodo del reporte |
expired_clicks |
Número de clics caducados durante el periodo del reporte |
invalid_signature |
Número de clics con firma no validada durante el periodo del reporte |
no_active_secrets |
Número de clics rechazados porque no hay claves secretas activas en el sistema (normalmente cuando el sistema está en modo de sólo reporte). |
Ejemplo de curl de prueba y respuesta
Solicitud de 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.}' \
Respuesta CSV
time |
Total de clics |
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 |
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Excluir método de aplicación
Conceptos básicos del método de exclusión de aplicaciones
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | POST |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id> |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Vacío |
Solicitud API
Método
POST https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>
Parámetros
Parámetro |
Descripción |
---|---|
app-id |
ID de aplicación que debe excluirse de la validación de firma de clics |
Ejemplo de exclusión de aplicación curl
Solicitud de 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.}'
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Eliminar el método de aplicaciones excluidas
Eliminar método básico para aplicaciones excluidas
Categoría | Elemento |
Descripción |
---|---|---|
Solicitud | Método HTTP | DELETE |
Ruta |
https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id> |
|
Encabezado de autorización |
|
|
Respuesta | Resultados | Vacío |
Solicitud API
Método
DELETE https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>
Parámetros
Parámetro |
Descripción |
---|---|
app-id |
ID de aplicación que debe eliminarse de la lista de aplicaciones excluidas de la validación de firma por clic |
Ejemplo de eliminación de curl de aplicación excluida
Solicitud de 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.}'
Códigos de respuesta HTTP
Códigos de respuesta
Código |
Mensaje |
Observaciones |
---|---|---|
200 | OK |
|
401 | No autorizado |
Encabezado de autorización no válido o ausente |
Ejemplo de código
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;
Información adicional
Resolución de problemas
AppsFlyer detiene la validación de firmas de clics y vuelve al modo de sólo reporte cuandomás del 90% de los clics en una hora no superan la validación de firmas.
Esto sirve para proteger a tu empresa de un posible problema técnico y te permite encontrar la causa de la anomalía:
- Si compruebas que la firma funciona como se espera y los clics se bloquean correctamente, desactiva el disyuntor mediante el método de configuración del disyuntor.
-
Si observas que los clics se bloquean incorrectamente:
- Asegúrate de que tienes una clave secreta válida comprobando la configuración de firma de clics mediante el método obtener configuración.
- Utiliza el reporte de firma de clics para obtener más información sobre los clics bloqueados e investigar las fuentes (agencia/app-iDs) y los motivos de los clics no válidos.
- Si encuentras un problema con una aplicación específica debido a una integración no estándar, excluye esta aplicación de la validación de firma de clics utilizando la API de excluir aplicación API.
-
Si encuentras un problema con tu configuración:
- Continúa funcionando en modo sólo reporte.
- Arregla el proceso de firma de clics por tu parte.
- Comprueba los resultados en el reporte de firma de clics yvuelve a activar la validación de firma de clics cuando veas que los clics se están validando como se esperaba.
Preguntas frecuentes
Pregunta: ¿Cómo podemos probar la firma clic sin afectar a la producción? Respuesta: Hay dos formas de probar la firma por clic:
|
Pregunta: ¿Cuál es la diferencia entre un token de API y una clave secreta? Respuesta: Token de API: se utiliza para autorizar y ejecutar la API de firma de clics. Sólo hay uno por red de publicidad. El token API V2.0 token de AppsFlyer debe obtenerse del administrador. Clave secreta: Se utiliza para generar la firma. Utiliza el método de generación de claves secretas para crear claves secretas. La red de publicidad se encarga de generar nuevas claves secretas. Consulta la sección de rasgos para más información. |
Pregunta: ¿Podemos aplicar la firma por clic sólo a determinadas campañas? Respuesta: No. La firma de clics se aplica a todos los clics procedentes de una red de publicidad. Puedes excluir determinadas aplicaciones de la firma de clics, pero no puedes excluir sólo determinadas campañas. |
Características
Característica |
Descripción |
---|---|
Haz clic en la firma | La firma debe producirse en los servidores de la red de publicidad. |
Clave secreta |
|
Reporte de API | Las estadísticas actualizadas de la validez de los clics se agregan cada hora. |