Validar Sessão Apple Pay
curl --request POST \
--url https://pay.autorizou.dev/api/v1/apple-pay/validate-session \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"validationURL": "<string>",
"domainName": "<string>"
}
'import requests
url = "https://pay.autorizou.dev/api/v1/apple-pay/validate-session"
payload = {
"validationURL": "<string>",
"domainName": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({validationURL: '<string>', domainName: '<string>'})
};
fetch('https://pay.autorizou.dev/api/v1/apple-pay/validate-session', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://pay.autorizou.dev/api/v1/apple-pay/validate-session",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'validationURL' => '<string>',
'domainName' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://pay.autorizou.dev/api/v1/apple-pay/validate-session"
payload := strings.NewReader("{\n \"validationURL\": \"<string>\",\n \"domainName\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://pay.autorizou.dev/api/v1/apple-pay/validate-session")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"validationURL\": \"<string>\",\n \"domainName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pay.autorizou.dev/api/v1/apple-pay/validate-session")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"validationURL\": \"<string>\",\n \"domainName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"sessionData": {
"epochTimestamp": 123,
"expiresAt": 123,
"merchantSessionIdentifier": "<string>",
"nonce": "<string>",
"merchantIdentifier": "<string>",
"domainName": "<string>",
"displayName": "<string>",
"signature": "<string>"
}
}Apple Pay
Validar Sessão Apple Pay
Endpoint para validar sessões Apple Pay necessário para integração web
POST
/
api
/
v1
/
apple-pay
/
validate-session
Validar Sessão Apple Pay
curl --request POST \
--url https://pay.autorizou.dev/api/v1/apple-pay/validate-session \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"validationURL": "<string>",
"domainName": "<string>"
}
'import requests
url = "https://pay.autorizou.dev/api/v1/apple-pay/validate-session"
payload = {
"validationURL": "<string>",
"domainName": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({validationURL: '<string>', domainName: '<string>'})
};
fetch('https://pay.autorizou.dev/api/v1/apple-pay/validate-session', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://pay.autorizou.dev/api/v1/apple-pay/validate-session",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'validationURL' => '<string>',
'domainName' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://pay.autorizou.dev/api/v1/apple-pay/validate-session"
payload := strings.NewReader("{\n \"validationURL\": \"<string>\",\n \"domainName\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://pay.autorizou.dev/api/v1/apple-pay/validate-session")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"validationURL\": \"<string>\",\n \"domainName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pay.autorizou.dev/api/v1/apple-pay/validate-session")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"validationURL\": \"<string>\",\n \"domainName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"sessionData": {
"epochTimestamp": 123,
"expiresAt": 123,
"merchantSessionIdentifier": "<string>",
"nonce": "<string>",
"merchantIdentifier": "<string>",
"domainName": "<string>",
"displayName": "<string>",
"signature": "<string>"
}
}Visão Geral
Este endpoint é chamado automaticamente durante o fluxo de pagamento Apple Pay na web, quando o eventoonvalidatemerchant é disparado pelo ApplePaySession.
A validação de sessão é necessária para estabelecer confiança entre o seu domínio, a Apple e a Autorizou antes de processar o pagamento.
Este endpoint não requer autenticação Bearer Token, mas deve ser chamado do frontend durante o fluxo Apple Pay.
Quando Este Endpoint é Usado
Este endpoint é chamado automaticamente quando você inicia uma sessão Apple Pay:JavaScript
const session = new ApplePaySession(3, paymentRequest);
session.onvalidatemerchant = async (event) => {
const response = await fetch('/api/v1/apple-pay/validate-session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
validationURL: event.validationURL,
domainName: window.location.hostname
})
});
const merchantSession = await response.json();
session.completeMerchantValidation(merchantSession.sessionData);
};
session.begin();
Parâmetros da Requisição
string
required
URL fornecida pela Apple no evento
onvalidatemerchantExemplo: https://apple-pay-gateway-cert.apple.com/paymentservices/startSessionEsta URL é única para cada sessão e expira rapidamente.string
required
Nome do domínio onde o Apple Pay está sendo usadoExemplo:
checkout.sualoja.com.brDeve ser um domínio verificado no Apple Developer Portal.Exemplo de Requisição
curl -X POST https://pay.autorizou.dev/api/v1/apple-pay/validate-session \
-H "Content-Type: application/json" \
-d '{
"validationURL": "https://apple-pay-gateway-cert.apple.com/paymentservices/startSession",
"domainName": "checkout.sualoja.com.br"
}'
async function validateMerchant(event) {
try {
const response = await fetch('https://pay.autorizou.dev/api/v1/apple-pay/validate-session', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
validationURL: event.validationURL,
domainName: window.location.hostname
})
});
if (!response.ok) {
throw new Error('Falha na validação do merchant');
}
const data = await response.json();
return data.sessionData;
} catch (error) {
console.error('Erro ao validar merchant:', error);
throw error;
}
}
<?php
$validationURL = 'https://apple-pay-gateway-cert.apple.com/paymentservices/startSession';
$domainName = 'checkout.sualoja.com.br';
$data = [
'validationURL' => $validationURL,
'domainName' => $domainName
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://pay.autorizou.dev/api/v1/apple-pay/validate-session',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($data)
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
if (isset($result['sessionData'])) {
echo "Sessão validada com sucesso!\n";
print_r($result['sessionData']);
} else {
echo "Erro na validação\n";
}
?>
Resposta de Sucesso
object
required
Objeto de sessão retornado pela Apple, necessário para completar a validação no frontend
Show Estrutura do sessionData
Show Estrutura do sessionData
integer
Timestamp Unix da criação da sessão
integer
Timestamp Unix de expiração da sessão (normalmente 5 minutos)
string
Identificador único da sessão do merchant
string
Nonce criptográfico para segurança
string
Seu Merchant ID Apple Pay
string
Domínio validado
string
Nome de exibição do merchant
string
Assinatura criptográfica da Apple
Exemplo de Resposta
{
"sessionData": {
"epochTimestamp": 1705319400000,
"expiresAt": 1705319700000,
"merchantSessionIdentifier": "SSH2EAF8AFAEAA94DEA3EB4E797AE2D2E6_916523AAED1343F5BC5815E12BEE9250AFFDC1A17C46B0DE5A943F0F94927C24",
"nonce": "89dba098",
"merchantIdentifier": "merchant.com.suaempresa.sualoja",
"domainName": "checkout.sualoja.com.br",
"displayName": "Sua Loja",
"signature": "308006092a864886f70d010702a0803080020101310f300d06096..."
}
}
Códigos de Erro
400 - Bad Request
400 - Bad Request
Parâmetros faltando ou inválidosCausas comuns:
{
"message": "ValidationURL and domainName are required",
"errors": {
"validationURL": ["ValidationURL is required"],
"domainName": []
}
}
validationURLoudomainNamenão foram fornecidos- Formato inválido dos parâmetros
400 - Apple Pay Session Validation Failed
400 - Apple Pay Session Validation Failed
Falha na validação com a AppleCausas comuns:
{
"message": "Apple Pay session validation failed"
}
- Domínio não foi registrado pela Autorizou (solicite ao suporte)
- Arquivo de verificação não está acessível no seu domínio
validationURLexpirada (execute o fluxo mais rapidamente)
- Confirme que solicitou o registro do domínio ao suporte da Autorizou
- Verifique se o arquivo está acessível em:
https://seu-dominio/.well-known/apple-developer-merchantid-domain-association.txt - Se persistir, entre em contato com o suporte
500 - Internal Server Error
500 - Internal Server Error
Erro na configuração interna da Autorizou. Pode retornar uma das mensagens abaixo:Solução:
{
"message": "Apple Pay certificates not configured properly"
}
{
"message": "Session validation failed due to server error"
}
- Entre em contato com o suporte da Autorizou
- Informe o domínio e horário do erro
- A equipe técnica verificará a configuração
Fluxo Completo de Integração
Este endpoint faz parte de um fluxo maior. Veja como ele se encaixa:1
Usuário clica no botão Apple Pay
Frontend detecta o clique e inicia
ApplePaySession2
Apple dispara evento onvalidatemerchant
Fornece
validationURL única para esta sessão3
Frontend chama este endpoint
Envia
validationURL e domainName para validação4
Autorizou valida com Apple
Usa certificados Merchant Identity para estabelecer confiança
5
Retorna sessionData
Frontend recebe dados de sessão validados
6
Frontend completa validação
Chama
session.completeMerchantValidation(sessionData)7
Apple Pay exibe interface
Usuário pode selecionar cartão e autorizar pagamento
8
Processa pagamento
Token Apple Pay é enviado para
/api/v1/charges/ordersSegurança
Como Funciona a Validação
- Seu domínio deve estar verificado no Apple Developer Portal
- Certificado Merchant Identity prova que você controla o Merchant ID
- Apple valida que domínio + certificado + Merchant ID são consistentes
- Apple retorna sessão criptografada válida por 5 minutos
Boas Práticas
✓ Sempre use HTTPS para servir a página com Apple Pay
✓ Valide que o domínio está correto antes de chamar o endpoint
✓ Trate erros adequadamente e mostre mensagem amigável ao usuário
✓ Não reutilize sessionData - cada sessão é única
Nunca armazene ou faça cache do
sessionData. Ele é único por sessão e expira rapidamente (5 minutos).Próximos Passos
Após validar a sessão com sucesso:- Implementar fluxo completo de Apple Pay
- Criar pedido com Apple Pay
- Configurar webhooks para notificações
Recursos Adicionais
Guia Completo Apple Pay
Documentação completa de integração
Apple Developer Docs
Documentação oficial da Apple
Criar Pedido
Processar pagamento Apple Pay
Webhooks
Receber notificações de pagamento