Sobre a documentação
Esta documentação tem como objetivo instruir a implementação da API de pagamentos Global Pays. Para realizar a integração com o gateway de pagamentos da Global Pays é necessário um programador com conhecimentos básicos em comunicação REST e manipulação de arquivos Json.
Autenticação
A autenticação é feita através do fornecimento de seu Token. Ele deve ser transmitido
em
todas as requisições no header token. Caso o Token seja inválido ou não
seja
informado, a API retornará HTTP 401.
Os Tokens são distintos entre os ambientes de Sandbox e Produção, portanto lembre-se de alterá-lo quando mudar a URL.
Atenção
- Seu Token carrega muitos privilégios, portanto certifique-se de mantê-lo protegido. Não informe ele em atendimentos e nem o exponha no front-end da sua aplicação.
- Além disso, não é possível recuperá-lo caso perdido, sendo necessário a geração de um novo.
Validade do Token e limite de requisições
- O Token gerado tem validade de 30 minutos a partir da sua geração. Após esse período ele expira e uma nova requisição deve ser feita para gerar outro.
- Esta rota não deve ser utilizada de forma abusiva, como gerar um Token novo
a cada requisição feita pela sua aplicação. Chamadas excessivas podem
acionar um bloqueio temporário (
HTTP 429 - Too Many Requests). O recomendado é reaproveitar o mesmo Token durante todo o seu período de validade e só solicitar um novo quando ele estiver perto de expirar.
Verificando a validade do Token antes de gerar um novo
A forma correta de evitar o bloqueio por excesso de requisições é armazenar o
Token junto com o campo expirate retornado na resposta, e só solicitar um novo Token quando o horário atual
estiver próximo ou além desse valor. Os exemplos abaixo (PHP e JavaScript)
implementam essa verificação, reaproveitando o Token em cache enquanto ele
ainda for válido:
<?php
/**
* Exemplo compatível com PHP 8.0 ou superior.
*
* Reutiliza o Token armazenado em cache enquanto ele estiver válido.
* Um novo Token é solicitado apenas quando necessário, evitando
* requisições excessivas à rota /auth (HTTP 429).
*/
class ParceladoUsaAuthClient
{
// URL do ambiente Sandbox.
// Em produção, utilize a URL correspondente ao ambiente produtivo.
private const AUTH_URL =
'https://apisandbox.parceladousa.com/v1/paymentapi/auth';
// Armazene o arquivo fora da pasta pública da aplicação.
private const CACHE_FILE = __DIR__ . '/parceladousa_token.json';
// Renova o Token 60 segundos antes do vencimento.
private const SAFETY_MARGIN_SECONDS = 60;
public function __construct(
private string $pubKey,
private string $merchantCode
) {
}
public function getValidToken(): string
{
$cached = $this->readCache();
if (
isset($cached['token'], $cached['expirate']) &&
$this->isStillValid($cached['expirate'])
) {
return $cached['token'];
}
return $this->requestNewToken();
}
private function isStillValid(string $expirate): bool
{
$expiresAt = strtotime($expirate); // "expirate": "Y-m-d H:i:s"
return $expiresAt !== false
&& $expiresAt > time() + self::SAFETY_MARGIN_SECONDS;
}
private function requestNewToken(): string
{
$payload = json_encode([
'pubKey' => $this->pubKey,
'merchantCode' => $this->merchantCode,
]);
if ($payload === false) {
throw new \RuntimeException(
'Não foi possível gerar os dados da autenticação.'
);
}
$ch = curl_init(self::AUTH_URL);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false) {
throw new \RuntimeException(
'Erro de conexão com a API: ' . $curlError
);
}
if ($httpCode === 429) {
throw new \RuntimeException(
'Limite de solicitações de Token excedido (HTTP 429).'
);
}
if ($httpCode < 200 || $httpCode >= 300) {
throw new \RuntimeException(
"Erro ao solicitar o Token (HTTP {$httpCode})."
);
}
$data = json_decode($response, true);
if (
!is_array($data) ||
!isset($data['token'], $data['expirate'])
) {
throw new \RuntimeException(
'A API retornou uma resposta de autenticação inválida.'
);
}
$cache = json_encode([
'token' => $data['token'],
'expirate' => $data['expirate'],
]);
if (
$cache === false ||
file_put_contents(self::CACHE_FILE, $cache, LOCK_EX) === false
) {
throw new \RuntimeException(
'Não foi possível salvar o Token em cache.'
);
}
return $data['token'];
}
private function readCache(): ?array
{
if (!is_file(self::CACHE_FILE)) {
return null;
}
$content = file_get_contents(self::CACHE_FILE);
if ($content === false) {
return null;
}
$data = json_decode($content, true);
return is_array($data) ? $data : null;
}
}
// Exemplo de uso:
$auth = new ParceladoUsaAuthClient(
'SEU_PUBKEY',
'SEU_MERCHANT_CODE'
);
$token = $auth->getValidToken();
/**
* Exemplo compatível com Node.js 18 ou superior.
*
* Reutiliza o Token em memória enquanto ele estiver válido e só solicita um
* novo quando necessário, evitando requisições excessivas à rota /auth
* (HTTP 429). Em ambientes serverless ou com múltiplas instâncias,
* substitua o cache em memória por Redis ou banco de dados.
*/
// URL do ambiente Sandbox.
// Em produção, utilize a URL correspondente ao ambiente produtivo.
const AUTH_URL = 'https://apisandbox.parceladousa.com/v1/paymentapi/auth';
// Renova o Token 60 segundos antes do vencimento.
const SAFETY_MARGIN_MS = 60 * 1000;
const REQUEST_TIMEOUT_MS = 30 * 1000;
let cachedToken = null;
let cachedExpiresAt = null;
async function getValidToken(pubKey, merchantCode) {
if (cachedToken && Date.now() < cachedExpiresAt - SAFETY_MARGIN_MS) {
return cachedToken;
}
return requestNewToken(pubKey, merchantCode);
}
async function requestNewToken(pubKey, merchantCode) {
let response;
try {
response = await fetch(AUTH_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({ pubKey, merchantCode }),
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
});
} catch (error) {
throw new Error(`Erro de conexão com a API: ${error.message}`);
}
if (response.status === 429) {
throw new Error('Limite de solicitações de Token excedido (HTTP 429).');
}
if (!response.ok) {
throw new Error(`Erro ao solicitar o Token (HTTP ${response.status}).`);
}
const data = await response.json();
if (!data?.token || !data?.expirate) {
throw new Error('A API retornou uma resposta de autenticação inválida.');
}
// "expirate": "YYYY-MM-DD HH:mm:ss" -> converte para timestamp.
const expiresAt = new Date(data.expirate.replace(' ', 'T')).getTime();
if (Number.isNaN(expiresAt)) {
throw new Error('A data de expiração do Token é inválida.');
}
cachedToken = data.token;
cachedExpiresAt = expiresAt;
return cachedToken;
}
// Exemplo de uso:
const token = await getValidToken('SEU_PUBKEY', 'SEU_MERCHANT_CODE');
Códigos HTTP das respostas
A Global Pays utiliza respostas HTTP convencionais para indicar sucesso ou falha nas requisições. Respostas com status 200 indicam sucesso, status 4xx indicam falhas decorrentes de erros nas informações enviadas, e status 500 indicam erros internos no servidor da Global Pays.
| Código HTTP | Descrição |
|---|---|
| 200 OK | Sua requisição foi bem sucedida. |
| 300 | The pubKey was not informed. |
| 310 | The merchantCode was not informed. |
| 320 | Invalid credentials. |
| 330 | Merchant account not found. |
| 340 | The amount entered must be equal to or greater than 1. |
| 350 | Callback redirection routes not informed. |
| 360 | There was an error calculating the values, if the error persists, please contact support |
| 370 | An error occurred when registering the order, if the error persists contact support. |
| 380 | Order id not entered or not numeric. |
| 390 | Merchant account not found. |
| 400 | Order not found. |
| 410 | Invalid token. |
| 420 | Expired token. |
| 429 | Muitas requisições em um curto período de tempo (rate limit). Aguarde antes de tentar novamente. |
Todos os endpoints da Global Pays recebem e respondem em JSON.
Exemplo de resposta para HTTP 300:
{
"statusCode":300,
"statusType":"error",
"msg":"The pubKey field is required"
}
Ambiente de desenvolvimento e testes
| Produção | Sandbox |
|---|---|
| https://api.tryglobalpays.com/v1 | https://apihml.tryglobalpays.com/v1 |
Atenção
- Para o desenvolvimento de sua integração recomendamos que utilize nosso Sandbox. Para tal, você deve primeiramente ter uma conta junto a Global Pays. Após a criação da conta, vá até a opção integrações no menu lateral e gere sua chave de integração, (essa chave é sua chave de produção) clique no botão 'Criar conta teste' e informe uma senha para seu ambiente de testes. Após criada a conta de teste clique em 'Acessar conta teste', você será direcionado para uma tela de login do nosso ambiente de testes, faça login com o mesmo e-mail e com a senha que informou no momento da criação da conta teste, vá até a opção integração no menu lateral e gere sua chave de integração de testes. . Em Sandbox é possível você testar o envio e recebimento de notificações de email. Portanto você não deve usar emails e celulares reais. Para testar o recebimento de notificações você pode utilizar os seus próprios emails e celulares.
Cartão de crédito para testes
Bandeira: Visa
Número do cartao: 4111111111111111
CVV: 123
Validade: 10/2040
Autenticação
Solicitar Token de acesso
Para gerar seu Token, você deve fazer um requisição usando o seu pubKey, gerado no seu ambiente Sandbox. Você deverá usar seu Token em todas as outras requisições em nossa API.
Lembre-se: o Token gerado tem validade de 30 minutos e esta rota não deve ser
usada de forma abusiva — chamadas excessivas podem resultar em bloqueio
temporário (HTTP 429). Veja como validar a expiração do Token na seção Autenticação.
Transações
Os status possíveis de uma transação são os seguintes:
open - Transação está aberta para pagamento (ainda não teve interação do cliente).
pending - O cliente gerou um boleto e a transação está aguardando a quitação do mesmo
analysis - Pagamento efetuado mas está em análise para liberação pelo setor de segurança, (este status não significa que a compra está concluída, pois pode não ser aprovada pelo setor de segurança caso seja identificada alguma inconsistência nos dados).
approved - Pagamento efetuado e liberado pelo setor de segurança, (este status significa que a compra está totalmente liberado e será transferido para a conta bancária do merchant registrada em nosso sistema).
delivered - A compra está totalmente liberada e já foi transferida para a conta bancária do merchant registrada em nosso sistema.
canceled - Pagamento efetivado mas cancelado posteriormente à pedido do cliente ou por não atender aos requisitos de segurança.
aborted - A transação foi abortada antes de sua conclusão(ocorre quando o cliente clica no botão cancelar na tela de pagamento).
Criar nova transação
Para realizar a criação de transações é necessário que já tenha sido gerado um TOKEN de acesso, e este deve ser enviado através do header da requisição com Bearer Token
Split de comissão (commissionSplit)
: Caso deseje
acrescer
um valor de comissão ao valor original da compra
para que seja dividido entre outros merchants. obrigatoriamente a soma das comissões
já
devem estar acrescidas ao valor amount principal, pois esta comissão é subtraída do
valor
a ser repassado para o merchant principal.
Rota de Callback (callback)
: A rota de callback é
utilizada para redirecionar o cliente pagador para seu ambiente, será adicionado a
ela
um parâmetro após o endereço fornecido que é o orderId(Id da ordem que está sendo
processada) ficando assim: https://SEUHOST/seuendpoint?orderId=1234.
OBS: Nesse endereço você deve realizar uma consulta para nossa api seguindo a
instrução que está no tópco "CONSULTAR UMA TRANSAÇÃO",
para confirmar se a transação está paga ou foi cancelada, só então direcionar seu
cliente para sua tela de sucesso ou cancelamento.
Atenção
- O link que é retornado em data.url deverá ser inserido no botão de finalização do seu site ou através de algum outro método de redirecionamento que prefira, para que o cliente seja redirecionado para o ambiente de pagamento da Global Pays.
Consultar uma transação
Para recuperar uma transação específica é necessário que você tenha o
ID (orderId) que a Global Pays retornou no momento da criação dela.
Para acompanhar mudanças de status sem precisar consultar esta rota
repetidamente, utilize os Webhooks — eles notificam automaticamente sua aplicação a cada mudança de status da
transação. Esta rota também possui limite de requisições (rate limit); uso
abusivo (polling agressivo) pode resultar em bloqueio temporário (HTTP 429 - Too Many Requests).
Inativando uma transação
Para inativar uma transação específica é necessário que você tenha o
ID (orderId) que a Global Pays retornou no momento da criação dela.
Consultando valores
Calcular novo valor
Para calcular o valor total de taxas, impostos e valor total a pagar. Nossa API irá retornar os totais por forma de pagamento, PIX, Boleto e cartão de crédito.
Webhooks
O sistema irá enviar notificações HTTP POST para a URL cadastrada na tela de integração na dashboard onde é gerada a chave de integração. As notificações são enviadas somente para as transações criadas a partir da API. Quando o status de uma transação for alterado, você receberá uma requisição na rota cadastrada contendo o conteúdo semelhante ao exemplo abaixo:
Para cadastrar uma rota de webhook, efetue login em sua conta na Global Pays, no menu lateral vá em integrações, nesta tela você pode gerar sua chave de integração, uma vez gerada a chave você verá opções de integração, como está realizando uma integração própria, ative a opção geral e insira sua rota de webhook no campo que irá aparecer.
Exemplo de JSON a ser recebido [POST]A notificação consiste em um POST contendo um JSON, conforme este exemplo:
{
"orderId": 15613,
"order_date": "2023-02-15 12:11:37",
"payment_date": "2023-02-15 19:27:18",
"amount": 598.96,
"invoice": "Invoice text",
"description": "",
"authCode": "99999999999999",
"payment_method": "Cartão de Crédito",
"total_amount_usd": 678.32,
"total_amount_brl": 3833.12,
"netValue": 598.96,
"installment": 6,
"status": "approved",
"client": {
"name": "Naruto Uzumaki",
"email": "rgda@seudominio.com",
"doc": "9999999999",
"phone": "99999999999",
"cep": "99999999",
"address": "Rua",
"numberAddress": "1",
"district": "Bairro",
"city": "Cidade",
"state": "UF"
},
"last_update": "2020-02-15 19:27:18",
"url_checkout": ""
}