Zum Inhalt

Signieren mit dem SDK

Signaturvorgänge des WebSigners über client.SignerApi.SigningProcesses.

Die fachlichen Hintergründe stehen in der Anleitung Signieren mit dem WebSigner.

In einem Aufruf

SignAsync legt den Vorgang an, legt ihn vor, gibt dir den Link und wartet auf den Endzustand:

using System.Linq;
using Google.Protobuf;                 // ByteString
using Infotech.Signer.Sign.V1;         // DocumentInput, DocumentKind, SigningOptions, SigningProcessState
using Zedal.Sdk.Apis.Signer;           // DocumentResults

string processId = null;

var result = await client.SignerApi.SigningProcesses.SignAsync(
    new[]
    {
        new DocumentInput
        {
            DisplayName = "Lieferschein 4711",
            Kind = DocumentKind.Pdf,
            Content = ByteString.CopyFrom(pdf)
        }
    },
    new SigningOptions { Reason = "Übernahme bestätigt" },
    presentSigningUrl: url => ShowSigningLink(url),
    onSubmitted: process => processId = process.SigningProcessId,
    cancellationToken: cancellation);

foreach (var document in result.Results.Where(DocumentResults.IsUsable))
    Save(document.DisplayName, document.Content.ToByteArray());
  • Results ist bei COMPLETED und PARTIALLY_COMPLETED gefüllt, sonst leer. DocumentResults.IsUsable sagt je Dokument, ob es signiert ist und das Prüfergebnis es nicht verwirft. result.Completed allein genügt bei einem Teilerfolg nicht.
  • onSubmitted liefert die Vorgangs-Id, bevor das Warten beginnt. Merk sie dir: Die signing_url enthält nur ein Übergabe-Token, nicht die Id, und ohne Id findest du einen Vorgang nach einem Abbruch nicht wieder.
  • Warten und Abbrechen: Das Warten auf den Menschen läuft ohne Zeitgrenze. Ein cancellationToken beendet den Aufruf, egal ob er gerade anlegt, vorlegt oder wartet, und kommt immer als OperationCanceledException an. Der Vorgang selbst läuft auf dem Server weiter; abbrechen kannst du ihn mit CancelSigningProcess. Eine ausdrücklich gesetzte Zeitgrenze (ZedalCallContext.Default.WithTimeout(…)) gilt auch für das Warten und endet mit DeadlineExceeded.

In zwei Schritten

Willst du den Link weitergeben und später weitermachen, etwa weil ein Fahrer erst an der Abholstelle signiert, trennst du Vorlegen und Abholen:

var submitted = await client.SignerApi.SigningProcesses.SubmitAsync(documents);
Save(submitted.SigningProcessId);
SendToDriverApp(submitted.SigningUrl);

// later, for example in a background job
var process = await client.SignerApi.SigningProcesses.GetSigningProcess(processId);
if (process.State is SigningProcessState.Completed or SigningProcessState.PartiallyCompleted)
{
    var response = await client.SignerApi.SigningProcesses.GetResults(
        new GetResultsRequest { SigningProcessId = processId });
    // evaluate response.Results as above
}

GetResultsRequest liegt im Namespace Infotech.Signer.Sign.V1.Api. Vor einem Endzustand und während der Sichtprüfung antwortet GetResults mit FAILED_PRECONDITION.

Für eine laufende Verbindung gibt es WatchSigningProcess: Er meldet jede Zustandsänderung über einen Callback und endet mit dem ersten Endzustand. Reißt der Strom ab, fällst du auf GetSigningProcess zurück.