Além do token de autenticação, é obrigatório assinar o payload dos métodos POST e PUT com uma chave RSA para garantir a segurança dos dados.
Caso ainda não tenha uma chave, siga os passos:
No cmd ou terminal Linux/MAC, insira estes comandos:
-
Gerar uma chave privada:
-
openssl genrsa -out private-dom.pem 2048
-
-
Gerar chave pública a partir da chave privada:
-
openssl rsa -in private-dom.pem -outform PEM -pubout -out public-dom.pem
-
-
Envie sua chave pública, public-dom.pem, por e-mail ao seu gerente de contas na Dom para que ela seja configurada.
ASSINAR O SEU PAYLOAD COM CHAVE PRIVADA
Implemente em sua aplicação um método para assinar o payload. O resultado da assinatura deve ser codificado em base64 e enviado no cabeçalho da requisição, no parâmetro Signature.
Para testar se a assinatura enviada na requisição está correta, utilize o endpoint descrito em Verificar Assinatura
Exemplo em PHP:
<?php
/**
* Função para assinar um payload com uma chave privada
*
* @param string $payload O payload a ser assinado (em JSON)
* @param string $privateKeyPath Caminho para o arquivo da chave privada
* @return string Assinatura em base64
* @throws Exception Caso haja erro ao carregar a chave privada ou assinar o conteúdo
*/
function signPayload(string $payload, string $privateKeyPath): string
{
// Carrega a chave privada
$privateKey = file_get_contents($privateKeyPath);
if ($privateKey === false) {
throw new Exception("Erro ao carregar a chave privada.");
}
$privateKeyResource = openssl_pkey_get_private($privateKey);
if ($privateKeyResource === false) {
throw new Exception("Chave privada inválida.");
}
// Assina o payload
$success = openssl_sign($payload, $signature, $privateKeyResource, OPENSSL_ALGO_SHA256);
openssl_free_key($privateKeyResource);
if (!$success) {
throw new Exception("Erro ao assinar o payload.");
}
// Retorna a assinatura codificada em base64
return base64_encode($signature);
}
// Caminho para a chave privada
$privateKeyPath = 'private-dom.pem';
// Payload em formato JSON
$payload = json_encode([
'test' => "Testando"
]);
if ($payload === false) {
die("Erro ao gerar o JSON do payload.\n");
}
try {
// Assina o payload com a chave privada
$signature = signPayload($payload, $privateKeyPath);
// Configuração do cabeçalho
$headers = [
"Content-Type: application/json",
"Signature: $signature",
"Authorization: Bearer {{seu_token}}"
];
// URL do endpoint para enviar a requisição POST
$url = 'https://apiv3.dompagamentos.com.br/checkout/production/verify-signature-rsa';
// Inicializa o cURL
$ch = curl_init($url);
// Configura a requisição POST
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Executa a requisição e captura a resposta
$response = curl_exec($ch);
if ($response === false) {
throw new Exception('Erro na requisição: ' . curl_error($ch));
}
// Captura o código de resposta HTTP
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Fecha a conexão cURL
curl_close($ch);
// Exibe a resposta
echo "HTTP Code: $httpCode\n";
echo "Response: $response\n";
} catch (Exception $e) {
echo "Erro: " . $e->getMessage() . "\n";
}
Exemplo em Node.js utilizando a biblioteca crypto:
const fs = require('fs');
const crypto = require('crypto');
const axios = require('axios');
/**
* Função para assinar um payload com uma chave privada
*
* @param {string} payload O payload a ser assinado (em JSON)
* @param {string} privateKeyPath Caminho para o arquivo da chave privada
* @returns {string} Assinatura em base64
* @throws {Error} Caso haja erro ao carregar a chave privada ou assinar o conteúdo
*/
function signPayload(payload, privateKeyPath) {
try {
// Carrega a chave privada
const privateKey = fs.readFileSync(privateKeyPath, 'utf8');
// Assina o payload usando a chave privada e o algoritmo SHA256
const sign = crypto.createSign('SHA256');
sign.update(payload);
sign.end();
// Gera a assinatura e retorna codificada em base64
const signature = sign.sign(privateKey, 'base64');
return signature;
} catch (error) {
throw new Error(`Erro ao assinar o payload: ${error.message}`);
}
}
// Caminho para a chave privada
const privateKeyPath = 'private-dom.pem';
// Payload em formato JSON
const payload = JSON.stringify({
test: "Testando"
});
// URL do endpoint para enviar a requisição POST
const url = 'https://apiv3.dompagamentos.com.br/checkout/production/verify-signature-rsa';
// Token de autenticação
const token = '{{seu_token}}';
(async () => {
try {
// Assina o payload com a chave privada
const signature = signPayload(payload, privateKeyPath);
// Configuração do cabeçalho
const headers = {
'Content-Type': 'application/json',
'Signature': signature,
'Authorization': `Bearer ${token}`
};
// Envia a requisição POST usando axios
const response = await axios.post(url, payload, { headers });
// Exibe o status e a resposta
console.log('HTTP Code:', response.status);
console.log('Response:', response.data);
} catch (error) {
console.error('Erro:', error.message);
}
})();
