Como fazer seu próprio serviço de assinatura eletrônica 🖊️💻
Introdução
Certamente você já se deparou com algum serviço de assinatura eletrônica, tal como o renomado “DocuSign”, não é mesmo? 🤔
Caso você nunca tenha ouvido falar, DocuSign é um serviço de assinaturas eletrônicas. Sabe aquelas assinaturas que você tem que fazer quando tá alugando/comprando um imóvel? Então, são essas, só que de maneira totalmente eletrônica/digital.
Hoje, vamos explorar uma das inúmeras maneiras de desenvolver um serviço de Back-End que efetua assinaturas eletrônicas em documentos específicos.
Na minha opinião, os dois principais benefícios ao utilizar um serviço próprio de assinatura são: custos mais baixos e maior poder de personalização.
O que é essencial para iniciar este processo? 📝
- Linguagem Back-End (optaremos pelo Ruby) + Sinatra (para definir as rotas da API)
- Algum serviço de armazenamento em nuvem para salvar os arquivos (como GCP, AWS, entre outros)
- Algumas bibliotecas para fazer as operações necessárias (aguarde que iremos chegar lá, deixa eu fazer o suspense 😅)
Com esses recursos em mãos, daremos início ao desenvolvimento do nosso serviço de assinatura.
Estrutura HTML
O primeiro passo será estruturar o contrato, que será um documento em HTML (ignorem as más práticas de HTML/CSS):

Que gerará a seguinte estrutura:

Assim, já temos o contrato que será assinado posteriormente. Notem a presença de um placeholder, que será essencial para a assinatura efetiva do documento.
Com essa estrutura pronta, o próximo passo é armazenar o documento no nosso serviço de armazenamento de arquivos, que consiste basicamente em fazer o upload do arquivo para a nuvem ☁️
Armazenamento de Arquivos (GCP)
No exemplo a seguir, utilizamos um código em Ruby para criar o arquivo em um bucket do GCS (Google Cloud Storage).

Rotas
Agora que temos a estrutura do nosso documento armazenada na nuvem, é hora de definir duas rotas na nossa aplicação 🛣️
Se você não está familiarizado com o Sinatra, pode dar uma olhada rápida na documentação oficial.
A primeira é destinada à visualização do documento, acessível através de uma requisição: GET users/{user_id}/documents/{document_id}/preview
A segunda rota será utilizada para a assinatura do nosso documento, a partir da requisição: POST users/{user_id}/documents/{document_id}/sign
Mas ainda tem um problema: como converter o HTML em PDF e também realizar as trocas adequadas do placeholder? Uma possível solução seria adicionar uma classe em comum para ambas as rotas.
HTML para PDF
Esta classe teria a responsabilidade de substituir os placeholders e, também, converter o documento para o formato PDF. Uma implementação para isso em Ruby poderia ser:

Esse código é responsável por:
Fazer o download do arquivo HTML que foi salvo na nuvem
Verificar se a rota chamada foi a de pré-visualização ou de assinatura e, com base nisso, atribuir os dados necessários para trocar nos placeholders (vazio ou o nome da pessoa)
Transformar o HTML em um documento versão final no formato PDF
Bibliotecas
Foram utilizadas 4 bibliotecas para realizar as operações:
Grover (transformar o HTML em PDF)
Mustache (realizar a troca dos placeholders)
Google Cloud (realizar a interface com a GCP)
Sinatra e suas dependências (para as rotas da aplicação)
Eu usei essas bibliotecas apenas por já estar acostumado com elas, você pode usar a que mais fizer sentido e/ou for mais conveniente pra você
Conclusão
Depois disso, o documento assinado se parecerá com algo assim:

Caso queira deixar “mais profissional”, é possível adicionar uma fonte diferente diretamente no HTML para estilizar a assinatura 💅
Essa solução é útil para quando o cliente aceitar os termos de assinatura eletrônica de determinado produto, dessa forma, basta termos o nome completo e assinar a partir do consentimento dele.
Uma outra feature possível também seria adicionar a possibilidade do cliente fazer a própria rúbrica dele, mas isso fica pra outra hora 😅
PRONTO!!! 🧙 Não foi tão complexo assim, né?
O objetivo desse artigo foi mostrar a solução de um problema comum: a assinatura digital de documentos. Perceba que alguns detalhes foram intencionalmente omitidos para manter a explicação mais clara e acessível possível.
Caso queira me acompanhar de perto (não tão perto pra não se assustar): https://www.instagram.com/codandonagringa/
Muito obrigado pela leitura e nos vemos por aí 👋😃