Worldfy PaymentsWorldfy Payments
SuporteDashboard
GuiaAPI Reference
SuporteDashboard

Começando

IntroduçãoAutenticaçãoErrosPaginação e Filtros
Cobranças
Visão GeralMétodos de PagamentoCaptura e Estorno
Financeiro
RecebíveisAntecipaçõesCarteiras e ExtratosSaques
Configuração
Chaves de APIRecebedores
SDK de Segurança
Visão geralTokenizaçãoAutenticação 3DSAnálise de fraudeFluxo simplificadoFluxo completoErrosProdução e segurança
Webhooks
Visão GeralConfiguraçãoRetentativas
Eventos
Eventos de CobrançasEventos de Saques

Análise de fraude

Colete o fingerprint do dispositivo via ThreatMetrix para alimentar a análise antifraude CyberSource.

Fluxo completo

Integre tokenização, 3D Secure e análise de fraude em um fluxo de pagamento ponta a ponta.

SDK de Segurança

Fluxo simplificado

Execute o fluxo completo de pagamento com uma única chamada: análise de fraude, tokenização e 3DS em um só método.

O que é

O método preparePayment() encapsula todas as etapas do fluxo de pagamento em uma única chamada. Internamente, ele orquestra:

  1. Análise de fraude — coleta fingerprint do dispositivo (ThreatMetrix)
  2. Tokenização — substitui os dados do cartão por um token seguro
  3. Autenticação 3DS — verifica a identidade do portador junto ao emissor

Etapas indisponíveis para o merchant (por configuração ou falta de conexão com adquirente) são automaticamente ignoradas.

disponível indisponível disponível indisponível preparePayment() Fraud Analysis? Coleta fingerprint Skip Tokenização 3DS? Autenticação Skip result

Este é o método recomendado para a maioria das integrações. Use os controladores individuais (tokenizer, threeds, fraudAnalysis) apenas quando precisar de controle granular sobre cada etapa.

Uso básico

import { Client } from '@worldfy/security-sdk';

const client = new Client({
  publicKey: 'pk_live_sua_chave',
});
await client.initialize();

const result = await client.preparePayment({
  amount: 15000,
  currency: 'BRL',
  installments: 1,
  card: {
    number: '4000000000002701',
    holderName: 'COMPRADOR TESTE',
    expirationMonth: '12',
    expirationYear: '2030',
    cvv: '123',
  },
  customer: {
    name: 'Comprador Teste',
    email: 'teste@email.com',
    phone: '5511999999999',
  },
  address: {
    street: 'Rua Exemplo',
    number: '123',
    neighborhood: 'Centro',
    city: 'São Paulo',
    state: 'SP',
    zipCode: '01310100',
    country: 'BR',
  },
});

if (result.success) {
  // Envie ao backend para criar a cobrança
  await criarCobranca({
    payment_details: { token: result.token, installments: 1 },
    fraud_session_id: result.fraudSessionId,
    three_ds: result.threeds && {
      cavv: result.threeds.cavv,
      eci: result.threeds.eci,
      xid: result.threeds.xid,
      version: result.threeds.version,
      reference_id: result.threeds.referenceId,
    },
  });
} else {
  console.error(`Falha em: ${result.failedAt}`, result.error.message);
}

Parâmetros

PreparePaymentRequest

CampoTipoObrigatórioDescrição
amountnumberSimValor em centavos (ex: 15000 = R$ 150,00).
currencystringSimCódigo ISO 4217 da moeda (BRL, USD, EUR).
installmentsnumberNãoParcelas (padrão: 1).
card.numberstringSimNúmero do cartão (13–19 dígitos).
card.holderNamestringSimNome do portador como impresso no cartão.
card.expirationMonthstringSimMês de validade (01–12).
card.expirationYearstringSimAno de validade (4 dígitos).
card.cvvstringSimCódigo de segurança (3–4 dígitos).
customer.namestringSimNome do comprador.
customer.emailstringSimEmail do comprador.
customer.phonestringSimTelefone com DDI+DDD (ex: 5511999999999).
addressobjectNãoEndereço de cobrança. Recomendado — melhora a taxa de aprovação no 3DS.

Endereço (opcional, recomendado)

CampoTipoObrigatórioDescrição
address.streetstringSimLogradouro.
address.numberstringSimNúmero.
address.complementstringNãoComplemento.
address.zipCodestringSimCEP.
address.neighborhoodstringSimBairro.
address.citystringSimCidade.
address.statestringSimEstado (UF, 2 caracteres).
address.countrystringSimPaís (código ISO, ex: BR).

PreparePaymentOptions

const result = await client.preparePayment(dados, {
  skipFraudAnalysis: false,
  skipThreeDS: false,
  threeDSTimeout: 120000,
  onStepChange: (event) => {
    console.log(`${event.step}: ${event.status}`);
  },
});
OpçãoTipoPadrãoDescrição
skipFraudAnalysisbooleanfalsePula a análise de fraude mesmo se disponível.
skipThreeDSbooleanfalsePula a autenticação 3DS mesmo se disponível.
threeDSTimeoutnumber120000Timeout do fluxo 3DS em milissegundos.
onStepChangefunction—Callback chamado a cada mudança de etapa.

Retorno

O método retorna uma union discriminada — verifique result.success para determinar o tipo:

Sucesso (PaymentSuccess)

if (result.success) {
  result.token;          // "tok_abc123..."
  result.brand;          // "visa"
  result.lastFourDigits; // "2701"
  result.firstSixDigits; // "400000"
  result.fraudSessionId; // "550e8400-e29b-41d4-..." | undefined
  result.threeds;        // { status, cavv, eci, xid, ... } | undefined
  result.steps;          // resumo de cada etapa
  result.durationMs;     // tempo total em ms
}
CampoTipoDescrição
successtrueDiscriminante.
tokenstringToken do cartão para criar a cobrança.
brandstringBandeira detectada.
lastFourDigitsstringÚltimos 4 dígitos.
firstSixDigitsstringPrimeiros 6 dígitos (BIN).
threedsobject | undefinedDados da autenticação 3DS (se executada).
threeds.status'authenticated' | 'unenrolled'Status da autenticação.
threeds.cavvstringCryptogram (presente se authenticated).
threeds.ecistringElectronic Commerce Indicator.
threeds.xidstringIdentificador da transação 3DS.
fraudSessionIdstring | undefinedID da sessão de fraude (se executada).
stepsPaymentStepSummary[]Resumo de execução de cada etapa.
durationMsnumberDuração total do fluxo.

Falha (PaymentFailure)

if (!result.success) {
  result.error;          // Error — a exceção que causou a falha
  result.failedAt;       // "fraud_analysis" | "tokenization" | "three_ds"
  result.partialResult;  // dados das etapas que completaram antes da falha
  result.steps;          // resumo de cada etapa (incluindo a falha)
  result.durationMs;     // tempo total em ms
}
CampoTipoDescrição
successfalseDiscriminante.
errorErrorA exceção original.
failedAtPaymentStepA etapa onde ocorreu a falha.
partialResult.tokenstring | undefinedToken (se tokenização completou).
partialResult.brandstring | undefinedBandeira (se tokenização completou).
partialResult.fraudSessionIdstring | undefinedSessão de fraude (se completou).
stepsPaymentStepSummary[]Inclui a etapa com falha.
durationMsnumberDuração total do fluxo.

Em caso de falha no 3DS, o partialResult contém o token e o fraudSessionId das etapas anteriores. Isso permite que você decida no backend se aceita a transação sem autenticação 3DS.

Callback de progresso

O callback onStepChange permite atualizar a UI conforme cada etapa progride:

const result = await client.preparePayment(dados, {
  onStepChange: ({ step, status }) => {
    // step: 'fraud_analysis' | 'tokenization' | 'three_ds'
    // status: 'started' | 'completed' | 'skipped' | 'failed'

    switch (status) {
      case 'started':
        mostrarLoading(step);
        break;
      case 'completed':
        marcarConcluido(step);
        break;
      case 'skipped':
        marcarIgnorado(step);
        break;
      case 'failed':
        marcarErro(step);
        break;
    }
  },
});

Exemplo com React

function Checkout() {
  const [currentStep, setCurrentStep] = useState<string | null>(null);
  const [completedSteps, setCompletedSteps] = useState<string[]>([]);

  async function handlePay() {
    const result = await client.preparePayment(formData, {
      onStepChange: ({ step, status }) => {
        if (status === 'started') setCurrentStep(step);
        if (status === 'completed') {
          setCompletedSteps((prev) => [...prev, step]);
          setCurrentStep(null);
        }
      },
    });
    // ...
  }

  return (
    <div>
      <StepIndicator
        steps={['fraud_analysis', 'tokenization', 'three_ds']}
        current={currentStep}
        completed={completedSteps}
      />
      <button onClick={handlePay}>Pagar</button>
    </div>
  );
}

Quando usar cada abordagem

CenárioAbordagem
Checkout padrão com todas as etapaspreparePayment()
Controle fino sobre cada etapaControladores individuais (tokenizer, threeds, fraudAnalysis)
Tokenizar sem cobrar (salvar cartão)client.tokenizer.tokenize() direto
3DS obrigatório mas fraude opcionalpreparePayment({ skipFraudAnalysis: true })
Fluxo customizado com UI por etapaControladores individuais com estado manual

Comparação com o fluxo manual

const result = await client.preparePayment({
  amount: 15000,
  currency: 'BRL',
  card: { number, holderName, expirationMonth, expirationYear, cvv },
  customer: { name, email, phone },
});

if (result.success) {
  await criarCobranca({
    payment_details: { token: result.token },
    fraud_session_id: result.fraudSessionId,
    three_ds: result.threeds && {
      cavv: result.threeds.cavv,
      eci: result.threeds.eci,
      xid: result.threeds.xid,
      version: result.threeds.version,
      reference_id: result.threeds.referenceId,
    },
  });
}
let fraudSessionId;
if (client.isFraudAnalysisAvailable()) {
  const fraud = await client.fraudAnalysis.setup();
  fraudSessionId = fraud.sessionId;
}

const token = await client.tokenizer.tokenize({
  card: { number, holderName, expirationMonth, expirationYear, cvv },
});

let threeDSResult;
if (client.isThreeDSAvailable()) {
  threeDSResult = await client.threeds.authenticate({
    amount: 15000,
    currency: 'BRL',
    card: { number, expirationMonth, expirationYear },
    customer: { name, email, phone },
  });
}

await criarCobranca({
  payment_details: { token: token.token },
  fraud_session_id: fraudSessionId,
  three_ds: threeDSResult?.status === 'authenticated'
    ? { cavv: threeDSResult.cavv, eci: threeDSResult.eci, xid: threeDSResult.xid }
    : undefined,
});

Tratamento de erros

O preparePayment() nunca lança exceções (exceto para ValidationError de campos obrigatórios ausentes). Erros de cada etapa são capturados e retornados no resultado:

const result = await client.preparePayment(dados);

if (!result.success) {
  switch (result.failedAt) {
    case 'fraud_analysis':
      // Falha na coleta de fingerprint — pode tentar novamente
      // ou prosseguir sem antifraude (se merchant permitir)
      break;

    case 'tokenization':
      // Dados do cartão inválidos ou erro de API
      exibirErro('Verifique os dados do cartão');
      break;

    case 'three_ds':
      // 3DS falhou — token disponível em partialResult
      if (result.partialResult.token) {
        // Decisão do merchant: aceitar sem 3DS?
        const aceitar = await consultarBackend(result.partialResult);
        if (aceitar) {
          await criarCobranca({
            payment_details: { token: result.partialResult.token },
            fraud_session_id: result.partialResult.fraudSessionId,
          });
        }
      }
      break;
  }
}

O único caso em que preparePayment() lança uma exceção é quando card.holderName não é fornecido — esse campo é obrigatório para o fluxo completo pois é necessário tanto na tokenização quanto no 3DS.

Análise de fraude

Colete o fingerprint do dispositivo via ThreatMetrix para alimentar a análise antifraude CyberSource.

Fluxo completo

Integre tokenização, 3D Secure e análise de fraude em um fluxo de pagamento ponta a ponta.

On this page

O que éUso básicoParâmetrosPreparePaymentRequestEndereço (opcional, recomendado)PreparePaymentOptionsRetornoSucesso (PaymentSuccess)Falha (PaymentFailure)Callback de progressoExemplo com ReactQuando usar cada abordagemComparação com o fluxo manualTratamento de erros