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());
Resultsist beiCOMPLETEDundPARTIALLY_COMPLETEDgefüllt, sonst leer.DocumentResults.IsUsablesagt je Dokument, ob es signiert ist und das Prüfergebnis es nicht verwirft.result.Completedallein genügt bei einem Teilerfolg nicht.onSubmittedliefert die Vorgangs-Id, bevor das Warten beginnt. Merk sie dir: Diesigning_urlenthä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
cancellationTokenbeendet den Aufruf, egal ob er gerade anlegt, vorlegt oder wartet, und kommt immer alsOperationCanceledExceptionan. Der Vorgang selbst läuft auf dem Server weiter; abbrechen kannst du ihn mitCancelSigningProcess. Eine ausdrücklich gesetzte Zeitgrenze (ZedalCallContext.Default.WithTimeout(…)) gilt auch für das Warten und endet mitDeadlineExceeded.
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.