Integração de checkout em USDC
Um guia de engenharia realista para integrar pagamentos em USDC no checkout: os padrões de API, a escolha da rede, a idempotência dos webhooks e os modos de falha que vai encontrar em produção.
Em resumo
Uma integração de checkout em USDC segue um padrão conhecido: criar uma intenção de pagamento no seu servidor (montante, moeda, preferências de rede), receber do seu adquirente um URL de checkout alojado ou a configuração de um widget, deixar o comprador pagar na sua carteira e tratar o webhook de confirmação de forma idempotente. As decisões de engenharia mais importantes são a escolha da rede (por predefinição, Solana ou Base, com comissões inferiores a um cêntimo), a idempotência dos webhooks (use o ID da encomenda + o hash da transação), o fluxo de reembolso (recolha o endereço da carteira no checkout e exponha uma API de reembolso) e uma experiência fluida no passo de assinatura na carteira (ligação direta para carteiras móveis, com código QR como alternativa no computador). Bem feito, o checkout em USDC conclui-se em menos de 30 segundos de ponta a ponta e custa ao comerciante 0.3%–1%, consoante o adquirente.
A estrutura padrão da API
As APIs de aceitação de pagamentos em USDC seguem, em termos gerais, o padrão de intenção de pagamento popularizado pela Stripe. A superfície mínima:
O servidor cria a intenção de pagamento
POST /v1/paymentscom um corpo que contémamount,currency(USD se a cotação for em moeda fiduciária; USDC se for em stablecoin),settlement_preference(USDC ou moeda fiduciária),networks(lista de redes permitidas),order_id(a sua chave de idempotência),success_url,cancel_urle um blocometadatapara a sua própria reconciliação.O adquirente devolve o URL de checkout ou a configuração do widget
No checkout alojado: um URL para o qual o comprador é redirecionado. No widget incorporado: uma configuração do lado do cliente (chave publicável, ID da intenção) que o widget carrega. Ambos os fluxos tratam da deteção da carteira, da escolha da rede e da apresentação da cotação.
O comprador assina na carteira e a transferência on-chain é difundida
Telemóvel: ligação direta (deep link) para a MetaMask, a Phantom, a Trust, etc. Computador: código QR da WalletConnect ou janela da extensão do navegador. O comprador verifica o montante e assina.
O adquirente aguarda as confirmações e dispara o webhook
POST your_webhook_urlcom um payload que contémevent_type: “payment.succeeded”,order_id,amount,tx_hash,networke uma assinatura que verifica com o segredo de webhook do adquirente.O servidor marca a encomenda como paga de forma idempotente
Verifique a assinatura do webhook, procure
(order_id, tx_hash)na sua base de dados, marque como paga se ainda não estiver marcada e despache a encomenda.
Escolha da rede
A escolha das redes a aceitar é um compromisso entre experiência de utilização e custo:
- Solana: comissão de rede inferior a um cêntimo, confirmação em menos de um segundo. A melhor opção predefinida para um valor médio de encomenda (AOV) baixo.
- Base: comissão de rede de alguns cêntimos, confirmação em alguns segundos. Bom suporte por parte das carteiras; boa opção predefinida para públicos familiarizados com cripto.
- Polygon, Arbitrum: comissões e velocidade semelhantes às da Base. Podem ser acrescentadas, mas não são estritamente necessárias.
- Mainnet da Ethereum: comissão de rede de $1–$8+, consoante o gas. Penosa para os compradores em encomendas pequenas. Aceite-a para um AOV elevado (acima de $500) ou como alternativa.
- Tron: se o seu alvo são fluxos de USDT na Ásia/África, vale a pena considerar suportar USDT-TRON a par de USDC.
Idempotência dos webhooks
Os webhooks são reenviados. O seu handler tem de ser idempotente. O padrão habitual:
- Verifique a assinatura do webhook com HMAC-SHA256, usando o segredo do seu adquirente.
- Extraia
(order_id, tx_hash)do payload. - Procure esse par na sua tabela
processed_payments. - Se o encontrar: devolva 200 OK sem fazer mais nada.
- Se não o encontrar: insira a linha (com uma restrição UNIQUE sobre o par), depois marque a encomenda como paga na sua tabela principal de encomendas e, por fim, despache a encomenda.
- Envolva os passos 5 numa única transação da base de dados, para que uma falha a meio do fluxo não resulte num despacho em duplicado.
A maioria dos webhooks de aceitação de pagamentos inclui um ID de entrega; registe-o para efeitos de depuração, mas não o use como chave de idempotência. As confirmações da rede e os reenvios do adquirente podem gerar eventos payment.succeeded duplicados, com IDs de entrega diferentes mas o mesmo tx_hash; a sua desduplicação tem de assentar na identidade on-chain, e não na entrega.
Fluxo de reembolso
Predominam dois padrões:
- Reembolso ao remetente: o adquirente devolve os USDC para o endereço a partir do qual o comprador pagou originalmente. É a experiência mais simples; funciona porque o registo on-chain do pagamento contém o endereço de origem.
- Reembolso para um endereço indicado: o comprador indica um destino para o reembolso (que pode ser diferente da origem, se tiver pago a partir de uma exchange ou de uma hot wallet). A maioria dos adquirentes suporta-o através de um
POST /v1/refundscomdestination_address.
O comerciante paga a comissão de rede na etapa do reembolso. São suportados tanto reembolsos totais como parciais. O reembolso em si demora o mesmo tempo de confirmação on-chain que o pagamento original.
Modos de falha em produção
- O comprador desiste depois de assinar. A transferência on-chain é difundida, mas o comprador fecha o separador antes de o webhook ser disparado. O adquirente continua a detetar e a confirmar o pagamento através da monitorização on-chain; o seu despacho é acionado pelo webhook, e não pelo redirecionamento.
- O comprador paga o montante errado. A maioria dos adquirentes rejeita montantes divergentes no momento da deteção on-chain. Alguns aceitam correspondências aproximadas (dentro de uma tolerância) e assinalam a discrepância no webhook.
- O comprador paga na rede errada. Se assinar na Ethereum mas a sua loja só aceitar Solana, o pagamento escapa por completo à monitorização do seu adquirente. A maioria dos fornecedores devolve os fundos através de um processo de recuperação; alguns perdem-nos. Torne a escolha da rede clara no checkout.
- O comprador paga a partir de um endereço de exchange. Os reembolsos para a origem podem ser devolvidos ou chegar à conta errada. Recolha explicitamente um endereço de destino para reembolsos no checkout de qualquer produto em que os reembolsos sejam prováveis.
- Perda de paridade da stablecoin (depeg). Rara, mas real. Se a USDC perder significativamente a paridade durante o breve intervalo entre a cotação e a liquidação on-chain, é o comerciante ou o adquirente que absorve a diferença, consoante o acordo.
Adicione o checkout em USDC com o DPT Acquiring
A partir de 0.3% por transação. Liquidação no próprio dia em USDC ou em moeda fiduciária. URL de checkout alojado ou widget incorporável. Documentação do SDK e dos webhooks em merchant.dpt.xyz.
DPT Acquiring · Vias de integração com Shopify e WooCommerce