Global Pays - Manual API

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.

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

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.

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": ""
}