Firma de clics para redes de publicidad

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. 

Click_signing_integration_flow.png

Procedimiento

Requisito previo: Token de la API V2.0 del administrador para autorizar la API de firma de clics.

Para firmar tus clics:

  1. 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. 
  2. 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.
  3. 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:

  1. Construir un JSON utilizando la lista de atributos y reglas JSON que se indican a continuación
  2. 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

El dominio de la URL de clic Por ejemplo:

  • app.appsflyer.com
  • myapp.onelink.me
  • click.mycustomdomain.com
2 link_path 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  
4 af_prt No  
5 af_siteid  
6 clickid Un identificador único de un solo uso del clic
7 Caduca 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"]]

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, &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 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: 

  • desactivado (por defecto): No se realiza ninguna validación de la firma del clic.
  • sólo reporte (modo de prueba): AppsFlyer valida las firmas de los clics, pero no bloquea los clics con firmas no válidas. La red de publicidad puede utilizar la API de reportes para obtener estadísticas sobre clics acertados/fallidos. Utilízalo para probar la firma de clics sin afectar a la producción ni al tráfico real.
  • habilitado: AppsFlyer bloquea los clics con firmas no válidas o ausentes.
Configurar disyuntor

Configura el modo del disyuntor que protege la red de publicidad de tener demasiados clics bloqueados:

  • activado (por defecto): Si el sistema Protect360 detecta que demasiados clics se marcan como no válidos, entonces, para proteger a la red de publicidad de tener clics potencialmente bloqueados de forma incorrecta:
    • La API de modo de configuración cambia a sólo reporte.
    • Y se envía una alerta por correo electrónico a la red de publicidad para verificar que la API de firma de clics está correctamente configurada.
  • desactivado: Protect360 sigue bloqueando todos los clics marcados como no válidos, incluso cuando el porcentaje de bloqueo es inusualmente alto.
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
  • Tiempo de vida para la clave secreta, en horas, de 1-1440 horas.
  • El valor predeterminado es de 36 horas.

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,

  • Ausencia de firma
  • Firma inválida
  • Caducado

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:

  • habilitada
    Nota: establece el modo "activado sólo después de ejecutar el modo de sólo reportes durante unas horas y comprueba tus reportes para asegurarte de que la configuración es correcta y de que todos los clics han pasado la validación de firmas.
  • deshabilitada
  • sólo reporte

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 
  • habilitada
  • deshabilitada

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:

  • habilitada
  • deshabilitada
  • sólo reporte
circuit-breaker-config

Un objeto JSON que contiene el estado, uno de:

  • habilitada
  • desactivado

active-key-ids

Una matriz JSON que contiene las claves activas:

  • secret-key-id: ID generado aleatoriamente de la clave secreta
  • caducidad: tiempo en milisegundos de la clave secreta

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:
    1. 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.
    2. 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:
    1. Continúa funcionando en modo sólo reporte.
    2. Arregla el proceso de firma de clics por tu parte.
    3. 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:

  1. Utiliza la API de prueba. Este método es útil durante la fase de desarrollo, para probar las firmas de clics individuales.
  2. Utiliza el modo de sólo reporte. El modo de sólo reporte verifica las firmas de los clics de producción y te muestra lo que se bloquearía, pero no bloquea los clics no válidos. Por lo tanto, puedes probar que la firma de clics funciona sin afectar al tráfico real.

Pregunta: ¿Cuál es la diferencia entre un token de API y una clave secreta?

RespuestaToken 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
  • Las redes de publicidad pueden tener un máximo de dos claves secretas activas simultáneamente.
  • Cada clave secreta tiene una caducidad.
  • Los clics firmados con claves secretas caducadas son rechazados.
Reporte de API Las estadísticas actualizadas de la validez de los clics se agregan cada hora.