Pular para o conteúdo principal

Guia de Integração

O Signer é um portal de documentos que permite a realização de assinaturas digitais e eletrônicas, bem como a criação de fluxos complexos. Este guia apresenta as opções de integração para que sua aplicação aproveite ao máximo o potencial do Signer.

Novo por aqui?

Se é a sua primeira integração, comece pelos Primeiros passos, que levam você do zero ao primeiro documento assinado em cerca de 15 minutos. Este guia serve como referência dos casos de uso.

Autenticação​

Todas as chamadas de API exigem uma chave de acesso de API (API Key). Essa chave deve ser colocada no cabeçalho de todas as requisições:

X-Api-Key: sua-aplicacao|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Toda chave de API está associada a uma Organização previamente cadastrada no Signer. Sendo assim, o escopo dessa chave fica restrito àquela organização, isto é, aquela chave só permitirá acessar/criar documentos daquela organização.

observação

Para obter uma chave de API: se você tem permissão para criar aplicações na organização, crie uma aplicação em Aplicações e gere a chave com o botão Chaves dela, como mostram os Primeiros passos. Caso contrário, peça uma chave ao administrador da sua instância.

Bibliotecas cliente​

A Lacuna publica uma biblioteca cliente da API para .NET, Java, Node.js e PHP. Você cria o cliente com a URL da sua instância do Signer e a chave de API, e chama as APIs pelos métodos dele. Também é possível chamar a API REST diretamente de qualquer linguagem, como fazem os Primeiros passos com curl.

LinguagemPacoteVersãoInstalação
.NET (.NET Framework 4.5 ou posterior, .NET Standard 2.0)Lacuna.Signer.Client1.24.0dotnet add package Lacuna.Signer.Client
Javacom.lacunasoftware.signer:signer-client2.14.0Gradle: implementation 'com.lacunasoftware.signer:signer-client:2.14.0'
Node.jssigner-node-client1.1.0npm install signer-node-client
PHPlacuna/signer-client1.4.10composer require lacuna/signer-client

Os exemplos no GitHub usam essas bibliotecas, com um cenário por caso de uso deste guia. Para embutir a tela de assinatura na sua página web, use a biblioteca JavaScript lacuna-signer-widget: veja Assinatura embutida.

Recursos mais novos que as bibliotecas cliente​

As bibliotecas cliente foram publicadas antes do Signer 3.x, por isso não têm algumas das chamadas e dos campos dele. Um método ou campo que falta numa biblioteca não quer dizer que o Signer não o tenha: confira a referência da API.

Recurso.NETJavaNode.jsPHP
Pausar e retomar, e o status PausedNãoNãoNãoNão
Eventos de webhook DocumentPaused e DocumentResumedNãoNãoNãoNão
Evento de webhook DocumentDeletedCom o Lacuna.Signer.Api 2.1.0SimSimNão
disableRefusalNãoNãoNãoNão
notificationLanguage de um participanteNãoSimSimNão
notifiedEmailsData, timestampEnabledNãoNãoNãoNão
signerPositioningEnabled, automaticSignaturePositioningNãoNãoNãoNão
convertToPdfA, pdfAProfileNãoSimNãoNão

O Lacuna.Signer.Client 1.24.0 instala o Lacuna.Signer.Api 1.67.0. Para ter os modelos mais novos, adicione também o Lacuna.Signer.Api 2.1.0 ao seu projeto, como fazem os exemplos em .NET. Mesmo assim, o DocumentStatus de nenhuma biblioteca tem Paused, e o GetDocumentDetailsAsync do .NET falha num documento pausado: leia-o com uma chamada direta.

Para esses recursos, chame a API REST diretamente, com a mesma URL e a mesma chave de API. Os exemplos acrescentam à sua classe base uma pequena função auxiliar: ela envia JSON com o header X-Api-Key e lança uma exceção numa resposta diferente de 2xx, com o corpo, que num 422 traz o código de erro do Signer. Faça o upload do arquivo com a biblioteca, como de costume, e use a função auxiliar na chamada que falta na biblioteca. Por exemplo, para pausar e retomar um documento:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

private static readonly HttpClient HttpClient = new HttpClient();

// signerEndpoint e apiKey: os mesmos valores que você passa ao SignerClient
private async Task<JToken> CallSignerApiAsync(HttpMethod method, string path, object body = null)
{
using (var request = new HttpRequestMessage(method, signerEndpoint.TrimEnd('/') + path))
{
request.Headers.TryAddWithoutValidation("X-Api-Key", apiKey);
if (body != null)
{
request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json");
}
using (var response = await HttpClient.SendAsync(request))
{
var content = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException($"{method} {path} answered {(int)response.StatusCode}: {content}");
}
return string.IsNullOrEmpty(content) ? null : JToken.Parse(content);
}
}
}

// Pausar: o motivo é opcional
await CallSignerApiAsync(HttpMethod.Post, $"/api/documents/{documentId}/pause", new { reason = "Aguardando a revisão do contrato" });
var document = await CallSignerApiAsync(HttpMethod.Get, $"/api/documents/{documentId}");
// document["status"] é "Paused"

// Retomar: sem corpo
await CallSignerApiAsync(HttpMethod.Post, $"/api/documents/{documentId}/resume");

Para criar um documento com um campo novo, envie o corpo inteiro de POST /api/documents pela função auxiliar, com o id, o name e o contentType do upload em files. Os exemplos indicados na página de cada recurso fazem isso.

Um Signer mais antigo ignora campos novos

Uma instância do Signer mais antiga que um recurso não rejeita o campo dele: cria o documento sem ele. Leia o documento de volta (GET /api/documents/{id}) e confira que o campo está lá, como fazem os exemplos.

Como o fluxo funciona​

Na prática, uma integração com o Signer segue quatro etapas. Cada etapa tem uma página dedicada neste guia:

  1. Criar documentos: envie o arquivo, monte o fluxo de participantes e (opcionalmente) assine dentro da sua própria aplicação.
  2. Acompanhar documentos: verifique o status, envie lembretes e receba notificações por webhook.
  3. Baixar e listar: obtenha as versões do documento e liste documentos por diferentes critérios.
  4. Validar assinaturas: valide as assinaturas por chave de validação ou pelo arquivo assinado.

E, ao longo da vida do documento, você pode precisar de operações de ciclo de vida: cancelar, recusar, pausar e retomar, enviar nova versão, excluir ou restaurar.

Casos de uso​

Caso de usoO que você faz
Criar documentosUpload, criação do fluxo, assinatura embutida, pré-posicionamento de assinaturas e envelopes (múltiplos arquivos)
Referência dos campos do documentoConsultar os campos do participante, os tipos de identificador e as opções do participante e do documento
Acompanhar documentosVerificar status do documento e dos participantes, enviar lembretes e configurar webhooks
Baixar e listarBaixar as diferentes versões do documento e listar documentos
Validar assinaturasValidar assinaturas por chave ou por arquivo assinado
Ciclo de vida do documentoCancelar, recusar, pausar e retomar, enviar nova versão, excluir e restaurar
Contatos e identificadoresGerenciar os contatos da organização e os identificadores de um usuário

Respostas de erro​

As APIs respondem com estes códigos de status HTTP:

CódigoSignificado
200 (OK)Requisição processada. O corpo da resposta depende da API: veja a entrada dela na referência da API.
400 (Bad Request)Erro de sintaxe, por exemplo um campo obrigatório que não foi enviado.
401 (Unauthorized)A chave de API não foi enviada ou é inválida.
403 (Forbidden)A chave de API é válida, mas a aplicação dela não tem permissão para a operação pedida.
422 (Unprocessable Entity)Erro da API, por exemplo um ID de entidade que não foi encontrado. O corpo é um ErrorModel.

Um ErrorModel tem três campos:

CampoTipoConteúdo
codestringO código do erro. Teste este campo no seu código, e não a mensagem.
messagestringUma descrição do erro.
detailsobjeto, com valores stringInformações adicionais sobre o erro. Pode ser null.
{
"code": "DocumentNotFound",
"message": "...",
"details": null
}

A referência da API lista os principais códigos de uma resposta 422: CertificateNotFound, DocumentNotFound, FolderNotFound, CpfMismatch, CpfNotExpected, InvalidFlowAction e DocumentInvalidKey. A lista não é completa, e novos códigos podem ser incluídos a qualquer momento sem aviso, então trate também os códigos que você não conhece. Outras páginas descrevem os códigos das suas operações, como DocumentHasNoSignatures ao baixar uma versão.

Ver em Markdown