API para padronização de provedores de pagamentos PiX
Este é um projeto de codigo aberto que tem como base a biblioteca ThunderPix que padroniza as APIs dos maiores provedores e gateways de pagameto nacionais. O projeto tem como objetivo, fornecer uma interface simples para desenvolvimento de aplicações q utilizem uma das APIs listadas
Este serviço de API está construido em NextJs na versão 14.2. Recomendamos o deploy do serviço na vercel. Caso ja tenha uma conta, basta fazer deploy clicando no botão abaixo.
Caso deseje executar em um ambiente de desenvolvimento, execute os seguntes comandos:
git clone https://github.com/vhratts/thunderpix.git
npm install
npm run dev
Seguido os passos, a aplicação vai estar rodando no endereço localhost:3000
Com o servidor no ar, é possivel acessar os endpoints da API.
Basicamente o servidor constroi o provider
e method
usando biblioteca thunderpix
conectado a Api nativa do provedor de pagamento e "modificando" a saída da API para um padrão.
- AVISO: Nem todos os metodos e provedores estão devidamente listados. Consulte a tabela de refêcia da biblioteca para saber se o metodo ou provedor de pagamentos q deseja usar estão disponiveis.
Cada provedor possui seu metodo de autenticação
definido, o servidor thunder-cash
apenas padroniza
o metodo de autenticação seja Basic Auth
, OAuth
, JWT
entre outros.
Sempre que efetuar uma chamada, Seja POST
ou GET
, lembre-se de passar as credenciais no cabeçalho
.
No exemplo abaixo, vamos gerar um QrCode PIX de R$ 19.99 com javascript & axios.
import axios from "axios";
(async () => {
var { data } = await axios.post(
"http://localhost:3000/api/Primepag/pix/create/qrcode",
{
valueCents: 1999, // se desejar, pode usar 19.99
expires: 3600, // expira em 3600 segundos (Uma Hora)
},
{
/**
* Insira as credências do seu
* provedor de pagamento
*/
headers: {
clientId: "ac536f63-...",
clientSecret: "38da4a8d-...",
},
}
);
console.log(data);
})();
O retorno esperado é um JSON com as seguintes chaves:
{
"qrcode": "base64data:image/png;base64...", // imagem no formato Base64
"pixkey": "00020101021226930014br.gov.bcb....", //Chave Pi Copia-e-cola
"value": {
"original": 41.55, // Valor solitado na request
"cents": 4155, // Valor em centavos
"fixed": "41.55", // Valor em ponto fixo (2)
"float": 41.55 // Valor em ponto flutuante (8)
},
"expires": {
"timestamp": 1729729729, // timestamp de expiração
"dateTime": "24/10/2024, 00:28:49", // Data/Hora GMT-3
"iso": "2024-10-24T00:28:49.000Z" // Data/Hora formato ISO
},
"code": "kk6g232xel65a0daee4dd13kk4000119195" // Codigo Unico
}
O projeto mantem a simplicidade na construção das rotas. O desenho de chamadas consiste em obter dinamicamente:
- Provedor de pagamento (provider)
- Metodo de pagamento (method)
- Metodo de chamada (create ou read)
Onde as rotas podem ser resumidas em:
# Requisição Metodo POST
# Chamas de modificam ou criam dados no provedor
http://localhost:3000/api/[provider]/[method]/create
# Requisição Metodo GET
# Chamadas de leitura ou consulta de dados
http://localhost:3000/api/[provider]/[method]/read
Lista de provedores suportados na versão mais atual
Nome do provedor | Slug do Provedor | Metodos | chamadas |
---|---|---|---|
Banco Central do Brasil | Bacem | pix | api/Bacem/pix |
Banco Primepag | Primepag | pix | api/Primepag/pix |
Mercado Pago SA | MercadoPago | pix | api/MercadoPago/pix |
PicPay SA | PicPay | pix | api/PicPay/pix |
Pagar-me | Pagarme | pix | api/Pagarme/pix |
OpenPix SA | OpenPix | pix | api/OpenPix/pix |
Cielo | Cielo | pix | api/Cielo/pix |
Asaas | Asaas | pix | api/Asaas/pix |
Zendry | Zendry | pix | api/Zendry/pix |
- IMPORTANTE: Ao decorrer do desenvolvimento deste serviço essa tabela pode ser modificada, adicionando ou removendo Metodos e provedores de pagamento
Para obter o saldo de um provedor, basta efetuar a seguinte chamada:
import axios from "axios";
(async () => {
var { data } = await axios.get(
"http://localhost:3000/api/[provider]/[method]/create/balance",
{
/**
* Insira as credências do seu
* provedor de pagamento.
*/
headers: {
/**
* Chaves de autenticação aqui
* utilize o formato de objeto chave: valor
* em um dos formatos abaixo
* - token
* - basic
* - clientid
* - clientsecret
* - pixkey
*/
token: "7c5fsda1-...",
},
}
);
console.log(data);
})();
Retorno esperado da chamada:
{
"valueCents": 4155,
"valueFloat": 41.55
}
Para gerar um novo QrCode de cobrança, efetue a seguinte chamada
import axios from "axios";
(async () => {
var { data } = await axios.post(
"http://localhost:3000/api/[provider]/[method]/create/qrcode",
{
/**
* Insira as credências do seu
* provedor de pagamento.
*/
valueCents: 5945, // R$ 59,45
expires: 300, // Expira em 5 min
},
{
headers: {
/**
* Chaves de autenticação aqui
* utilize o formato de objeto chave: valor
* em um dos formatos abaixo
* - token
* - basic
* - clientid
* - clientsecret
* - pixkey
*/
token: "7c5fsda1-...",
},
}
);
console.log(data);
})();
Retorno esperado da chamada:
{
"qrcode": "base64data:image/png;base64...", // imagem no formato Base64
"pixkey": "00020101021226930014br.gov.bcb....", //Chave Pi Copia-e-cola
"value": {
"original": 59.45, // Valor solitado na request
"cents": 5945, // Valor em centavos
"fixed": "59.45", // Valor em ponto fixo (2)
"float": 59.45 // Valor em ponto flutuante (8)
},
"expires": {
"timestamp": 1729729729, // timestamp de expiração
"dateTime": "24/10/2024, 00:28:49", // Data/Hora GMT-3
"iso": "2024-10-24T00:28:49.000Z" // Data/Hora formato ISO
},
"code": "kk6g232xel65a0daee4dd13kk4000119195" // Codigo Unico
}
Caso precise buscar / consultar um QrCode gerado, utilize a chave de referência ou code
gerado pelo seu provedor de pagamento.
Para Efetuar uma consulta de QrCode, efetue uma chamada GET
passando como parametro query a chave reference
com valor code
.
import axios from "axios";
(async () => {
var { data } = await axios.get(
"http://localhost:3000/api/[provider]/[method]/read/qrcodes?reference=kk6g232xel65a0daee4dd13kk4000119195",
{
headers: {
/**
* Chaves de autenticação aqui
* utilize o formato de objeto chave: valor
* em um dos formatos abaixo
* - token
* - basic
* - clientid
* - clientsecret
* - pixkey
*/
token: "7c5fsda1-...",
},
}
);
console.log(data);
})();
O retorno esperado da chamada caso o pagamento ainda não tenha sido processado:
{
"referenceCode": "kk6g232xel65a0daee4dd13kk4000119195",
"valueCents": 5945,
"content": "00020126870014br.gov.bcb....",
"status": "awaiting_payment",
"generatorName": null,
"generatorDocument": null,
"payerName": null,
"payerDocument": null,
"payerBankName": null,
"payerAgency": null,
"payerAccount": null,
"payerAccountType": null,
"registrationDate": "2024-10-20T13:22:59.000-03:00",
"paymentDate": null,
"endToEnd": null
}
O retorno esperado da chamada após o pagamento ter sido processado:
{
"referenceCode": "kk6g232xel65a0daee4dd13kk4000119195",
"valueCents": 5945,
"content": "00020126870014br.gov.bcb....",
"status": "complete",
"generatorName": "Victor...Ratts",
"generatorDocument": "057...60",
"payerName": "Roberto...Silva",
"payerDocument": "018...50",
"payerBankName": "Nubank SA",
"payerAgency": "0001",
"payerAccount": "023...99",
"payerAccountType": "debit",
"registrationDate": "2024-10-20T13:22:59.000-03:00",
"paymentDate": "2024-10-20T13:31:20.000-03:00",
"endToEnd": "0221aca45c4a41b46bf8cda8c18a74"
}
Para listar os QrCodes Gerados pelo provedor de pagamento, é necessario efetuar uma chamada GET
simples passando as credenciais de autenticação do seu provedor.
- IMPORTANT: Sempre passe a flag "type" como "input" caso queira oter apenas as transações de entrada.
import axios from "axios";
(async () => {
var { data } = await axios.get(
"http://localhost:3000/api/[provider]/[method]/read/transactions?type=input",
{
headers: {
/**
* Chaves de autenticação aqui
* utilize o formato de objeto chave: valor
* em um dos formatos abaixo
* - token
* - basic
* - clientid
* - clientsecret
* - pixkey
*/
token: "7c5fsda1-...",
},
}
);
console.log(data);
})();
Se precisar de um filtro mais especifico, como filtro de data por exemplo, você pode efetuar uma chamada
POST
para a mesma rota, passando como corpo:
{
"page": 1, // Numero da pagina consultada.
"registrationDateStart": "2024-10-01T00:00:00Z", // Data/hora inicial do filtro em Formato ISO.
"registrationDateEnd": "2024-10-24T00:00:00Z" // Data/hora final do filtro em Formato ISO.
}
A chamada retorna um json com um array contendo os itens solicitados pela consulta.
[
// ...
{
referenceCode: "5dda700c96475b8...",
valueCents: 4999,
content: "00020126870014br.gov.bcb....",
status: "awaiting_payment", // Os metodos de status variam de provedor para provedor.
generatorName: null,
generatorDocument: null,
payerName: null,
payerDocument: null,
registrationDate: "2024-10-20T13:22:59.000-03:00",
paymentDate: null,
endToEnd: null,
},
// ...
];
Para listar as saídas, saques ou retiradas gerados pelo provedor de pagamento, é necessario efetuar uma chamada GET
simples passando as credenciais de autenticação do seu provedor.
- IMPORTANT: Sempre passe a flag "type" como "output" caso queira oter apenas as transações de saída.
import axios from "axios";
(async () => {
var { data } = await axios.get(
"http://localhost:3000/api/[provider]/[method]/read/transactions?type=output",
{
headers: {
/**
* Chaves de autenticação aqui
* utilize o formato de objeto chave: valor
* em um dos formatos abaixo
* - token
* - basic
* - clientid
* - clientsecret
* - pixkey
*/
token: "7c5fsda1-...",
},
}
);
console.log(data);
})();
Se precisar de um filtro mais especifico, como filtro de data por exemplo, você pode efetuar uma chamada
POST
para a mesma rota, passando como corpo:
{
"page": 1, // Numero da pagina consultada.
"registrationDateStart": "2024-10-01T00:00:00Z", // Data/hora inicial do filtro em Formato ISO.
"registrationDateEnd": "2024-10-24T00:00:00Z" // Data/hora final do filtro em Formato ISO.
}
A chamada retorna um json com um array contendo os itens solicitados pela consulta.
[
// ...
{
referenceCode: "5dda700c96475b8...",
valueCents: 4999,
content: "00020126870014br.gov.bcb....",
status: "awaiting_payment", // Os metodos de status variam de provedor para provedor.
generatorName: null,
generatorDocument: null,
payerName: null,
payerDocument: null,
registrationDate: "2024-10-20T13:22:59.000-03:00",
paymentDate: null,
endToEnd: null,
},
// ...
];
- IMPORTANTE: Essa funcionalidade depende do provedor de pagamento que voce escolher. alguns provedores não suportam a função de
Saque
ouTransferência
por API. Portanto, considere colsultar a tabela de provedores e suporte para saer se seu provedor suporta essa função
Para efetuar um saque, trasferência ou retirada a partir do provedor de sua escolha,
efetue uma chamada POST
passando no corpo, as informações para o saque.
import axios from "axios";
(async () => {
var { data } = await axios.post(
"http://localhost:3000/api/[provider]/[method]/create/transaction",
{
initiationType: "dict", // escolha entre 'dict' para automatico ou 'manual'
idempotentId: "67017be8-...-e687aa450cfd", // Chave ou codigo unico gerado pelo seu sistem
valueCents: 1400, // Valor em centavos que deseja transferir (R$ 14,00)
receiverName: "Victor ... Ratts", // Nome do beneficiario
receiverDocument: "057...60", // Documento do beneficiario
pixKeyType: "cpf", // tipo do documento
pixKey: "057...60", // chave PIX
authorized: true, // Autorização automatica (Caso seu provedor suporte)
},
{
/**
* Insira as credências do seu
* provedor de pagamento
*/
headers: {
clientId: "ac536f63-...",
clientSecret: "38da4a8d-...",
},
}
);
console.log(data);
})();
Caso tudo tenha ocorrido certo, chamada executa a seguinte resposta:
{
"idempotent_id": "67017be8-8f88-8001-8b65-e687aa450cfd",
"value_cents": 1400,
"receiver_name": "Victor...Ratts",
"receiver_document": "057...60",
"pix_key": "057...60",
"pix_key_type": "cpf",
"reference_code": "PE2024...96942",
"status": "completed"
}
Desenvolvedor: Victor Ratts
Email: [email protected]
site: vratts
Pix: 91b7482c-3ef1-4eff-8d80-9a59c87773a8