Show / Hide Table of Contents
Editar no GitHub

Processamento em background - Sessões de assinatura

Por padrão, o Rest PKI Core fará com que o usuário aguarde que os documentos sejam processados antes de enviá-lo de volta à sua aplicação. Se você quiser oferecer uma experiência mais ágil para seus usuários, habilite o processamento em background especificando EnableBackgroundProcessing = true na criação da sessão.

Em .NET:

var response = await restPkiService.CreateSignatureSessionAsync(new CreateSignatureSessionRequest() {
    ...
    EnableBackgroundProcessing = true,
});
return Redirect(response.RedirectUrl);

Em PHP:

$request = new CreateSignatureSessionRequest();
$request->enableBackgroundProcessing = true;

$response = $service->createSignatureSession($request);

header("Location: {$response->redirectUrl}");

Em Java:

CreateSignatureSessionRequest request = new CreateSignatureSessionRequest();
request.setEnableBackgroundProcessing(true);

CreateSignatureSessionResponse response = restPkiService.createSignatureSession(request);

return "redirect:" + response.getRedirectUrl();

Integração direta por API:

POST {endpoint}/api/signature-sessions
{
    ...
    "enableBackgroundProcessing": true
}

Nesse caso, o usuário será redirecionado de volta à sua aplicação assim que concluir as assinaturas, sem aguardar o processamento, Entretanto, o seu tratemento de retorno precisa ser adequado para lidar com o caso de uma sessão de assinatura cujos documentos ainda não estão prontos para download.

Note

Nenhuma adequação é necessária no caso do Fluxo com webhook, pois nesse caso não há tratamento de retorno

Estados adicionais

Além dos estados Completed e UserCancelled, a sessão pode estar em dois outros estados quando o usuário chega de volta à sua aplicação: Processing e ProcessingError.

Enquanto uma sessão estiver em Processing, alguns documentos estarão com estado Processing e não estarão disponíveis para download. Apenas quando a sessão mudar de estado para Completed é que todos os documentos estarão prontos para download.

Note

O estado ProcessingError é uma condição rara que ocorre apenas caso o certificado do usuário seja revogado na janela de tempo entre o início da sessão e a conclusão do processamento. É perfeitamente apropriado que a sua aplicação ignore essa condição ou apenas lance uma exceção caso isso ocorra.

Adaptando o tratamento de retorno

Vamos adaptar nosso tratamento de retorno para lidar com essas mudanças.

Em .NET:

public class SessionCallbackController : Controller {
    ... 
    public async Task<IActionResult> Index(Guid signatureSessionId) {
        var session = await restPkiService.GetSignatureSessionAsync(signatureSessionId.Value);
        if (session.Status != SessionStatus.Completed && session.Status != SessionStatus.Processing) {
            return Redirect("/");
        }
        return View(session);
    }
}

Em PHP:

$sessionId = $_GET['signatureSessionId'];

$session = $session->getSignatureSession($sessionId);
if ($session->status != SignatureSessionStatus::COMPLETED && $session->status != SignatureSessionStatus::PROCESSING) {
    header("Location: http://localhost:8000/");
}

Em Java:

@Controller
public class SessionCallbackController {
    ...
    public String index(
        Model model, 
        @RequestParam(value="signatureSessionId") String sessionId
    ) throws RestException {
        SignatureSession session = restPkiService.getSignatureSession(UUID.fromString(sessionId));
        if (session.getStatus() != SignatureSessionStatus.Completed &&
            session.getStatus() != SignatureSessionStatus.Processing){
            return "redirect:/";
        }
        model.addAttribute("session", session);
        return "signature-callback/index";
    }
}

Note que agora também consideramos o estado Processing como normal. Com isso, podemos alterar a forma que os documentos serão mostrados.

Em .NET, alteraríamos a view de Razor da seguinte maneira:

@using Lacuna.RestPki.Api
@using Lacuna.RestPki.Client
@model SignatureSession
<h2>Signed documents</h2>
<ul>
    @foreach (var document in Model.Documents)
    {
        <li>
            @if (document.Status == DocumentStatus.Completed)
            {
                <a href="@document.SignedFile.Location">@document.SignedFile.Name</a>
            }
            else
            {
                @document.OriginalFile.Name
                <text> (processing)</text>
            }
        </li>
    }
</ul>

Em PHP, alteraríamos o lado do cliente da seguinte maneira:

<h2>Signed documents</h2>
<ul>
    <?php for ($i = 0; $i < count($session->documents); $i++) { 
        $document = $session->documents[$i]; ?>

        <li>
            <?php if ($document->status == SignatureSessionStatus::COMPLETED) { ?>
                <a href="<?= $document->signedFile->location ?>"><?= $document->signedFile->name ?></a>
            <?php } else { ?>
                <?= $document->originalFile->name ?>
                <text> (processing)</text>
            <?php } ?>
        </li>
    <?php } ?>
</ul>

Em Java, alteraríamos a view Thymeleaf do Spring da seguinte maneira:

<h2>Signed documents</h2>
<ul th:each="document : ${session.getDocuments()}">
    <li>
        <div th:if="${document.getStatus() == T(com.lacunasoftware.restpki.SignatureSessionStatus).Completed}" 
            <a th:href="${document.getSignedFile().getLocation()">
                <span th:text="${document.getSignedFile().getName()}"/>
            </a>
        </div>
        <div th:if="${document.getStatus() != T(com.lacunasoftware.restpki.SignatureSessionStatus).Completed}" 
            <span th:text="${document.getOriginalFile().getName()}"/> (processing)
        </div>
    </li>
</ul>

Note que renderizamos cada item da lista de maneira diferente baseado no estado do documento.

Back to top Copyright © 2015-2020 Lacuna Software