Em resumo: Adicione validação de assinatura aos cliques para evitar responsabilidades por fraude e para que cliques fraudulentos não sejam atribuídos à sua ad network.
Sobre assinatura de cliques
Com o mínimo de tecnologia, golpistas podem enviar cliques em nome de uma ad network e criar milhares, ou até milhões, de cliques falsos que são enviados para a AppsFlyer. Às vezes, as próprias ad networks não estão cientes do problema.
Para que uma ad network garanta que os cliques atribuídos a ela pela AppsFlyer realmente se originaram da ad network, e não de um golpista que cria cliques falsos, as ad networks devem assinar seus cliques com assinaturas HMAC-SHA256.
A assinatura de cliques também evita que o tráfego da ad network seja bloqueado devido a um flooding de cliques. Ou seja, se uma ad network atingir o limite de bloqueio de cliques devido a um nível extremo de flooding de cliques, a AppsFlyer para de registrar e atribuir seus cliques pelo resto do dia.
As assinaturas permitem que a AppsFlyer valide os cliques e verifique se as informações do clique não foram manipuladas por fraudadores.
- Os cliques validados são registados e atribuídos à rede de publicidade.
- Os cliques invalidados são rejeitados e:
- Estão disponíveis nos relatórios do Protect360 para ad networks (não anunciantes). Saiba mais
- Não afetam a taxa de conversão ou o limite de bloqueio de cliques da ad network
Integração de assinatura de cliques
Fluxo
O gráfico a seguir descreve o fluxo do desenvolvimento inicial e testes básicos para os testes de produção e, finalmente, para a produção.
Procedimento
Pré-requisito: token da API V2.0 do administrador para autorizar a API de assinatura de clique.
Para assinar seus cliques:
-
Gere uma chave secreta com a API Gerar chave secreta.
Melhores práticas: gere e use uma nova chave secreta a cada 24 horas, com expiração de 36 horas. -
Desenvolva código em seus servidores que chame a API Gerar chave secreta, pegue a chave secreta e gere uma assinatura HMAC-SHA256. Veja o exemplo de código.
Você pode usar as outras APIs conforme descrito na tabela a seguir. - O código adiciona o seguinte aos seus URLs de clique:
- Um parâmetro expires que contém um carimbo de data/hora Unix (em UTC) após o qual a ad network não reivindica o clique.
- A assinatura HMAC-SHA256.
Exemplo: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
Observação:
Certifique-se de que qualquer codificação de URL de caracteres especiais ou espaços no seu link ocorra antes que a assinatura de clique seja gerada. Gerar a assinatura primeiro resulta em falha na verificação.
Criando uma assinatura de clique
Para criar uma assinatura de clique você deve:
- Crie um JSON usando a lista de atributos e as regras JSON abaixo
- Crie a assinatura deste JSON usando HMAC56
Lista de atributos
A lista de atributos a seguir é compatível com assinatura de clique e engajamento.
| Pedido | Parâmetro | Obrigatoriedade | Notas |
|---|---|---|---|
| 1 | link_domain | Yes | O domínio do URL do clique Por exemplo:
|
| 2 | link_path | Yes | O caminho da URL de clique, sem incluir uma barra invertida inicial. app-id para links de plataforma única ou template-id para OneLink |
| 3 | pid | Yes | |
| 4 | af_prt | Sem | |
| 5 | af_siteid | Yes | |
| 6 | clickid | Yes | Um identificador único e exclusivo do clique |
| 7 | expires | Yes | expiração do clique |
| 8 | af_engagement_type | Sem | |
| 9 | af_click_lookback | Sem | |
| 10 | af_viewthrough_lookback | Sem | |
| 11 | af_reengagement _window | Sem | |
| 12 | is_retargeting | Sem | |
| 13 | af_ip | Sem | |
| 14 | advertising_id | Sem | |
| 15 | OAID | Sem | |
| 16 | fire_advertising_id | Sem | |
| 17 | idfa | Sem | |
| 18 | idfv | Sem |
Regras de atributos e JSON
Ordem e aparência dos atributos
- Os parâmetros compatíveis no URL de engajamento com um valor devem estar no JSON
- Os atributos devem ser listados no JSON na ordem listada na tabela acima
Atributos vazios
- Os atributos listados no JSON não podem ser valores vazios ou conter apenas espaços
Estrutura de dados JSON
- A estrutura de dados JSON deve ser uma matriz de atributos
- Cada atributo estará no formato ["key", "value"]
Exemplo:[["key-1","value-1"],["key-2","value-2"]...["key-n","value-n"]]
- Cada atributo estará no formato ["key", "value"]
Valor do atributo escapando
- Os valores no JSON devem ser escritos em strings em minúsculas, conforme definido no padrão JSON.
Espaços no JSON
- O JSON deve ser compactado. Não deve conter espaços em branco, parágrafos ou caracteres em quebra de linha entre os valores.
Algoritmo de assinatura
- Use HmacSHA256 com a chave secreta para criar a assinatura para o JSON
- Codifique a assinatura com Base64 sem preenchimento
- Adicione a assinatura ao URL do clique com um 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()));
Exemplo de assinatura
Criando um exemplo de assinatura
Exemplo de URL de clique do 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
Exemplo de objeto json para assinatura (antes de remover espaços em branco):
[ ["link_domain","yourbrand.onelink.me"], ["link_path","qswl"], ["pid","mediasource_int"], ["af_siteid","my_site"], ["clickid","12345"], ["expires","1689695615"] ]
Exemplo de objeto json para assinatura (após remover espaços em branco)
[["link_domain","yourbrand.onelink.me"],["link_path","qswl"],["pid","mediasource_int"],["template-id","qswl"],["af_siteid","my_site"],["clickid","12345"],["expires","1689695615"]]
URL do clique final com a assinatura:
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
Exemplos 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("falha ao carregar " + 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. 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
}
// esta função aceita uma URL de clique, um ttl para o clique em segundos e a lista de parâmetros com suporte
// a função:
// 1. adiciona a expiração ao clique com base no ttl fornecido
// 2. cria um json para a assinatura
// 3. cria uma assinatura HMAC256
// 4. adiciona a assinatura à URL de clique
func signURLV2(originalURL string, secret string, clickTtlSeconds int64, supportedParams []Param) (signedURL string, err error) {
// adiciona uma expiração ao clique
expires := time. Now().UTC(). Unix() + clickTtlSeconds
urlWithExpired := fmt. Sprintf("%s%s%d", originalURL, "&expires=", expires)
// analisa a URL
parsedURL, err := url. Parse(urlWithExpired)
if err != nil {
return "", errors. New("falha ao analisar a URL")
}
// cria um json a partir da URL
jsonStr, err := buildJSONFromURLV2(parsedURL, supportedParams)
if err != nil {
return "", err
}
// cria uma assinatura
signatureV2, err := computeHmac256(jsonStr, secret)
if err != nil {
fmt. Println("Falha ao calcular computeHMAC256 para a URL %s. err: %+v", jsonStr, err)
return "", errors. New("falha ao calcular computeHMAC256 para a url")
}
//add the signature to the url
signedURL = fmt. err: %+v", jsonStr, err)
return "", errors.New("falha ao calcular computeHMAC256 para a 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.
// Ela retorna uma representação em string do json pronta para ser assinada.
func buildJSONFromURLV2(parsedURL *url.URL, supportedParams []Param) (string, error) {
// inicia um json vazio na estrutura [[key-1,val-1],[key-2,val-2]...[key-n,val-n]]
var jsonData [][2]string
// adiciona o domínio do host da URL ao json
domain := parsedURL. Host
param := [2]string{"link_domain", domain}
jsonData = append(jsonData, param)
// adiciona o caminho (ID do aplicativo ou ID do modelo) ao json
path := parsedURL. Path
if len(path) > 1 {
param := [2]string{"link_path", path[1:]}
jsonData = append(jsonData, param)
}
// percorre a lista ordenada de parâmetros com suporte e os adiciona ao 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("parâmetro obrigatório ausente: " + name)
}
}
// gera a representação em string do objeto json
jsonObj, _ := json. Marshal(jsonData)
return strings. ToLower(string(jsonObj)), nil
}
func main() {
supportedParams, err := LoadSupportedParams()
if err != nil {
fmt. Println("Erro: ", 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.APIs de assinatura de clique
A AppsFlyer fornece APIs que permitem que as ad networks gerenciem e testem o processo de assinatura de cliques. Veja a lista de APIs na tabela abaixo e as seções a seguir com informações necessárias para usar a API.
APIs de assinatura de clique
| Método API | Observações |
|---|---|
| Gerar chave secreta | Gerar chaves secretas para serem usadas na assinatura. |
| Revogar chave secreta | Cancelar chaves secretas comprometidas. |
| Testar | Enviar cliques únicos para testar a assinatura. |
| Modo de configuração |
Configurar modo de assinatura de clique:
|
| Configurar interruptor |
Configure o modo do interruptor que evita que a ad network tenha muitos cliques bloqueados:
|
| Obter configuração | Obtenha o modo e os IDs das chaves secretas ativas. |
| Relatório | Obtenha estatísticas dos últimos 3 dias sobre cliques bem-sucedidos e com falha quando o sistema estiver no modo report-only ou enabled. Use isso para testar a assinatura de cliques sem afetar a produção e o tráfego real. |
| Excluir aplicativo | Configure IDs de aplicativos para serem excluídos da assinatura de cliques. |
| Remover aplicativo excluído | Configure IDs de aplicativo a serem incluídos na assinatura de cliques após terem sido excluídos. |
Versões legadas
Essas versões não devem ser usadas e são listadas apenas para referência
V1 - legado
Método de geração de chave secreta
Gerar noções básicas de chave secreta
| Categoria | Item | Visão geral |
|---|---|---|
| Solicitação | Método HTTP | POST |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours> | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Retornos de chaves secretas em um JSON |
| Limite de solicitação | Máximo de 2 chaves secretas ativas por vez |
Solicitação de API
Mensuração
POST https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours>
Parâmetros
| Parâmetro | Visão geral |
|---|---|
| ttlHours |
|
Resposta JSON
| Chave | Visão geral |
|---|---|
| secret-key-id | Um ID para a chave secreta |
| secret key | A chave secreta para a assinatura do clique |
| expiration | Hora Epoch em milissegundos |
Gerar exemplo de curl de chave secreta e resposta
Solicitação 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.}'
Resposta JSON
{
"secret-key-id": "59ad6547-affc-45eb-a6c9-9805f88ee755",
"secret-key": "zGW6Rhrmb8+vuhHtL/Kp6rW5Ci9PNsjH1J5MGO9SIeg=",
"expiration": 1610533263
}
Códigos de resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Método de revogação de chave secreta
Noções básicas sobre revogação de chave secreta
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | DELETE |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id> | |
| Cabeçalho de autorização |
|
|
| resposta | Resultados | Vazio |
Solicitação de API
Mensuração
DELETE https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id>
Parâmetros
| Parâmetro | A descrição |
|---|---|
| secret-id | O ID da chave secreta a ser revogada |
Gerar exemplo de curl de chave secreta e resposta
Solicitação 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 resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Método de teste
Noções básicas de teste
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | POST |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/test | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Retorna em um JSON |
Solicitação de API
Mensuração
POST https://hq1.appsflyer.com/api/p360-click-signing/test
Parâmetros
| Parâmetro | A descrição |
|---|---|
| url | O URL do clique (incluindo assinatura) para testar |
Resposta JSON
| Chave | A descrição |
|---|---|
| test-status | Aprovado ou Falhou |
| Mensagem |
Motivo da falha no teste. Exemplo:
|
Exemplo e resposta do teste curl
Solicitação 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"
}'
Resposta JSON
{
"test-status":"Passed / Failed",
"message": "Invalid signature"
}
Códigos de resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Método de modo de configuração
Noções básicas do modo de configuração
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | POST |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode> | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Retorna em um JSON |
Solicitação de API
Mensuração
POST https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode>
Parâmetros
| Parâmetro | A descrição |
|---|---|
| mode | Opções de upgrade:
|
Exemplo de configuração de modo curl
Solicitação 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 resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 400 | Erro na solicitação | Modo inválido |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Configurar método de interruptor
Configurar noções básicas de interruptor
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | POST |
| Caminho | https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Estado HTTP |
Solicitação de API
Mensuração
POST https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker
Corpo da solicitação JSON
| Parâmetro | A descrição |
|---|---|
| estado |
|
Exemplo de configuração de interruptor curl e resposta
Solicitação 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"
}'
--data-raw '{
"status":"enabled"
}'
Códigos de resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 400 | Erro na solicitação | Status inválido |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Obter método de configuração
Obter noções básicas de configuração
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | BAIXAR |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/config | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Retorna em um JSON |
Solicitação de API
Mensuração
GET https://hq1.appsflyer.com/api/p360-click-signing/config
Resposta JSON
| Chave | A descrição |
|---|---|
| mode |
Um de:
|
| configuração do disjuntor |
Um objeto JSON contendo status, um dos seguintes:
|
| active-key-ids |
Um array JSON contendo chaves ativas:
|
| excluded-app-ids | Uma matriz JSON com app-ids excluídos |
Obter exemplo de configuração curl e resposta
Solicitação 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.}'
Resposta 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 resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Método de relatório
Noções básicas de relatórios
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | BAIXAR |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/report | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Retorna em um CSV |
Solicitação de API
Mensuração
GET https://hq1.appsflyer.com/api/p360-click-signing/report
Parâmetros
| Parâmetro | A descrição |
|---|---|
| start_date | Data e hora de início do relatório. Formato: aaaa-mm-ddThh |
| end-date | Data e hora de término do relatório. Formato: aaaa-mm-ddThh |
| A API requer ambas as datas, start-date e end-date, ou nenhuma delas. Se a data de início/término não for fornecida, o relatório mostrará os resultados das últimas 24 horas. | |
Resposta CSV
| Nome da | A descrição |
|---|---|
| Tempo de | Data e hora dos cliques. Formato aaaa-mm-ddThh |
| total_cliques | Número total de cliques durante o período do relatório |
| cliques_válidos | Número de cliques válidos durante o período do relatório |
| assinatura_ausente | Número de cliques sem assinaturas durante o período do relatório |
| cliques_expirados | Número de cliques expirados durante o período do relatório |
| assinatura_inválida | Número de cliques com assinatura inválida durante o período do relatório |
| sem_segredos_ativos | Número de cliques rejeitados porque não há chaves secretas ativas no sistema (geralmente quando o sistema está no modo somente relatório) |
Exemplo e resposta do teste curl
Solicitação Curl
O administrador obtém o token no dashboard da seguinte forma: O administrador acessa a lista suspensa de e-mail > tokens de API para obter o token V2.
Resposta CSV
| Tempo de | total_cliques | cliques_válidos | assinatura_ausente | cliques_expirados | assinatura_inválida | 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 resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Excluir método de aplicativo
Excluir noções básicas do aplicativo
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | POST |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id> | |
| Cabeçalho de autorização |
|
|
| Mensuração | Resultados | Vazio |
Solicitação de API
Mensuração
POST https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>
Parâmetros
| Parâmetro | A descrição |
|---|---|
| app-id | ID do aplicativo a ser excluído da validação de assinatura de clique |
Exemplo de curl de exclusão de aplicativo
Solicitação 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 resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Remover método de aplicativo excluído
Remover noções básicas sobre o método do aplicativo
| Categoria | Item | A descrição |
|---|---|---|
| Solicitação | Método HTTP | DELETE |
| Caminho | https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id> | |
| Cabeçalho de autorização |
|
|
| resposta | Resultados | Vazio |
Solicitação de API
Mensuração
DELETE https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>
Parâmetros
| Parâmetro | A descrição |
|---|---|
| app-id | ID do aplicativo a ser removido da lista de aplicativos excluídos da validação de assinatura de clique |
Exemplo de curl para remover aplicativo excluído
Solicitação 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 resposta HTTP
Códigos de resposta
| Código | Mensagem | Considerações |
|---|---|---|
| 200 | OK | |
| 401 | Não autorizado | Cabeçalho de autorização inválido ou ausente |
Amostra 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;
Informações adicionais
Solução de problemas
A AppsFlyer interrompe a validação da assinatura de clique e retorna ao modo somente relatório quando mais de 90% dos cliques em uma hora falham na validação da assinatura.
Isso protege sua empresa de um possível problema técnico e permite que você encontre a causa da anomalia:
- Se você perceber que a assinatura está funcionando conforme o esperado e os cliques estão sendo bloqueados corretamente, desative o disjuntor usando o método de configuração do disjuntor.
-
Se você perceber que os cliques estão sendo bloqueados incorretamente:
- Certifique-se de que você tem uma chave secreta válida verificando a configuração de assinatura de cliques usando o método de obter configuração.
- Use o relatório de assinatura de cliques para obter mais informações sobre os cliques bloqueados e investigar as fontes (IDs de agência/aplicativo) e os motivos dos cliques inválidos.
- Se você encontrar um problema com um aplicativo específico devido a uma integração fora do padrão, exclua esse aplicativo da validação de assinatura de cliques usando a API de exclusão de aplicativo.
-
Se você encontrar um problema com sua configuração:
- Continue executando no modo somente relatório.
- Corrija o seu processo de assinatura de cliques.
- Verifique os resultados no relatório de assinatura de cliques e reative a validação de assinatura de cliques quando observar que os cliques estão sendo validados conforme o esperado.
Perguntas frequentes
|
P: Como podemos testar a assinatura de cliques sem afetar a produção? R: Há duas maneiras de testar a assinatura de cliques:
|
|
P: Qual é a diferença entre um token de API e uma chave secreta? R: Token de API: é usado para autorizar e executar a API de assinatura de cliques. Há apenas um por ad network. O token da API V2.0 do AppsFlyer deve ser obtido com o administrador Chave secreta: é usada para gerar a assinatura. Use o método de geração de chave secreta para criar chaves secretas. A ad network é responsável por gerar novas chaves secretas. Veja a seção de traits para mais informações. |
|
P: Podemos aplicar a assinatura de cliques apenas a determinadas campanhas? R: Não. A assinatura de cliques é aplicada a todos os cliques de uma ad network. Você pode excluir determinados aplicativos da assinatura de cliques, mas não pode excluir apenas determinadas campanhas. |
Características
| Caraterística | A descrição |
|---|---|
| Assinatura de cliques | A assinatura deve ocorrer nos servidores da ad network. |
| Chave secreta |
|
| API de relatórios | Estatísticas atualizadas de validade de cliques são agregadas de hora em hora. |
This article was translated using AI and may contain errors. For the most accurate information, please refer to the English version using the language selector.