Payou

Desenvolvedores

Seis endpoints, uma assinatura, nenhum SDK.

Requisições HTTP assinadas contra endpoints simples. Use a página de pagamento hospedada ou peça os dados de pagamento em JSON e monte o seu próprio checkout — nos dois casos o resultado chega até você como um único webhook assinado.

GET/api/new/api.php
# Solicita os dados de pagamento - a assinatura é montada a partir da sua senha de lojista
# hash = md5(id : summ : password : sistems : order_id)
HASH=$(printf '%s' "5:100.00:$PAYOU_PASSWORD:card_RUB:4444" | md5sum | cut -d' ' -f1)

curl -G https://payou.pro/api/new/api.php \
  --data-urlencode id=5 \
  --data-urlencode sistems=card_RUB \
  --data-urlencode summ=100.00 \
  --data-urlencode order_id=4444 \
  --data-urlencode user_code=1 \
  --data-urlencode user_email=[email protected] \
  --data-urlencode hash="$HASH"
Requisição
AUTENTICAÇÃO
WEBHOOKS
PASSO 01

Obtenha suas credenciais de lojista

Cadastre-se, adicione o seu site e envie para moderação. Depois de aprovado, o ID do lojista e a senha secreta ficam no painel.

PASSO 02

Assine e envie

Monte o hash com o ID do lojista, o valor, o segredo, o método e o ID do pedido e chame o endpoint. O valor é uma string decimal com ponto.

PASSO 03

Receba o webhook

A Payou envia o resultado para a sua URL com uma assinatura. Confira a assinatura, responda MERCHANT_ORDER_ID|success e credite o pedido uma só vez.

AUTENTICAÇÃO

ID do lojista e senha secreta

As requisições são assinadas, não autenticadas por token: não existe cabeçalho de autorização. O hash é um md5 sobre o ID do lojista, o valor, a sua senha secreta, o método e o ID do pedido, de modo que o segredo em si nunca trafega. Os repasses usam uma chave de API separada, assinada com HMAC-SHA256.

VALORES

String decimal com ponto

O valor é enviado como uma string decimal com ponto como separador — 100.00, nunca 100,00. A mesma string entra na assinatura, então uma diferença de formatação quebra o hash, e não o pagamento.

ID DO PEDIDO

A sua referência é a chave

order_id é o seu próprio identificador. É por ele que o endpoint de status faz a busca, é ele que o webhook devolve para você e é contra ele que você concilia — por isso precisa ser único do seu lado.

WEBHOOKS

POST de formulário assinado

A Payou envia AMOUNT, status, intid, MERCHANT_ORDER_ID e SIGN para a sua URL como application/x-www-form-urlencoded. Verifique o SIGN e responda MERCHANT_ORDER_ID|success — qualquer outro corpo é tratado como não entregue.

STATUS

Consulte ou aguarde o webhook

Duas consultas: uma pelo id da transação na Payou, outra pelo seu order_id. As duas respondem com id, order_id, status, paysys e summ, então uma rotina de conciliação não precisa de mais nada.

PRODUÇÃO

A integração acontece em produção

Não existe um host de sandbox separado. Você integra direto nos endpoints do ambiente de produção, com uma conta de lojista liberada depois da moderação.

Endpoints

Toda a superfície de uma primeira integração. As chamadas de pagamento são assinadas com a sua senha de lojista; os repasses usam uma chave de API separada e HMAC-SHA256.

Método Endpoint Finalidade
GET /sci/v1/ Página de pagamento hospedada — envie o pagador para cá
GET /api/new/api.php Dados de pagamento em JSON, para o seu próprio checkout
GET /api/status Status do pagamento pelo id da transação na Payou
GET /api/status2 Status do pagamento pelo seu order_id
POST /api/new/confirm_payment.php O pagador confirma ou cancela um pagamento
POST /api/payout_create.php Cria um repasse para um cartão ou uma conta

API

Uma requisição assinada. Os dados de pagamento voltam em JSON.

País e método são parâmetros da mesma chamada, não integrações separadas. A rota por trás deles é escolhida pela camada.

GET/api/new/api.php

Requisição

# Solicita os dados de pagamento - a assinatura é montada a partir da sua senha de lojista
# hash = md5(id : summ : password : sistems : order_id)
curl -G https://payou.pro/api/new/api.php \
  --data-urlencode id=5 \
  --data-urlencode sistems=card_RUB \
  --data-urlencode summ=100.00 \
  --data-urlencode order_id=4444 \
  --data-urlencode user_code=1 \
  --data-urlencode hash="$HASH"

Resposta

# HTTP 200 · application/json
{
  "id":           "3874512",
  "card":         "0000 0000 0000 0000",
  "wallet_owner": "CARDHOLDER NAME",
  "sbp_bank":     "BANK NAME",
  "amount":       "100.00"
}

Resposta de demonstração. Nenhum valor real é movimentado.

Credenciais, referência, primeira requisição.

A documentação é aberta — não é preciso reunião de vendas para começar a ler nem para desenvolver sobre os endpoints.