Será preciso implementar e expor os endpoints “Authorization” e “ Adjustments” em seu backend para que possamos nos comunicar.
Toda vez que um usuário usa seu cartão em qualquer loja ou e-commerce.
Quando a rede (Mastercard, Visa etc.) solicita a reconciliação de todos os pagamentos apresentados pelos estabelecimentos.
Se houver diferença na reconciliação, solicitaremos uma correção de sua API. Precisaremos que seus endpoints respondam o mais rápido possível para garantir uma boa experiência do usuário. Se a resposta demorar, recusaremos a transação.
Como uma solicitação HTTP pode expirar, precisamos garantir que, ao tentar novamente, seja processada apenas uma vez. Para isso, em cada solicitação, enviaremos um header x-idempotency-key
com uma ID única que deve ser processada com um cache na memória (por exemplo: redis).
No início de cada transação, você terá de verificar se a chave de idempotência que lhe enviamos já está no cache na memória e, dependendo se estiver ou não, você terá de fazer o seguinte:
Será preciso armazenar em cache na memória a relação chave de idempotência → solicitação com um estado em trânsito com um TTL de 3 minutos.
Ao aprovar ou rejeitar a transação, você deverá armazenar em cache o resultado e atualizar o estado da chave de idempotência para concluído
.
Em caso de solicitação duplicada, será necessário verificar o status da transação no cache.
concluído
, você deve responder com um código HTTP 200 com o corpo esperado para o endpoint e completá-lo com o resultado do cache.em trânsito
, você deverá responder com um código HTTP 425 (Too Early: RFC 8470) com o corpo esperado para o endpoint. Voltaremos a verificar a resposta a esta solicitação alguns milissegundos depois.Se você receber uma segunda solicitação com o mesmo ID de idempotencia e a primeira ainda estiver em andamento, você deve responder com um status HTTP 425 e um corpo vazio.
A comunicação entre nossos backends deve ser estritamente segura, pois os endpoints permitirão que os recursos sejam carregados e deduzidos.
Para isso, exigimos que três medidas sejam implementadas:
Toda comunicação conosco deve ser via HTTPS, independentemente de quem emite o certificado.
Estes são alguns dos fornecedores mais reconhecidos
Sempre nos comunicaremos com seu backend a partir de IPs específicos. Recomendamos que você só aceite solicitações dos IPs abaixo e recuse quaisquer outras solicitações:
IPs da Pomelo:
34.226.254.178
44.198.3.59
34.223.185.46
100.20.205.117
34.206.159.176
52.0.20.124
35.84.78.117
52.43.46.111
Para garantir que os únicos participantes da comunicação sejam nossos backends (Pomelo e o Cliente), no momento da integração, forneceremos uma api-key e uma api-secret para assinar digitalmente o conteúdo da comunicação.
O processo será mais ou menos assim:
api-key
e api-secret
.No momento de uma autorização de pagamento, assinamos com hmac-sha256 cada solicitação de autorização com api-secret
.
api-key
da solicitação.api-secret
.Durante o processo de integração, criaremos uma api-key e uma api-secret específicas para você.
Também é possível usar gpg ou algum plugin de e-mail (como https://flowcrypt.com/).
Vejamos um exemplo usando openssl na linha de comando.
$ echo -e 'api-key=$(openssl rand -base64 32)\napi-secret=$(openssl rand -base64 32)' > api-credentials.txt
$ cat api-credentials.txt
api-key=tgeAkX0795jKTxrVR0cJbb//D8UlhHn0KZwTcDG3gyg=
api-secret=un/OHwD+fMN1TTSaEhs0vupQEDQS7DVaUdlNOu7Fpyw=
$ openssl genrsa -out private.pem 2048
$ openssl rsa -in private.pem -pubout -out public.pem
public.pem
por e-mail ou slack.$ openssl rsautl -encrypt -in api-credentials.txt -out api-credentials.txt.enc -inkey public.pem -pubin
api-credentials.txt.enc
por e-mail ou slackapi-credentials.txt.enc
com sua chave privada private.pem
:$ openssl rsautl -decrypt -in api-credentials.txt.enc -inkey private.pem
api-key=tgeAkX0795jKTxrVR0cJbb//D8UlhHn0KZwTcDG3gyg=
api-secret=un/OHwD+fMN1TTSaEhs0vupQEDQS7DVaUdlNOu7Fpyw=
api-secret
em um local seguro e acessível somente pelo aplicativo de autorização de pagamentos
associado à api-key
.Juntamente com a solicitação de autorização ou ajuste, enviaremos headers HTTP com a assinatura, o carimbo de data e hora da assinatura e a api -key para que você possa verificar se a assinatura está correta.
Os headers HTTP que enviamos são:
x-api-key
: este header permitirá identificar qual api-secret deve-se usar, caso vários pares de api-key e api-secret tenham sido configurados.
x-signature
: Este header contém a assinatura digital (body + timestamp + endpoint) que deve ser verificada para garantir a integridade da solicitação. Se a assinatura não corresponder, você deve rejeitar a solicitação.
x-timestamp
: este header contém a hora em que a solicitação foi assinada no formato unix-epoch para que você possa verificar se a assinatura não expirou.
x-endpoint
: o endpoint para o qual a solicitação é realizada. Use este header para gerar novamente a assinatura a ser validada, e compare-o com o endpoint do seu serviço para verificar se eles correspondem.
Importante: além de verificar a assinatura que lhe enviamos, ao gerar a resposta você deve assinar o corpo junto com o carimbo de data/hora e o endpoint de resposta com seu api-secret
depois de impactar a operação. Observe que validaremos a assinatura e recusaremos a transação se a assinatura não corresponder ou tiver expirado.
Você pode testar a implementação do seu back-end com algumas operações típicas que enviaremos com uma coleção Postman incluída em nosso [repositório de exemplos públicos] (https://github.com/pomelo-la/cards-transactions-examples). Você poderá importar a coleção para uma instância do Postman e dessa forma simular pedidos reais para o seu back-end, incluindo o algoritmo de geração e verificação de assinatura.
No repositório você também encontrará exemplos de implementação do algoritmo de geração e validação de assinaturas em vários idiomas.
Esse é um processo opcional, mas recomendamos executá-lo diariamente.
No servidor SFTP que disponibilizaremos, você encontrará os seguintes arquivos:
Contém as informações de cada transação que geramos no dia anterior.
El nombre del archivo tiene el siguiente formato: transaction_yyyy-mm-dd_<nombre cliente>_<pais>.csv
{Atributo} | Descrição | Valores permitidos |
---|---|---|
TRANSACTION_ID | A ID que permite que a transação seja identificada como única. | |
LOCAL_TRANSACTION_DATE_TIME | ||
TRANSACTION_TYPE | Indica o tipo de transação. | PURCHASE WITHDRAWAL EXTRACASH BALANCE_INQUIRY REFUND PAYMENT REVERSAL_PURCHASE REVERSAL_WITHDRAWAL REVERSAL_EXTRACASH REVERSAL_REFUND REVERSAL_PAYMENT |
PRODUCT_TYPE | É o tipo de produto | PREPAID CREDIT DEBIT |
PROVIDER | É a marca do cartão emitido. | VISA MASTERCARD |
AFFINITY_GROUP_ID | ||
USER_ID | A ID de usuário da Pomelo do titular do cartão. | |
CARD_ID | ||
BIN | Os primeiros seis ou oito dígitos do número do cartão. | |
LAST_FOUR | Os últimos quatro dígitos do PAN. | |
ORIGIN | DOMESTIC: a transação ocorreu no país do emissor. INTERNATIONAL: a transação não ocorreu no país do emissor. | |
MERCHANT_ID | ||
MERCHANT_MCC | Código de categoria do estabelecimento, conforme o ISO-18245. | |
MERCHANT_NAME | ||
LOCAL_AMOUNT | É o valor total da transação que deve ser deduzido do saldo do usuário, acrescido de impostos e taxas (quando aplicável). Sempre convertido para a moeda local do cartão. | |
LOCAL_CURRENCY | Código de moeda de LOCAL_TOTAL no ISO_4217 formato ALPHA-3. | |
TRANSACTION_AMOUNT | Valor da transação sem impostos e na moeda original enviada pelo estabelecimento. | |
TRANSACTION_CURRENCY | Código de moeda de TRANSACTION_TOTAL no ISO_4217 formato ALPHA-3. | |
SETTLEMENT_AMOUNT | Valor da transação conforme enviado pela rede. Para a Argentina, sempre será exibido em USD; para os demais países, em moeda local. | |
SETTLEMENT_CURRENCY | O código de moeda SETTLEMENT_TOTAL no formato ISO_4217 ALPHA-3. Para a Argentina, sempre será exibido em USD; para os demais países, em moeda local. | |
ENTRY_MODE | Como o cartão foi usado no ponto de venda do estabelecimento. | UNKNOWN MANUAL CHIP CONTACTLESS CREDENTIAL_ON_FILE MAG_STRIPE OTHERS |
STATUS | O status da transação. | APPROVED REJECTED HELD |
STATUS_DETAIL | Razão adicional por que a transação foi aprovada ou recusada. | Veja a tabela abaixo |
SOURCE | Indica qual fluxo/processo desencadeou a transação, conforme visto pela Pomelo. | ONLINE: origina-se no fluxo transacional a partir de transações em tempo real enviadas pela rede CLEARING: origina-se durante o processo de acordo entre a Pomelo e a rede ao gerenciar o arquivo de liquidação PURGE: transações que não foram apresentadas no arquivo de liquidação de rede. |
ORIGINAL_TRANSACTION_ID | Esse valor pode estar vazio se a transação não estiver relacionada a outra transação. | |
COUNTRY_CODE | Este é o código do país no formato [ISO-3166] (https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes). | |
POINT_TYPE | POS ECOMMERCE ATM MOTO | |
CLIENT_NAME | El nombre del cliente que aprueba o rechaza la transacción, dado que el reporte se segmenta por cliente, va a tener el mismo valor para todas las filas | |
CLIENT_COUNTRY_CODE | El coódigo de país del cliente en formato ISO-3166 | |
AMOUNT_DETAILS | El detalle de la composición del monto local, en el mismo formato que es enviado de forma ONLINE. Codificado en base64 | |
INSTALLMENTS_GRACE_PERIOD | [OPCIONAL*] El período de gracia refiere a la cantidad de meses previo a que comiencen los pagos en cuotas. Puede ir de 0 a 99. | |
INSTALLMENTS_QUANTITY | [OPCIONAL*] La cantidad de cuotas | |
INSTALLMENTS_CREDIT_TYPE | [OPCIONAL*] El tipo de crédito otorgado | NO_PROMOTION WITHOUT_INTEREST WITH_INTEREST BUY_TODAY_PAY_LATER |
*_Para los clientes que operen con crédito, se agregan los datos del contrato de cuotas.
Status detail | Descrição |
---|---|
CARD_BLOCKED | Status do cartão BLOCKED. |
CARD_DISABLED | Status do cartão DISABLED |
CARD_NOT_ACTIVE | Status do cartão EMBOSSED ou CREATED |
CARD_NOT_CONFIGURED | O cartão está sem configurações. |
CARD_NOT_FOUND | Não conseguimos encontrar o PAN do cartão. |
CLIENT_TIMEOUT | O cliente demora a responder. |
CLIENT_UNAVAILABLE | Não é possível conectar com o cliente ou recebemos um 5XX. |
CLIENT_SIGNATURE_ERROR | Quando há falha na assinatura do cliente. |
CRYPTO_ERROR | Há um erro nos criptogramas (EMV). |
DUPLICATE_TRANSMISSION_DETECTED | Recebemos uma transação repetida da rede. |
EXPIRED_CARD | Status do cartão EXPIRED. |
EXTRA_FIELDS | As mensagens da rede vêm com campos inesperados. |
INSUFFICIENT_FUNDS | O cliente responde que a conta não dispõe de recursos. |
INTERNAL_ERROR | Falha imprevista no sistema da Pomelo. |
INVALID_AMOUNT | Os limites do grupo de afinidade foram ultrapassados. |
INVALID_CVV | O CVV não corresponde. |
INVALID_EXPIRATION_DATE | A data de validade recebida não corresponde à do cartão. |
INVALID_MERCHANT | O cliente recusou o merchant por algum motivo específico. |
INVALID_PIN | PIN incorreto |
PIN_TRY_LIMIT_EXCEED | Se ha ingresado incorrectamente el PIN y se excedio el limite de intentos. |
INVALID_TRANSACTION | Transação inválida. |
LOST_CARD | Status do cartão LOST. |
MISSING_FIELDS | As mensagens da rede vêm sem campos obrigatórios. |
NOT_DECLINED | Uma transação vem com um valor de 0 para validar se a conta está ativa. |
ORIGINAL_NOT_FOUND | É feita uma tentativa de reverter uma transação que não encontramos. |
OTHER | Não reconhecemos o caso. |
RESTRICTED_USER | Status do usuário ACTIVE. |
SECURITY_VIOLATION | Excede um limite de fraude. |
SERVICE_UNAVAILABLE | O cliente ou um serviço da Pomelo está inativo. |
STOLEN_CARD | Status do cartão STOLEN. |
SYSTEM_ERROR | O cliente nos indica que teve um erro inesperado. |
APPROVED | O cliente aprovou uma transação. |
TRANSACTION_NOT_PERMITTED | Tipo de transação não permitido no grupo de afinidade. |
REJECTED_FRAUD | A transação foi rejeitada pelo mecanismo de fraude. |
Está na Pomelo? | Está no cliente? | Tem o mesmo status? | Action |
---|---|---|---|
Y | Y | Y | Nada a fazer/Marcar como correspondente |
Y | Y | N | 1) Fazer um ajuste que debite/credite o usuário final, se aplicável. 2) Marcar como corresponte. |
Y | N | N | 1) IF STATUS == APPROVED: Fazer um ajuste que debite/credite o usuário final, se aplicável. 2) Marcar como corresponte. |
N | Y | N | Não é um caso de uso possível. |
Caso você esteja tentando ajustar um crédito a um usuário final que não tenha fundo suficientes na conta, você deve continuar tentando obter os fundos desse usuário.
Torna-se uma dívida entre o cliente e o usuário final.
Contém as informações de cada transação apresentada pelos estabelecimentos no dia anterior.
El nombre del archivo tiene el siguiente formato: presentment_yyyy-mm-dd_<nombre cliente>_<pais>.csv
Atributo | Descrição | Valores permitidos |
---|---|---|
PRESENTMENT_ID | ||
TRANSACTION_ID | A ID da transação original que gerou a apresentação. | |
LOCAL_TRANSACTION_DATE_TIME | ||
TRANSACTION_TYPE | Indica o tipo de transação. | PURCHASE WITHDRAWAL EXTRACASH REFUND PAYMENT |
PRODUCT_TYPE | É o tipo de produto. | PREPAID CREDIT DEBIT |
PROVIDER | É a marca do cartão emitido. | VISA MASTERCARD |
AFFINITY_GROUP_ID | ||
USER_ID | A ID de usuário da Pomelo do titular do cartão | |
CARD_ID | ||
BIN | Os primeiros seis ou oito dígitos do número do cartão. | |
LAST_FOUR | Os últimos quatro dígitos do PAN. | |
ORIGIN | DOMESTIC: a transação ocorreu no país do emissor. INTERNATIONAL: a transação não ocorreu no país do emissor. | |
MERCHANT_ID | ||
MERCHANT_MCC | Código de categoria do estabelecimento, conforme o ISO-18245. | |
MERCHANT_NAME | ||
TRANSACTION_AMOUNT | Valor da transação sem impostos e na moeda original enviada pelo estabelecimento. | |
TRANSACTION_CURRENCY | Código de moeda de TRANSACTION_TOTAL no ISO_4217 formato ALPHA-3. | |
SETTLEMENT_AMOUNT | O valor da transação apresentado pela marca. | |
SETTLEMENT_CURRENCY | O código de moeda SETTLEMENT_AMOUNT no formato ISO_4217 ALPHA-3. Para a Argentina, sempre será exibido em USD; para os demais países, em moeda local. | |
DEBT_AMOUNT | Valor da transação na moeda a ser paga à Pomelo. Se o valor for devido à Pomelo, sempre é um valor positivo; caso contrário, será um valor negativo. | |
DEBT_CURRENCY | O código da moeda de DEBT_AMOUNT no ISO_4217 formato ALPHA-3; se for uma transação doméstica, deverá ser paga em moeda local, caso contrário em USD. | |
RECONCILIATION_DATE | ||
INTERCHANGE_FEE | Comissão por uma transação | |
INTERCHANGE_RATE | Valor alfanumérico que identifica a taxa de câmbio da transação apresentada pelo adquirente. | |
TAX | Imposto associado à taxa de câmbio, devido à regulamentação local. Esses valores devem ter um IVA (imposto sobre valor agregado) calculado.. | |
FUNCTION_CODE | Esse é o tipo de apresentação. | FIRST_PRESENTMENT SECOND_PRESENTMENT_FULL SECOND_PRESENTMENT_PARTIAL |
REVERSE_PRESENTMENT | Significa que a apresentação foi revertida a partir da rede. | TRUE FALSE |
REASON_CODE | Motivo da segunda apresentação. | |
ICA_ACQUIRER | ||
TAX_ID | ID asociado a los impuestos de la transacción | |
INSTALLMENTS_GRACE_PERIOD | [OPCIONAL*] El período de gracia refiere a la cantidad de meses previo a que comiencen los pagos en cuotas. Puede ir de 0 a 99. | |
INSTALLMENTS_QUANTITY | [OPCIONAL*] La cantidad de cuotas | |
CURRENT_INSTALLMENT | [OPCIONAL*] Indica qué número de cuota está pagando el cliente. | |
INSTALLMENTS_CREDIT_TYPE | [OPCIONAL*] El tipo de crédito otorgado | NO_PROMOTION WITHOUT_INTEREST WITH_INTEREST BUY_TODAY_PAY_LATER |
USD_EXCHANGE_RATE | Indicará a taxa de câmbio do Banco Nacional no fim do dia anterior | |
DEBT_AMOUNT_ARS | Campo do valor da dívida expresso em ARS, utilizando a taxa de câmbio vezes o valor da dívida. Caso o Valor da Dívida já esteja em ARS, a multiplicação não é realizada |
*_Para los clientes que operen con crédito, se agregan los datos del contrato de cuotas.
Nossa equipe financeira enviará uma notificação diariamente com a dívida a ser paga. Essa notificação terá todas as apresentações que recebemos no arquivo de apresentação.
Forneceremos um servidor SFTP de onde será possível baixar os arquivos de Transações e Apresentações.
Dispomos de dois ambientes para osw servidores SFTP, um de produção e outro de desenvolvimento.
Para se conectar aos servidores SFTP, precisaremos que você nos envie uma chave pública para gerar um usuário.
Aqui estão os dados para se conectar a cada ambiente:
Host: sftp.pomelo.la
Porta: 22
Usuário: <tu_usuario> # aquele que geramos a partir de suas chaves públicas.
Host: sftp-dev.pomelo.la
{Puerto}: 22
Usuário: <tu_usuario> # aquele que geramos a partir de suas chaves públicas.
Para gerar a chave pública, você terá de usar o comando de acordo com seu sistema operacional:
$Cliente
pelo nome própriossh-keygen -t rsa -b 2048 -C $Cliente
O comando criará um par de chaves RSA de 2048 bits por padrão. Você também pode criar uma chave maior, de 4096 bits, inserindo -b 4096.
O comando produz a seguinte saída:
Generating public/prive rsa key pair.
Digite um arquivo onde salvar a chave (/your_home/.ssh/id_rsa):
Pressione Enter
para salvar o par de chaves em .ssh /, ou especifique outro local.
Pressione Enter
para deixá-la em branco e use apenas a chave para estabelecer conexões SSH. Insira uma senha para uma camada extra de segurança.
cat ~/.ssh/id_rsa.pub
A chave gerada começará com ssh-rsa.
Agora, você pode copiar e colar sua chave SSH pública em seu console Shell ou em qualquer servidor para estabelecer uma conexão segura.
Gere chaves SSH, usando PuTTY. Instale o PuTTY na página do desenvolvedor: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Instale o PuTTY na página do desenvolvedor: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
puttygen
.PuTTYgen
.Executar como administrador
.Sim
se o sistema gerar a seguinte consulta: Deseja permitir que este aplicativo faça alterações em seu dispositivo?
Embora a ferramenta de geração de chaves PuTTY ofereça vários outros algoritmos, mostraremos como gerar chaves RSA, uma das mais usadas:
Gerar
.Salvar chave pública
. Você terá, então, de escolher um local para salvar a chave e dar um nome à chave.Conversões
, na parte superior da tela.Sim
.O endpoint /transactions/authorizations
permite autorizar transações.
Enviaremos uma solicitação para autorizar ou recusar a transação.
Esperamos uma resposta rápida para garantir uma boa experiência. Se a resposta demorar, recusaremos a transação.
O endpoint /transactions/adjustments/{type}
permite que você faça ajustes de crédito e débito nas transações.
Enviaremos uma solicitação para informar que a rede (MC, VISA) forçou uma autorização.
Este endpoint é utilizado durante a conciliação e fluxos on-line, principalmente para ajustes durante o processo de liquidação e também em caso de devoluções.
Este serviço permite que você notifique quando uma transação é resolvida, seja pela Pomelo ou pela bandeira (Mastercard, Visa, etc.).
Esperamos uma resposta do tipo 2XX para termos certeza de que a notificação foi recebida. Caso contrário, vamos enviá-la novamente.