Assinatura de cliques para ad networks

Visão geral: Adicione validação de assinatura aos cliques para evitar a possibilidade fraude e, assim, cliques fraudulentos não serão 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 de cliques não foram manipuladas por golpistas.

  • Os cliques validados são registrados e atribuídos à ad network.
  • 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 API V2.0 do administrador para autorizar a API de assinatura de cliques.

Para assinar seus cliques:

  1. Gere uma chave secreta com a API Gerar chave secreta.
    Prática recomendada: Gere e use uma nova chave secreta a cada 24 horas, com validade 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 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 Observações
1 link_domain Sim

O domínio do URL do clique Por exemplo:

  • app.appsflyer.com
  • myapp.onelink.me
  • click.mycustomdomain.com
2 link_path Sim O path do URL do clique, sem incluir uma barra invertida inicial.
app-id para links de plataforma única ou template-id para OneLink
3 pid Sim  
4 af_prt Não  
5 af_siteid Sim  
6 clickid Sim Um identificador único e exclusivo do clique
7 expires Sim expiração do clique
8 af_engagement_type Não  
9 af_click_lookback Não  
10 af_viewthrough_lookback Não  
11 af_reengagement_window Não  
12 is_retargeting Não  
13 af_ip Não  
14 advertising_id Não  
15 oaid Não  
16 fire_advertising_id Não  
17 idfa Não  
18 idfv Não  

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 minúsculas, conforme definido no padrão JSON.

Espaços 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("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)
	}
}

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.
  • somente relatório (modo de teste): A AppsFlyer valida assinaturas de cliques, mas não bloqueia cliques com assinaturas inválidas. A ad network pode usar o Relatório da API para obter estatísticas sobre cliques bem-sucedidos/que falharam. Use isso para testar a assinatura de cliques sem afetar a produção e o tráfego real.
  •  Ativado: 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.
  • Desativado: 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 sobre cliques bem-sucedidos e com falha quando o sistema estiver no modo somente relatório ou habilitado. 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 aplicativos para serem incluídos na assinatura de cliques após serem 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

Descrição

Solicitação Método HTTP POST
Caminho

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

Cabeçalho de autorização 
Resposta 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

Método

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

Parâmetros

Parâmetro

Descrição
ttlHours
  • Tempo de vida para a chave secreta, em horas, de 1 a 1440.
  • O padrão é de 36 horas.

Resposta JSON

Chave

Descrição

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

Observaçõ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

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

Método

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

Parâmetros

Parâmetro

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

Observaçõ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

Descrição

Solicitação Método HTTP POST
Caminho

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

Cabeçalho de autorização 
Resposta Resultados Retorna em um JSON

Solicitação de API

Método

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

Parâmetros

Parâmetro

Descrição
url

O URL do clique (incluindo assinatura) para testar

Resposta JSON

Chave

Descrição

test-status

Aprovado ou Falhou

Mensagem

Motivo da falha no teste. Por exemplo:

  • Assinatura faltando
  • Assinatura inválida
  • Expirado 

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

Observaçõ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

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 
Resposta Resultados Retorna em um JSON

Solicitação de API

Método

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

Parâmetros

Parâmetro

Descrição
mode

Opções:

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

Observaçõ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

Descrição

Solicitação Método HTTP POST
Caminho

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

Cabeçalho de autorização 
Resposta Resultados Estado HTTP

Solicitação de API

Método

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

Corpo da solicitação JSON

Parâmetro

Descrição
status
  • 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"
}'

Códigos de resposta HTTP

Códigos de resposta

Código 

Mensagem

Observaçõ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

Descrição

Solicitação Método HTTP GET
Caminho

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

Cabeçalho de autorização 
Resposta Resultados Retorna em um JSON

Solicitação de API

Método

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

Resposta JSON

Chave

Descrição

mode

Um de:

  • ativado
  • desativado
  • somente relatório
circuit-breaker-config

Um objeto JSON contendo status, um dos seguintes:

  • ativado
  • desativado

active-key-ids

Uma matriz JSON contendo chaves ativas:

  • secret-key-id: ID gerado aleatoriamente da chave secreta
  • expiração: Hora 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

Observaçõ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

Descrição

Solicitação Método HTTP GET
Caminho

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

Cabeçalho de autorização 
Resposta Resultados Retorna em um CSV

Solicitação de API

Método

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

Parâmetros

Parâmetro

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 data de início e data de término 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

Coluna

Descrição

tempo

Data e hora dos cliques. Formato aaaa-mm-ddThh

total_clicks

Número total de cliques durante o período do relatório

valid_clicks

Número de cliques válidos durante o período do relatório

missing_signature

Número de cliques sem assinaturas durante o período do relatório

expired_clicks

Número de cliques expirados durante o período do relatório

invalid_signature

Número de cliques com assinatura inválida durante o período do relatório

no_active_secrets

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


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

Resposta CSV

tempo

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

Códigos de resposta HTTP

Códigos de resposta

Código 

Mensagem

Observaçõ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

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 
Resposta Resultados Vazio

Solicitação de API

Método

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

Parâmetros

Parâmetro

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

Observaçõ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

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

Método

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

Parâmetros

Parâmetro

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

Observações

200 OK

 

401 Não autorizado

Cabeçalho de autorização inválido ou ausente

Exemplo 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 quandomais 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, desabilite o interruptor usando o método de configuração do interruptor.
  • 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 clique usando ométodo de configuração get.
    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. Verifiqueos resultados no relatório de assinatura de cliquesereative 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 clique:

  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?

RAPI token: É usado para autorizar e executar a API de assinatura de cliques. Há apenas um por ad network. O O token da API V2.0 da 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 o seção de características 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

Característica

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.