Cliquez sur Signature pour les réseaux publicitaires

En bref : Ajoutez une validation de signature aux clics pour éviter les responsabilités liées à la fraude et pour que les clics frauduleux ne soient pas attribués à votre réseau publicitaire. 

À propos de la signature par clic

Avec une technologie minimale, les fraudeurs peuvent envoyer des clics au nom d'un réseau publicitaire et créer des milliers, voire des millions, de faux clics qui sont envoyés à AppsFlyer. Parfois, les réseaux publicitaires eux-mêmes ne sont pas conscients du problème. 

Pour qu'un réseau publicitaire puisse s'assurer que les clics attribués par AppsFlyer proviennent authentiquement de leur propre réseau et non d'un fraudeur générant de faux clics, il est essentiel que les réseaux publicitaires signent leurs clics à l'aide de signaturesHMAC-SHA256.

La signature des clics empêche également le réseau publicitaire d'être bloqué en raison d'un afflux massif de clics. Ce qui veut dire quesi un réseau publicitaire atteint le seuil de blocage des clics en raison d'un afflux massif de clics, AppsFlyer cesse d'enregistrer et d'attribuer leurs clics pour le reste de la journée.

Les signatures permettent à AppsFlyer de valider les clics et de garantir que les informations de clic n'ont pas été manipulées par des fraudeurs.

  • Les clics validés sont enregistrés et attribués au réseau publicitaire 
  • Les clics invalidés sont rejetés et : 
    • Sont mis à disposition dans les rapports Protect360 pour les réseaux publicitaires (pas les annonceurs). En savoir plus
    • N'impactent pas le taux de conversion ni le seuil de blocage des clics du réseau publicitaire.

Cliquez sur l'intégration de la signature

Flux

Le tableau suivant décrit le flux depuis le développement initial et les tests de base jusqu'aux tests de production, et enfin, à la production. 

Click_signing_integration_flow.png

Marche à suivre

Conditions préalables : Jeton API V2.0 de l'administrateur pour autoriser l'API de signature par clic.

Pour signer vos clics:

  1. Générez une clé secrète avec l'API Générer une clé secrète.
    Bonne pratique : générer et utiliser une nouvelle clé secrète toutes les 24 heures, avec une expiration de 36 heures. 
  2. Développez du code sur vos serveurs qui appelle l’API Générer une clé secrète, prend la clé secrète et génère une signature HMAC-SHA256. Voir l'exemple de code.
    Vous pouvez utiliser les autres API comme décrit dans le tableau suivant.
  3. Le code ajoute les éléments suivants à vos URL de clic : 
    • Un paramètre d'expiration qui contient un horodatage Unix (en UTC) après lequel le réseau publicitaire ne réclame pas le clic.
    • La signature HMAC-SHA256.
      Exemple :
      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

 Remarque

Assurez-vous que tout codage d'URL de caractères spéciaux ou d'espaces dans votre lien se produit avant la génération de la signature de clic. La génération de la signature entraîne d’abord un échec de vérification.

Créer une signature de clic

Pour créer une signature de clic, vous devez :

  1. Créez un JSON en utilisant la liste des attributs et des règles JSON ci-dessous
  2. Créez la signature à partir de ce JSON en utilisant HMAC56

Liste des attributs

La liste d'attributs suivante est prise en charge pour la signature par clic et engagement.

Commande Paramètre Obligatoire Remarques
1 link_domain Oui

Le domaine de l'URL du clic, par exemple :

  • app.appsflyer.com
  • myapp.onelink.me
  • click.mycustomdomain.com
2 link_path Oui Le chemin de l'URL de clic n'inclut pas de barre oblique inverse au début.
app-id pour les liens de plateforme uniques ou template-id pour OneLink
3 pid Oui  
4 af_prt Non  
5 af_siteid Oui  
6 clickid Oui Un identifiant à usage unique du clic
7 expires Oui Expiration du clic
8 af_engagement_type Non  
9 af_click_lookback Non  
10 af_viewthrough_lookback Non  
11 af_reengagement_window Non  
12 is_retargeting Non  
13 af_ip Non  
14 advertising_id Non  
15 OAID Non  
16 fire_advertising_id Non  
17 idfa Non  
18 idfv Non  

Attributs et règles JSON

Ordre et apparence des attributs

  • Les paramètres pris en charge dans l'URL d'engagement avec une valeur doivent être au format JSON
  • Les attributs doivent être répertoriés dans le JSON dans l'ordre indiqué dans le tableau ci-dessus

Attributs vides

  • Les attributs répertoriés dans le JSON ne peuvent pas être des valeurs vides ou contenir uniquement des espaces

Structure de données JSON

  • La structure de données JSON doit être un tableau d'attributs
    • Chaque attribut sera au format ["clé", "valeur"]
      Exemple : 
      [["key-1","value-1"],["key-2","value-2"]...["key-n","value-n"]]

Échappement de la valeur d'attribut

  • Les valeurs dans le JSON doivent être écrites dans des chaînes minuscules comme défini dans la norme JSON.

Espaces JSON

  • Le JSON doit être compacté. Il ne doit contenir aucun espace, aucune tabulation ni aucun caractère de nouvelle ligne entre les valeurs.

Algorithme de signature 

  • Utilisez HmacSHA256 avec la clé secrète pour créer la signature du JSON
  • Encoder la signature avec Base64 sans remplissage
  • Ajoutez la signature à l'URL de clic avec un paramètre 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()));

Exemple de signature

Créer un exemple de signature

Exemple d'URL de clic OneLink (multiplateforme) :

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

Exemple d'objet json pour la signature (avant de supprimer les espaces vides) :


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

Exemple d'objet json pour la signature (après avoir supprimé les espaces vides)


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

URL du clic final avec la signature :

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

Exemples de code

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 signature de clics

AppsFlyer fournit des API qui permettent aux réseaux publicitaires de gérer et de tester le processus de signature des clics. Consultez la liste des API dans le tableau ci-dessous, ainsi que les sections qui suivent avec les informations nécessaires à l'utilisation de l'API.

API de signature de clics

Méthode API Remarques
Générer une clé secrète Générer des clés secrètes à utiliser dans la signature.
Révoquer la clé secrète Annuler les clés secrètes compromises.
Test Envoyez des clics simples pour tester la signature.
Mode de configuration

Configurer le mode de signature par clic : 

  • désactivé (par défaut) : Aucune validation de signature de clic n'est effectuée.
  • rapport uniquement (mode test) : AppsFlyer valide les signatures de clics, mais ne bloque pas les clics avec des signatures non valides. Le réseau publicitaire peut utiliser le RAPI de rapport électronique pour obtenir des statistiques sur les clics réussis/échoués. Utilisez ceci pour tester la signature des clics sans impacter la production et le trafic réel.
  •  Activé AppsFlyer bloque les clics avec des signatures non valides ou manquantes.
Configurer le disjoncteur

Configurez le mode du disjoncteur qui protège le réseau publicitaire contre un trop grand nombre de clics bloqués :

  • activé (par défaut) : si le système Protect360 détecte que trop de clics sont marqués comme non valides, protégez le réseau publicitaire contre des clics potentiellement bloqués par erreur :
    • Configurez les modifications de l'API en mode rapport uniquement.
    • Une alerte par e-mail est envoyée au réseau publicitaire pour vérifier que l'API de signature de clic est correctement configurée.
  • désactivé : Protect360 continue de bloquer tous les clics marqués comme non valides, même lorsque le pourcentage de blocage est inhabituellement élevé.
Obtenir la configuration

Obtenez le mode et les identifiants des clés secrètes actives.

Rapport

Obtenez des statistiques sur les clics réussis et échoués lorsque le système est en mode rapport uniquement ou activé . Utilisez ceci pour tester la signature des clics sans impacter la production et le trafic réel.

Exclure l'app Configurez les ID d’app à exclure de la signature par clic. 
Supprimer l'application exclue Configurez les ID d’app à inclure dans la signature par clic après avoir été exclus.

Versions héritées

Ces versions ne doivent pas être utilisées et sont répertoriées à titre de référence uniquement

V1 - Héritée

Méthode de génération de clé secrète

Les bases de la génération de clés secrètes

Catégorie Élément

Description

Requête Méthode HTTP POST
Chemin

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

En-tête d'autorisation 
Réponse Résultats La clé secrète est renvoyée dans un JSON
  Limite de demande Maximum de 2 clés secrètes actives à la fois

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
ttlHours
  • Temps de vie pour la clé secrète, en heures, de 1 à 1440 heures.
  • La valeur par défaut est de 36 heures

Réponse JSON

Clé

Description

secret-key-id

Un ID pour la clé secrète

Clé secrète

La clé secrète de la signature du clic

expiration

Expiration en millisecondes

Générer un exemple et une réponse de clé secrète curl

Requête 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.}'

Réponse JSON

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

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Méthode de révocation de la clé secrète

Révoquer les bases de la clé secrète

Catégorie Élément

Description

Requête Méthode HTTP DELETE
Chemin

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

En-tête d'autorisation 
Réponse Résultats Vide

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
secret-id

L'ID de la clé secrète à révoquer

Générer un exemple et une réponse de clé secrète curl

Requête 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.}'

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Méthode d'essai

Notions de base sur les tests

Catégorie Élément

Description

Requête Méthode HTTP POST
Chemin

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

En-tête d'autorisation 
Réponse Résultats Renvoie dans un JSON

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
url

L'URL de clic (y compris la signature) pour test

Réponse JSON

Clé

Description

test-status

Soit réussi, soit échoué

message

Raison de l'échec du test Exemple :

  • Signature manquante
  • Signature invalide
  • Expiré

Exemple de test curl et réponse

Requête 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"
}'

Réponse JSON

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

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Méthode du mode de configuration

Notions de base sur le mode de configuration

Catégorie Élément

Description

Requête Méthode HTTP POST
Chemin

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

En-tête d'autorisation 
Réponse Résultats Renvoie dans un JSON

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
mode

Options :

  • activé
    Attention ! Activez le mode uniquement après avoir exécuté le mode rapport uniquement pendant quelques heures et vérifié vos rapports pour vous assurer que la configuration est correcte et que tous les clics ont passé la validation de signature.
  • désactivé
  • rapport uniquement

Exemple de configuration du mode curl

Requête 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.}'

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

400 Demande incorrecte

Mode invalide

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Configurer la méthode du disjoncteur

Configurer les bases du disjoncteur

Catégorie Élément

Description

Requête Méthode HTTP POST
Chemin

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

En-tête d'autorisation 
Réponse Résultats Statut HTTP

Demande d'API

Méthode

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

Corps de la requête JSON

Paramètre

Description
Statut
  • activé
  • désactivé

Exemple de configuration et de réponse du disjoncteur curl

Requête 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"
}'

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

400 Demande incorrecte

Statut invalide

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Obtenir la méthode de configuration

Obtenir les bases de la configuration

Catégorie Élément

Description

Requête Méthode HTTP GET
Chemin

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

En-tête d'autorisation 
Réponse Résultats Renvoie dans un JSON

Demande d'API

Méthode

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

Réponse JSON

Clé

Description

mode

Parmi :

  • activé
  • désactivé
  • rapport uniquement
circuit-breaker-config

Un objet JSON contenant le statut, l'un des suivants :

  • activé
  • désactivé

active-key-ids

Un tableau JSON contenant des clés actives :

  • secret-key-id: ID généré aléatoirement de la clé secrète
  • expiration: expiration en millisecondes de la clé secrète

excluded-app-ids

Un tableau JSON avec des ID d’app exclus

Obtenir l'exemple de configuration curl et la réponse

Requête 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.}'

Réponse 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"
	]

}

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Méthode de rapport

Notions de base sur les rapports

Catégorie Élément

Description

Requête Méthode HTTP GET
Chemin

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

En-tête d'autorisation 
Réponse Résultats Renvoyé dans un fichier CSV

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
start-date

Date et heure de début du rapport. Format : aaaa-mm-jjThh

end-date

Date et heure de fin du rapport. Format : aaaa-mm-jjThh

L'API requiert soit une date de début et une date de fin, soit aucune des deux. Si la date de début/fin n'est pas fournie, le rapport affiche les résultats des dernières 24 heures.

Réponse CSV

Colonne

Description

time

Date et heure des clics. Format aaaa-mm-jjThh

total_clicks

Nombre total de clics au cours de la période de référence

valid_clicks

Nombre de clics valides au cours de la période de rapport

missing_signature

Nombre de clics sans signatures au cours de la période de référence

expired_clicks

Nombre de clics expirés au cours de la période de rapport

invalid_signature

Nombre de clics avec une signature non valide au cours de la période de rapport

no_active_secrets

Nombre de clics rejetés car il n'y a pas de clés secrètes actives dans le système (généralement lorsque le système est en mode rapport uniquement)

Exemple de test curl et réponse

Requête 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.}' \

Réponse 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

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Méthode d'exclusion de l'application

Principes de base de la méthode d'exclusion de l'application

Catégorie Élément

Description

Requête Méthode HTTP POST
Chemin

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

En-tête d'autorisation 
Réponse Résultats Vide

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
app-id

ID d'application à exclure de la validation de signature par clic

Exemple d'exclusion d'application curl

Requête 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.}'

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Supprimer la méthode d’exclusion d’app

Supprimer les bases de la méthode d’exclusion d’app

Catégorie Élément

Description

Requête Méthode HTTP DELETE
Chemin

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

En-tête d'autorisation 
Réponse Résultats Vide

Demande d'API

Méthode

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

Paramètres

Paramètre

Description
app-id

ID d'app à supprimer de la liste des applications exclues de la validation de signature par clic

Supprimer l'exemple d'application curl exclue

Requête 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.}'

Codes de réponse HTTP

Codes de réponse

Code 

Message

Remarques

200 OK

 

401 Non autorisé(e)

En-tête d'autorisation non valide ou manquant

Exemple de code

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;

Informations supplémentaires

Dépannage

AppsFlyer revient au mode rapport uniquement et cesse la validation des signatures des clics lorsqueplus de 90 % des clics échouent à la validation de signature en une heure.

Cela permet de protéger votre entreprise d'un éventuel problème technique et de trouver la cause de l'anomalie :

  • Si vous constatez que la signature fonctionne comme prévu et que les clics sont correctement bloqués, désactivez le disjoncteur à l'aide de la méthode de configuration du disjoncteur.
  • Si vous constatez que des clics sont bloqués par erreur :
    1. Assurez-vous que vous disposez d'une clé secrète valide en vérifiant la configuration de signature par clic à l'aide de laméthode d'obtention de la configuration.
    2. Utilisez le rapport de signature de clic pour obtenir plus d'informations sur les clics bloqués et enquêter sur les sources (identifiants d'agence/d'application) et les raisons des clics non valides.
  • Si vous rencontrez un problème avec une application spécifique en raison d'une intégration non standard, excluez cette application de la validation de signature par clic à l'aide de l'API d'exclusion d'application.
  • Si vous rencontrez un problème avec votre configuration :
    1. Continuez à utiliser le mode rapport uniquement.
    2. Corrigez le processus de signature par clic de votre côté.
    3. Vérifiez les résultats dans le rapport de signature des clics et réactivez la validation de la signature des clics lorsque vous constatez que les clics sont validés comme prévu.

FAQ

Q : Comment tester la signature par clic sans impacter la production ?

R : Il existe deux manières de tester la signature par clic :

  1. Utiliser l'API de test. Cette méthode est utile pendant la phase de développement, pour tester les signatures de clics simples.
  2. Utiliser le mode rapport uniquement. Le mode Rapport uniquement vérifie les signatures sur les clics de production et vous montre ce qui serait bloqué, mais ne bloque pas les clics non valides. Vous pouvez donc tester que la signature par clic fonctionne sans impacter le trafic réel.

Q : Quelle est la différence entre un jeton API et une clé secrète ?

R : Jeton d’API : utilisé pour autoriser et exécuter l'API de signature par clic. Il n'y en a qu'un par réseau publicitaire. Le jeton AppsFlyer API V2.0 doit être obtenu auprès de l'administrateur

Clé secrète : utilisée pour générer la signature. Utilisez le méthode de génération de clé secrète pour créer des clés secrètes. Le réseau publicitaire est responsable de la génération de nouvelles clés secrètes. Voir le section des caractéristiques pour plus d'informations.

Q : Pouvons-nous appliquer la signature par clic uniquement à certaines campagnes ?

R : Non. La signature de clic s'applique à tous les clics provenant d'un réseau publicitaire. Vous pouvez exclure certaines applications de la signature par clic, mais vous ne pouvez pas exclure uniquement certaines campagnes.

Caractéristiques

Caractéristique

Description

Cliquez sur la signature La signature doit apparaître sur les serveurs du réseau publicitaire.
Clé secrète
  • Les réseaux publicitaires peuvent avoir un maximum de deux clés secrètes actives simultanément.
  • Chaque clé secrète a une date d'expiration.
  • Les clics signés avec des clés secrètes expirées sont rejetés.
API de rapport Les statistiques mises à jour sur la validité des clics sont agrégées toutes les heures.