How can we help?

Assinatura de cliques para ad networks

  • Atualizado

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. 

Click_signing_integration_flow.png

Procedimento

Pré-requisito: token da API V2.0 do administrador para autorizar a API de assinatura de clique.

Para assinar seus cliques:

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

  1. Crie um JSON usando a lista de atributos e as regras JSON abaixo
  2. 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:
  • app.appsflyer.com
  • myapp.onelink.me
  • click.mycustomdomain.com
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"]]

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, &params)
	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: 
  • desabilitado (padrão): Nenhuma validação de assinatura de clique é feita.
  • report-only (modo de teste): A AppsFlyer valida assinaturas de cliques, mas não bloqueia cliques com assinaturas inválidas. A ad network pode usar a Report API para obter estatísticas sobre cliques bem-sucedidos/com falha. Use isso para testar a assinatura de cliques sem afetar a produção e o tráfego real.
  • habilitado: A AppsFlyer bloqueia cliques com assinaturas inválidas ou ausentes.
Configurar interruptor Configure o modo do interruptor que evita que a ad network tenha muitos cliques bloqueados:
  • habilitado (padrão): Se o sistema Protect360 detectar que muitos cliques estão marcados como inválidos, para evitar que a ad network tenha cliques potencialmente bloqueados incorretamente:
    • Configure o modo da API para somente relatório.
    • Um alerta por e-mail é enviado para ad network para verificar se a API de assinatura de cliques está configurada corretamente.
  • desabilitado: O Protect360 continua bloqueando todos os cliques marcados como inválidos, mesmo quando a porcentagem de bloqueio é anormalmente alta.
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
  • Tempo de vida para a chave secreta, em horas, de 1 a 1440.
  • O padrão é de 36 horas.

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:
  • Assinatura faltando
  • Assinatura inválida
  • Expirou 

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:
  • habilitado
    Atenção! Defina o modo como "ativado" somente depois de executar o modo somente relatório por algumas horas e verifique seus relatórios para garantir que a configuração esteja correta e que todos os cliques passaram pela validação de assinatura.
  • desativado
  • somente relatório

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
  • ativado
  • desativado

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:
  • ativado
  • desativado
  • somente relatório
configuração do disjuntor Um objeto JSON contendo status, um dos seguintes:
  • ativado
  • desabilitado
     
active-key-ids Um array JSON contendo chaves ativas:
 
  • secret-key-id: ID gerado aleatoriamente da chave secreta
  • expiration: Tempo epoch em milissegundos da chave secreta
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:
    1. 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.
    2. 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:
    1. Continue executando no modo somente relatório.
    2. Corrija o seu processo de assinatura de cliques.
    3. 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:

  1. Use a API de teste. Este método é útil durante a fase de desenvolvimento, para testar as assinaturas de cliques únicos.
  2. Use o modo somente relatório. O modo somente relatório verifica as assinaturas nos cliques de produção e mostra o que seria bloqueado, mas não bloqueia cliques inválidos. Portanto, você pode testar se a assinatura de cliques funciona sem impactar o tráfego real.

P: Qual é a diferença entre um token de API e uma chave secreta?

RToken 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
  • As ad networks podem ter no máximo duas chaves secretas ativas simultaneamente.
  • Cada chave secreta tem uma data de validade.
  • Cliques assinados com chaves secretas expiradas são rejeitados.
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.


Share article: