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.
Marche à suivre
Conditions préalables : Jeton API V2.0 de l'administrateur pour autoriser l'API de signature par clic.
Pour signer vos clics:
-
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. -
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. - 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 :
- Créez un JSON en utilisant la liste des attributs et des règles JSON ci-dessous
- 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 :
|
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"]]
- Chaque attribut sera au format ["clé", "valeur"]
É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, ¶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 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 :
|
Configurer le disjoncteur |
Configurez le mode du disjoncteur qui protège le réseau publicitaire contre un trop grand nombre de clics bloqués :
|
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 |
|
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 :
|
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 :
|
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 |
|
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 :
|
circuit-breaker-config |
Un objet JSON contenant le statut, l'un des suivants :
|
active-key-ids |
Un tableau JSON contenant des clés actives :
|
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 :
- 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.
- 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 :
- Continuez à utiliser le mode rapport uniquement.
- Corrigez le processus de signature par clic de votre côté.
- 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 :
|
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 |
|
API de rapport | Les statistiques mises à jour sur la validité des clics sont agrégées toutes les heures. |