Pular para o conteúdo principal
Nesta página

O Widget de Pagamento exibe os métodos de pagamento disponíveis para um pedido existente e processa o método selecionado através da DEUNA. Ele suporta cartões e métodos de pagamento alternativos configurados, sem expor credenciais sensíveis ao JavaScript do comerciante.

Antes de começar#

Complete Comece a usar o SDK WebCrie o pedido no seu backend e retorne apenas o order_token para o navegador.

Abrir widget de pagamento#

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  language: 'en',
  callbacks: {
    onSuccess: async () => {
      await DeunaSDK.close();
      await verifyOrderOnBackend();
    },
    onError: ({type, metadata}) => {
      showRecovery({type, code: metadata.code});
    },
    onClosed: (action, metadata) => {
      restorePaymentMethods(action, metadata);
    },
    onCardBinDetected: ({cardBin, cardBrand}) => {
      updateCardOffers(cardBin, cardBrand);
    },
    onInstallmentSelected: ({cardBin, installmentPlanOptionId}) => {
      rememberPlan(cardBin, installmentPlanOptionId);
    },
    onPaymentProcessing: () => disableDuplicateActions(),
    onEventDispatch: (event, payload) => trackSafeEvent(event, payload),
  },
});

Sequência de integração#

01 · server
Criar o pedido
Calcule os totais e obtenha o token de pedido.
02 · browser
Abrir widget de pagamento
Envie o token e a configuração do cliente suportada.
03 · SDK
Processe o método selecionado
Gerencie a validação, o desafio, o provedor e o comportamento de ciclo de vida.
04 · server
Verifique e realize
Use o estado de pedido autorizado.

Parâmetros#

ParâmetroObrigatórioObjetivo
orderTokenSimToken retornado quando seu backend criou a ordem.
callbacksNão, recomendadoSucesso, erro, fechar, redimensionar, pagamento, BIN, parcelamento e manipuladores de eventos.
languageNãoen, es, ou pt; caso contrário, as configurações padrão do comerciante são aplicadas.
userTokenNãoContexto de usuário DEUNA autenticado para métodos de pagamento salvos elegíveis.
paymentMethodsNãoRestringe ou abre diretamente os métodos configurados. Não codifique os processadores usados na roteamento, a menos que seja necessário.
mode + targetNãoRenderize dentro de um elemento correspondente, em vez do modal padrão. Ambos são necessários para o modo de destino.
hidePayButtonNãoEsconde a ação do widget quando sua página é responsável pela submissão.
styleFileNãoIdentificador de tema/estilo gerenciado pela DEUNA ou recurso de estilo aprovado.
widgetExperienceNãoTemas e sobreposições de experiência do usuário suportados.
behaviorNãoComportamentos de fluxo suportados, como cartões divididos ou redirecionamentos de popup.
fraudCredentialsNãoConfiguração de provedor de fraude aprovada apenas.
sessionId, idempotencyKeyNãoControles de correlação e tentativas duplicadas para fluxos suportados.
domainNãoOverride de ambiente controlado; omitir no uso normal em produção.

Modal ou incorporado#

O modal é o padrão. Para o modo incorporado:

HTML
<div id="deuna-payment" aria-label="Detalhes de pagamento"></div>
JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  mode: 'target',
  target: '#deuna-payment',
  callbacks: {
    onResize: ({height}) => {
      document.querySelector('#deuna-payment').style.height = `${Math.ceil(height)}px`;
    },
    onSuccess: verifyOrderOnBackend,
    onError: showRecovery,
  },
});

O seletor deve corresponder a um elemento estável. Não renderize dentro de um elemento que esteja display: none em execução durante a inicialização ou que cause overflow.

Filtrar métodos de pagamento#

Omita paymentMethods para permitir que a ordem e a configuração do comerciante determinem a elegibilidade. Forneça um método para abrir seu formulário diretamente, ou vários métodos para restringir a escolha.

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  paymentMethods: [
    {paymentMethod: 'credit_card'},
    {paymentMethod: 'wallet', processors: ['click_to_pay']},
  ],
  callbacks,
});

O roteamento pode escolher entre os processadores de cartão configurados, portanto, a entrada de cartão de crédito normalmente não precisa de processors list.

Controle do botão de envio#

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  hidePayButton: true,
  callbacks,
});

payButton.addEventListener('click', async () => {
  if (!(await DeunaSDK.isValid())) return;

  payButton.disabled = true;
  const result = await DeunaSDK.submit();
  if (result.status === 'error') showRecovery(result);
  payButton.disabled = false;
});

A instância ativa também expõe getWidgetState(), getSelectedPaymentMethod(), refetchOrder(), setOrderData(...), setCustomStyles(...)e close(). Use apenas os métodos relevantes para a experiência ativa e serializa as atualizações para que um token de ordem antigo não sobrescreva uma nova finalização.

Divisão de cartões e parcelamento#

Utilize o comportamento aninhado documentado para um fluxo de duas cartões configurado:

JavaScript
behavior: {
  paymentMethods: {
    creditCard: {
      splitPayments: {maxCards: 2},
    },
  },
}

Veja Dividir pagamentos com cartão para reconciliação e testes. Utilize onInstallmentSelected para o comportamento exato installmentPlanOptionId; nunca o derive de informações visíveis.

Tratamento de erros e encerramento#

Diagrama de fluxo
1Widget outcome2-- No3Verify order onbackend4-- No, closed orinterrupted5Map type andmetadata code torecovery6Retrieve orderbefore retry7Render verifiedstate
Revisão ou pendente

Não exiba mensagens brutas do provedor. Mapeie os tipos e códigos conhecidos para orientações personalizadas do cliente, registre diagnósticos seguros e utilize uma mensagem de repetição genérica.