Guias de Desenvolvimento

Signing Sessions

Guias dos SDKs

Autenticação de Ação (ACTION_AUTHENTICATION)

O propósito ACTION_AUTHENTICATION permite autenticar uma ação sem associar um documento. Útil para aprovações, confirmações de operações financeiras, ou qualquer cenário onde é necessário registrar o consentimento do usuário para uma ação específica.


Passo 1: Criar transação sem documento

O campo document não é utilizado. Em vez disso, use o campo action com metadados da operação.

const tx = await client.transactions.create({
  purpose: 'ACTION_AUTHENTICATION',
  policy: { profile: 'CLICK_ONLY' },
  signer: {
    name: 'João Silva',
    userExternalId: 'user-001',
  },
  action: {
    type: 'TRANSFER_APPROVAL',
    description: 'Aprovação de transferência de R$ 50.000,00',
    reference: 'TRF-2024-001',
  },
});
from signdocs_brasil.models import ActionMetadata

tx = client.transactions.create(CreateTransactionRequest(
    purpose='ACTION_AUTHENTICATION',
    policy=Policy(profile='CLICK_ONLY'),
    signer=Signer(name='João Silva', user_external_id='user-001'),
    action=ActionMetadata(
        type='TRANSFER_APPROVAL',
        description='Aprovação de transferência de R$ 50.000,00',
        reference='TRF-2024-001',
    ),
))
tx, _ := client.Transactions.Create(ctx, &signdocs.CreateTransactionRequest{
    Purpose: signdocs.TransactionPurposeActionAuthentication,
    Policy:  signdocs.Policy{Profile: signdocs.PolicyProfileClickOnly},
    Signer:  signdocs.Signer{Name: "João Silva", UserExternalID: "user-001"},
    Action: &signdocs.ActionMetadata{
        Type:        "TRANSFER_APPROVAL",
        Description: "Aprovação de transferência de R$ 50.000,00",
        Reference:   "TRF-2024-001",
    },
})
CreateTransactionRequest request = new CreateTransactionRequest();
request.purpose = "ACTION_AUTHENTICATION";
request.policy = new Policy("CLICK_ONLY");
request.signer = new Signer("João Silva", null, "user-001");
request.action = new CreateTransactionRequest.ActionMetadata(
    "TRANSFER_APPROVAL", "Aprovação de transferência de R$ 50.000,00");
request.action.reference = "TRF-2024-001";

Transaction tx = client.transactions().create(request);
$tx = $client->transactions->create(new CreateTransactionRequest(
    purpose: 'ACTION_AUTHENTICATION',
    policy: new Policy(profile: 'CLICK_ONLY'),
    signer: new Signer(name: 'João Silva', userExternalId: 'user-001'),
    action: [
        'type' => 'TRANSFER_APPROVAL',
        'description' => 'Aprovação de transferência de R$ 50.000,00',
        'reference' => 'TRF-2024-001',
    ],
));

Qualquer perfil de política pode ser usado com ACTION_AUTHENTICATIONCLICK_ONLY, CLICK_PLUS_OTP, BIOMETRIC, etc. O exemplo usa CLICK_ONLY para simplicidade.


Passo 2: Completar etapas

As etapas geradas dependem do perfil de política escolhido. Complete-as seguindo o guia correspondente:

const steps = await client.steps.list(tx.transactionId);

// Para CLICK_ONLY: uma única etapa CLICK_ACCEPT
await client.steps.start(tx.transactionId, steps[0].stepId);
await client.steps.complete(tx.transactionId, steps[0].stepId, { accepted: true });
steps = client.steps.list(tx.transaction_id)
client.steps.start(tx.transaction_id, steps[0].step_id)
client.steps.complete(tx.transaction_id, steps[0].step_id, CompleteClickRequest(accepted=True))
steps, _ := client.Steps.List(ctx, tx.TransactionID)
client.Steps.Start(ctx, tx.TransactionID, steps[0].StepID, nil)
client.Steps.Complete(ctx, tx.TransactionID, steps[0].StepID,
    &signdocs.CompleteClickRequest{Accepted: true})
List<Step> steps = client.steps().list(tx.transactionId);
client.steps().start(tx.transactionId, steps.get(0).stepId);
client.steps().complete(tx.transactionId, steps.get(0).stepId, Map.of("accepted", true));
$steps = $client->steps->list($tx->transactionId);
$client->steps->start($tx->transactionId, $steps[0]->stepId);
$client->steps->complete($tx->transactionId, $steps[0]->stepId, ['accepted' => true]);

Passo 3: Finalizar e obter evidências

A evidência contém os metadados da ação em vez de informações de documento.

const finalized = await client.transactions.finalize(tx.transactionId);
const evidence = await client.evidence.get(tx.transactionId);
console.log(evidence.evidenceId);
// evidence.document será null (sem documento associado)
finalized = client.transactions.finalize(tx.transaction_id)
evidence = client.evidence.get(tx.transaction_id)
print(evidence.evidence_id)
# evidence.document é None
client.Transactions.Finalize(ctx, tx.TransactionID)
evidence, _ := client.Evidence.Get(ctx, tx.TransactionID)
fmt.Println(evidence.EvidenceID)
// evidence.Document é nil
client.transactions().finalize(tx.transactionId);
Evidence evidence = client.evidence().get(tx.transactionId);
System.out.println(evidence.evidenceId);
// evidence.document é null
$client->transactions->finalize($tx->transactionId);
$evidence = $client->evidence->get($tx->transactionId);
echo $evidence->evidenceId;
// $evidence->document é null

Casos de uso

Caso action.type action.description
Aprovação financeira TRANSFER_APPROVAL Aprovação de transferência de R$ 50.000,00
Autorização de acesso ACCESS_AUTHORIZATION Autorização de acesso ao sistema XYZ
Confirmação de operação OPERATION_CONFIRMATION Confirmação de alteração cadastral
Aceite de termos TERMS_ACCEPTANCE Aceite dos termos de uso v2.1