Webhook

Webhook é um tipo de método de feedback para informações de pagamento.
Quando o status da fatura muda, uma solicitação de postagem é enviada para o URL_Callback especificado ao criar a fatura.

Resposta

Parâmetros de resposta

NomeDefinição
typeTipo de fatura (carteira / pagamento)
uuidUuid do pagamento
order_idPedido ID em seu sistema (para identificar o pedido)
amountA quantidade da fatura
payment_amountValor realmente pago pelo cliente
payment_amount_usdValor realmente pago pelo cliente em USD
merchant_amountO valor adicionado ao saldo do comerciante, com todas as comissões subtraídas.
commissionMontante da Comissão Cryptomus
is_finalSe a fatura está finalizada. Quando a fatura é finalizada, é impossível pagar uma fatura (é paga ou expirada)
statusStatus do pagamentoOpções disponíveis:confirm_checkpaidpaid_overfailwrong_amountcancelsystem_failrefund_processrefund_failrefund_paid
fromEndereço da carteira do pagador
wallet_address_uuiduuid da carteira estática
networkA rede blockchain na qual o pagamento é feito
currencyMoeda da fatura
payer_currencyA moeda que o cliente realmente pagou
additional_dataString de informações adicionais que você forneceu ao criar uma fatura
convertInformações sobre a moeda para a qual o pagamento serão convertidas automaticamente. A conversão é realizada de pager_currency para USDTO campo convert não existirá se você não tivesse ativado a função de conversão automática para payer_currency (por exemplo, convert btc automático em USDT) Estrutura
txidHash de transação no blockchain.O campo txid não existirá se1) O pagamento foi pago por P2P (o pagador retirou fundos de sua conta Cryptomus para o endereço indicado na fatura e o pagamento foi feito sem blockchain, apenas em nosso sistema)2) O pagamento não foi pago3) Algo estava errado com o pagamento ou o cliente cometeu um erro e nós o marcamos como "pago" manualmente
signAssinatura

Definição

Tipo de fatura (carteira / pagamento)

Definição

Uuid do pagamento

Definição

Pedido ID em seu sistema (para identificar o pedido)

Definição

A quantidade da fatura

Definição

Valor realmente pago pelo cliente

Definição

Valor realmente pago pelo cliente em USD

Definição

O valor adicionado ao saldo do comerciante, com todas as comissões subtraídas.

Definição

Montante da Comissão Cryptomus

Definição

Se a fatura está finalizada. Quando a fatura é finalizada, é impossível pagar uma fatura (é paga ou expirada)

Definição

Status do pagamentoOpções disponíveis:- confirm_check- paid- paid_over- fail- wrong_amount- cancel- system_fail- refund_process- refund_fail- refund_paid

Definição

Endereço da carteira do pagador

Definição

uuid da carteira estática

Definição

A rede blockchain na qual o pagamento é feito

Definição

Moeda da fatura

Definição

A moeda que o cliente realmente pagou

Definição

String de informações adicionais que você forneceu ao criar uma fatura

Definição

Informações sobre a moeda para a qual o pagamento serão convertidas automaticamente. A conversão é realizada de pager_currency para USDTO campo convert não existirá se você não tivesse ativado a função de conversão automática para payer_currency (por exemplo, convert btc automático em USDT) Estrutura

Definição

Hash de transação no blockchain.O campo txid não existirá se1) O pagamento foi pago por P2P (o pagador retirou fundos de sua conta Cryptomus para o endereço indicado na fatura e o pagamento foi feito sem blockchain, apenas em nosso sistema)2) O pagamento não foi pago3) Algo estava errado com o pagamento ou o cliente cometeu um erro e nós o marcamos como "pago" manualmente

Definição

Assinatura

Estrutura de convert

NomeDefinição
to_currencyO código da moeda para o qual o pagamento será convertido
commissionTaxa de conversão
rateTaxa de conversão
amountValor da conversão em to_currency que foi adicionado ao equilíbrio do comerciante, com todas as comissões subtraídas.Quantidade aqui é igual à taxa de merchant_amount *

Definição

O código da moeda para o qual o pagamento será convertido

Definição

Taxa de conversão

Definição

Taxa de conversão

Definição

Valor da conversão em to_currency que foi adicionado ao equilíbrio do comerciante, com todas as comissões subtraídas.Quantidade aqui é igual à taxa de merchant_amount *

Exemplo de resposta


1{
2  "type": "payment",
3  "uuid": "62f88b36-a9d5-4fa6-aa26-e040c3dbf26d",
4  "order_id": "97a75bf8eda5cca41ba9d2e104840fcd",
5  "amount": "3.00000000",
6  "payment_amount": "3.00000000",
7  "payment_amount_usd": "0.23",
8  "merchant_amount": "2.94000000",
9  "commission": "0.06000000",
10  "is_final": true,
11  "status": "paid",
12  "from": "THgEWubVc8tPKXLJ4VZ5zbiiAK7AgqSeGH",
13  "wallet_address_uuid": null,
14  "network": "tron",
15  "currency": "TRX",
16  "payer_currency": "TRX",
17  "additional_data": null,
18  "convert": {
19    "to_currency": "USDT",
20    "commission": null,
21    "rate": "0.07700000",
22    "amount": "0.22638000"
23  },
24  "txid": "6f0d9c8374db57cac0d806251473de754f361c83a03cd805f74aa9da3193486b",
25  "sign": "a76c0d77f3e8e1a419b138af04ab600a"
26}
CÓPIA DE

Verificação de webhook

Como, ao receber webhooks, você está lançando produtos ou creditando os saldos de seus usuários, você precisa garantir que está recebendo webhooks da Cryptomus e não de mais ninguém.

Recomendamos que você verifique os dois lados:

  • Use a lista de permissões de endereço IP e permita que as solicitações usem url_callback apenas do nosso IPS. Enviamos webhooks do IP. 91.227.144.54
  • Verifique a assinatura em todos os webhook que estão chegando ao seu url_callback, leia mais sobre isso abaixo.

Verificando a assinatura da webhook

Suas chaves da API são secretas e ninguém, exceto você e Cryptomus, devem conhecê -las. Portanto, ao verificar a assinatura, você terá certeza de que o webhook foi enviado por Cryptomus.

Criamos um sinal usando este algoritmo. Hash MD5 do corpo da solicitação de postagem codificada na base64 e combinada com sua chave da API.

À medida que a assinatura vem no corpo da solicitação, para verificá -la, você precisa extrair o sinal do corpo de resposta, gerar um hash do corpo e sua chave da API e combiná -lo com o parâmetro de sinal.

Um exemplo no PHP:

Para receber um JSON Data enviado por postagem ao seu manipulador de webhook:


1$data = file_get_contents('php://input');
2$data = json_decode($data, true);
CÓPIA DE

Digamos que recebemos webhook com dados em esse variedade
Primeiro, precisamos extrair o sinal da matriz:


1$sign = $data['sign'];
2unset($data['sign']);
CÓPIA DE

Agora vamos gerar um sinal usando nossa chave de pagamento da API:


1$hash = md5(base64_encode(json_encode($data, JSON_UNESCAPED_UNICODE)) . $apiPaymentKey);
CÓPIA DE

Por fim, podemos verificar se o sinal que geramos com nossa chave de pagamento da API é igual ao sinal que chegou ao webhook.


1if (!hash_equals($hash, $sign)) {
2   return new InvalidHashException();
3}
4
5// or
6
7if ($hash !== $sign) {
8   return new InvalidHashException();
9}
CÓPIA DE

Neste ponto, você pode ter certeza de que o webhook era de Cryptomus e que você recebeu todos os dados corretamente

Há uma diferença ao codificar uma matriz de dados no PHP e em outros idiomas. O PHP escapa barras e alguns outros idiomas não. Portanto, você pode encontrar uma incompatibilidade de sinal. Você precisa escapar de barras com barragem para fazê -lo funcionar corretamente.

em PHP:


1//  data array
2$data = [
3    'amount' => '20',
4    'currency' => 'USDT',
5    'network' => 'tron',
6    'txid' => 'someTxidWith/Slash'
7];
8
9// json data we send to webhooks
10$data = json_encode($data, true);
11echo $data;
12// Outputs a string, slash in txid is escaped, pay attention to this.
13// we send a webhook data with all escaped slashes
14// {"amount":"20","currency":"USD","network":"btc","txid":"someTxidWith/Slash"}
CÓPIA DE

em JS:


1const data = {
2    amount: '20',
3    currency: 'USDT',
4    network: 'tron',
5    txid: 'someTxidWith/Slash'
6};
7
8const jsonData = JSON.stringify(data);
9console.log(jsonData);
10// {"amount":"20","currency":"USDT","network":"tron","txid":"someTxidWith/Slash"}
11// slash in txid is not escaped and you will get error checking sign.
12// Instead, you should do it like this:
13// const jsonData = JSON.stringify(data).replace(///mg, "\/");
14            
CÓPIA DE