Kundenregistrierung

So folgen Sie diesem Kapitel

Eingaben: Kundeneingaben und Referenz-IDs; beginnen Sie mit dem GUEST-Token.

Schritte und erwartetes Ergebnis: Schliessen Sie alle Verifizierungsschritte in der angegebenen Reihenfolge ab. Die zurückgegebene Kunden-ID und das Token-Paar bilden den Kontext für weitere Kundenaufrufe.

Alternativen und spätere Aktionen: Die Selbstregistrierung ist der Hauptablauf. Verwenden Sie die administrative Registrierung nur, wenn Ihre Integration Kunden in deren Auftrag anlegt.

DTO-Quellcode: CivilStatusOutputModel, ClientOutputModel, CountryOutputModel, GenderOutputModel, LanguageOutputModel, LegalAcceptanceOutputModel, NationalityOutputModel, PensionSituationOutputModel, RegistrationFirstFactorOutputModel, RegistrationSecondFactorOutputModel, RegistrationThirdFactorOutputModel, TaxLiabilityOutputModel

In früheren Codeblöcken zugewiesene Variablen werden später wiederverwendet. Kundeneingaben stammen aus Ihrer Oberfläche. Bewahren Sie IDs und Referenzwerte im Kontext des jeweiligen Kunden auf; legen Sie nicht für jeden Schritt einen neuen Kontext an.

Die Beispiele verwenden gemeinsame Hilfsklassen. Lesen Sie Gemeinsame Hilfsklassen: vollständiger C#- und Java-Quellcode bevor Sie ein Beispiel übernehmen.
Voraussetzungen: Kontaktdaten, consentTimestamp als Zeitpunkt der Zustimmung, phoneNumberPrefix, phoneNumberNumber und das vom Kunden gewählte Passwort. Wählen Sie Selbstregistrierung mit GUEST oder administrative Registrierung mit ADMIN.
Für den nächsten Schritt aufbewahren: userId. Die Selbstregistrierung liefert zusätzlich accessToken, refreshToken und validUntil. Bei administrativer Registrierung behalten Sie den vorhandenen ADMIN-Token.

Hinweis

Bei der Registrierung wird die E-Mail-Adresse des Kunden erfasst. Sie muss innerhalb der WMS-Datenbank der Zielumgebung eindeutig sein. Die Registrierung mit einer bereits vorhandenen E-Mail-Adresse schlägt fehl.
Für die Registrierung gibt es zwei Möglichkeiten: Selbstregistrierung des Kunden oder administrative Kundenregistrierung.

Selbstregistrierung des Kunden

Bei der Selbstregistrierung gibt der Kunde die erforderlichen Informationen schrittweise selbst ein. Dieser Ablauf umfasst drei Registrierungsschritte und benötigt einen GUEST-Token. Zuerst erhält der Kunde einen E-Mail-Code, danach einen SMS-Code und abschliessend einen CLIENT-Token für weitere HTTP-Aufrufe. Der zurückgegebene Wert ValidUntil gibt dessen Ablaufzeit an.

Erster Registrierungsschritt

Eingaben: Vorname, Nachname, E-Mail-Adresse, Passwort, Zustimmungszeitpunkt und Geschlechtsreferenz.
Aktion: Starten Sie die Selbstregistrierung und fordern Sie die E-Mail-Verifizierung an.
Aufbewahren / erwartetes Ergebnis: Bewahren Sie die Registrierungseingaben auf und erfassen Sie emailVerificationCode für den letzten Schritt.
Im ersten Schritt werden Geschlecht, Vorname, Nachname und E-Mail-Adresse erfasst. Verwenden Sie für diesen Ablauf den GUEST-Token im HTTP-Client. Der Kunde erhält einen E-Mail-Verifizierungscode. Bewahren Sie diesen für die abschliessende Anfrage auf; die nächste Anfrage startet die Verifizierung der Mobilnummer.

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", guestToken);
// clientEmail, clientName and clientSurname are entered by the client.
var gender = await httpClient.GetFromJsonAsync<GenderOutputModel>("/api/v1/genders/code/MALE");
var payload = JsonConvert.SerializeObject(new
{
    GenderId = gender.Id,
    Name = clientName,
    Surname = clientSurname,
    EmailAddress = clientEmail
});
var sContent = new StringContent(payload, Encoding.UTF8, "application/json");
var httpResponseMessage = await httpClient.PostAsync("api/v1/users/registration/first-factor", sContent);
httpResponseMessage.EnsureSuccessStatusCode();
var resultAsString = await httpResponseMessage.Content.ReadAsStringAsync();
var firstFactorRegistrationResult = JsonConvert.DeserializeObject<RegistrationFirstFactorOutputModel>(resultAsString);

								
// clientEmail, clientName and clientSurname are entered by the client.

// First-factor registration
HttpRequest genderRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("genders/code/MALE"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

HttpResponse<String> response = httpClient.send(genderRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
GenderOutputModel genderObj = new Gson().fromJson(response.body(), GenderOutputModel.class);
var genderId = genderObj.Id;

JsonObject firstFactorPayload = new JsonObject();
firstFactorPayload.addProperty("GenderId", genderId);
firstFactorPayload.addProperty("Name", clientName);
firstFactorPayload.addProperty("Surname", clientSurname);
firstFactorPayload.addProperty("EmailAddress", clientEmail);

HttpRequest firstFactorRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("users/registration/first-factor"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(firstFactorPayload.toString()))
    .build();

response = httpClient.send(firstFactorRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
RegistrationFirstFactorOutputModel firstFactorRegistrationResult = new Gson().fromJson(response.body(), RegistrationFirstFactorOutputModel.class);

Zweiter Registrierungsschritt

Eingaben: Dieselbe E-Mail-Adresse und die vom Kunden eingegebene Telefonnummer.
Aktion: Fordern Sie die Verifizierung der Telefonnummer an.
Aufbewahren / erwartetes Ergebnis: Erfassen Sie smsVerificationCode und bewahren Sie beide Verifizierungscodes auf.
Diese Anfrage sendet einen Verifizierungscode an die angegebene Mobilnummer. Erfassen Sie vor dem dritten Schritt sowohl den E-Mail-Code als auch den SMS-Code des Kunden:

payload = JsonConvert.SerializeObject(new { PhoneNumberPrefix = phoneNumberPrefix, PhoneNumberNumber = phoneNumberNumber });
sContent = new StringContent(payload, Encoding.UTF8, "application/json");
httpResponseMessage = await httpClient.PostAsync("api/v1/users/registration/second-factor", sContent);
httpResponseMessage.EnsureSuccessStatusCode();
resultAsString = await httpResponseMessage.Content.ReadAsStringAsync();
var secondFactorRegistrationResult = JsonConvert.DeserializeObject<RegistrationSecondFactorOutputModel>(resultAsString);

								
// Second-factor registration
JsonObject secondFactorPayload = new JsonObject();
secondFactorPayload.addProperty("PhoneNumberPrefix", phoneNumberPrefix);
secondFactorPayload.addProperty("PhoneNumberNumber", phoneNumberNumber);

HttpRequest secondFactorRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("users/registration/second-factor"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(secondFactorPayload.toString()))
    .build();

response = httpClient.send(secondFactorRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
RegistrationSecondFactorOutputModel registrationSecondFactorOutputModel = new Gson().fromJson(response.body(), RegistrationSecondFactorOutputModel.class);

Dritter Registrierungsschritt

Eingaben: Beide Verifizierungscodes, Sprache und Zustimmungen.
Aktion: Schliessen Sie die Selbstregistrierung ab.
Aufbewahren / erwartetes Ergebnis: Bewahren Sie userId, accessToken, refreshToken und validUntil auf.
Erfassen Sie emailVerificationCode und smsVerificationCode vom Kunden. Die Token-Felder der Antwort können leer sein, wenn die Umgebung keine Verifizierungscodes in Antworten zurückgibt. Dieser Schritt schliesst die Registrierung ab. Die Antwort enthält einen CLIENT-Token für weitere HTTP-Aufrufe:

var language = await httpClient.GetFromJsonAsync<LanguageOutputModel>("/api/v1/languages/code/DE");
var legalAcceptance = await httpClient.GetFromJsonAsync<LegalAcceptanceOutputModel>("/api/v1/legal-acceptances/active");
payload = JsonConvert.SerializeObject(new
{
    ManagementPersonalDataConsent = consentTimestamp,
    SecondFactorToken = smsVerificationCode,
    FirstFactorToken = emailVerificationCode,
    GenderId = gender.Id,
    Name = clientName,
    Surname = clientSurname,
    EmailAddress = clientEmail,
    PhoneNumberPrefix = phoneNumberPrefix,
    PhoneNumberNumber = phoneNumberNumber,
    Password = clientPassword,
    LanguageId = language.Id,
    LegalAcceptanceId = legalAcceptance.Id, });
sContent = new StringContent(payload, Encoding.UTF8, "application/json");
httpResponseMessage = await httpClient.PostAsync("api/v1/users/registration/third-factor", sContent);
httpResponseMessage.EnsureSuccessStatusCode();
resultAsString = await httpResponseMessage.Content.ReadAsStringAsync();
var thirdFactorRegistrationResult = JsonConvert.DeserializeObject<RegistrationThirdFactorOutputModel>(resultAsString);
var userId = thirdFactorRegistrationResult.UserId;
var accessToken = thirdFactorRegistrationResult.AccessToken;
var refreshToken = thirdFactorRegistrationResult.RefreshToken;
var validUntil = thirdFactorRegistrationResult.ValidUntil;
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

								
// Third-factor registration
HttpRequest languageRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("languages/code/DE"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(languageRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
LanguageOutputModel languageObj = new Gson().fromJson(response.body(), LanguageOutputModel.class);
var languageId = languageObj.Id;

HttpRequest legalAcceptanceRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("legal-acceptances/active"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(legalAcceptanceRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
LegalAcceptanceOutputModel legalAcceptanceObj = new Gson().fromJson(response.body(), LegalAcceptanceOutputModel.class);
var legalAcceptanceId = legalAcceptanceObj.Id;

JsonObject thirdFactorPayload = new JsonObject();
thirdFactorPayload.addProperty("ManagementPersonalDataConsent", consentTimestamp);
thirdFactorPayload.addProperty("FirstFactorToken", emailVerificationCode);
thirdFactorPayload.addProperty("SecondFactorToken", smsVerificationCode);
thirdFactorPayload.addProperty("GenderId", genderId);
thirdFactorPayload.addProperty("Name", clientName);
thirdFactorPayload.addProperty("Surname", clientSurname);
thirdFactorPayload.addProperty("EmailAddress", clientEmail);
thirdFactorPayload.addProperty("PhoneNumberPrefix", phoneNumberPrefix);
thirdFactorPayload.addProperty("PhoneNumberNumber", phoneNumberNumber);
thirdFactorPayload.addProperty("Password", clientPassword);
thirdFactorPayload.addProperty("LanguageId", languageId);
thirdFactorPayload.addProperty("LegalAcceptanceId", legalAcceptanceId);

HttpRequest thirdFactorRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("users/registration/third-factor"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(thirdFactorPayload.toString()))
    .build();

response = httpClient.send(thirdFactorRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
RegistrationThirdFactorOutputModel registrationThirdFactorOutputModelObj = new Gson().fromJson(response.body(), RegistrationThirdFactorOutputModel.class);

var userId = registrationThirdFactorOutputModelObj.UserId;
var accessToken = registrationThirdFactorOutputModelObj.AccessToken;
var refreshToken = registrationThirdFactorOutputModelObj.RefreshToken;
var validUntil = registrationThirdFactorOutputModelObj.ValidUntil;

Hinweis

Lesen Sie ValidUntil aus dem Registrierungsergebnis. Die Gültigkeitsdauer wird vom Dienst festgelegt. Solange das Refresh-Token-Paar gültig ist, können Sie über Token erneuern einen neuen CLIENT-Token erhalten.

Ergebnis erkennen

Nach erfolgreicher Selbstregistrierung: Bewahren Sie die Kunden-ID und beide Tokens auf. Die Werte im Beispiel sind illustrativ.

{"userId":123,"accessToken":"<access-token>","refreshToken":"<refresh-token>","validUntil":"2026-10-13T12:00:00Z"}

Weitere Antwortfelder finden Sie im DTO-Katalog. Behandeln Sie fehlgeschlagene Anfragen, bevor Sie fortfahren; siehe Fehlerbehandlung.

Alternative: administrative Kundenregistrierung

Die Beispiele verwenden gemeinsame Hilfsklassen. Lesen Sie Gemeinsame Hilfsklassen: vollständiger C#- und Java-Quellcode bevor Sie ein Beispiel übernehmen.
Die administrative Registrierung erstellt einen Kunden mit einem Aufruf und einem vorhandenen ADMIN-Token. Die Antwort enthält Kundendaten und Kunden-ID, aber keinen neuen ADMIN-Token. Verwenden Sie diesen Ablauf für eine berechtigte Server-zu-Server-Integration, die die erforderlichen Kundendaten erfasst. Der ADMIN-Token muss Kunden anlegen dürfen; seine Gültigkeitsdauer wird durch die Integrationskonfiguration bestimmt. Bitte halten Sie ihn geheim.

Registrierung mit einem Aufruf

Eingaben: ADMIN-Token, vollständige Kundendaten und Referenz-IDs.
Aktion: Erstellen Sie den Kunden in dessen Auftrag.
Aufbewahren / erwartetes Ergebnis: Bewahren Sie die zurückgegebene userId auf; es wird kein neuer administrativer Token ausgestellt.
Das Beispiel erstellt einen Kunden mit den gezeigten Feldern. Geben Sie die für das gewählte Produkt erforderlichen Daten an und beachten Sie die API-Validierung. clientBirthDate ist das tatsächliche Geburtsdatum des Kunden (C#: DateTime; Java: Zeichenfolge im ISO-Format yyyy-MM-dd). Der HTTP-Client verwendet hier einen ADMIN-Token.

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", adminToken);
var language = await httpClient.GetFromJsonAsync<LanguageOutputModel>("/api/v1/languages/code/DE");
var legalAcceptance = await httpClient.GetFromJsonAsync<LegalAcceptanceOutputModel>("/api/v1/legal-acceptances/active");
var nationality = await httpClient.GetFromJsonAsync<NationalityOutputModel>("api/v1/nationalities/code/CH");
var country = await httpClient.GetFromJsonAsync<CountryOutputModel>("api/v1/countries/code/CH");
var pensionSituation = await httpClient.GetFromJsonAsync<PensionSituationOutputModel>("api/v1/pension-situations/code/PENSION-FUND");
var taxLiability = await httpClient.GetFromJsonAsync<TaxLiabilityOutputModel>("api/v1/tax-liabilities/code/CH");
var civilStatus = await httpClient.GetFromJsonAsync<CivilStatusOutputModel>("api/v1/civil-statuses/code/SINGLE");
var gender = await httpClient.GetFromJsonAsync<GenderOutputModel>("/api/v1/genders/code/MALE");
var payload = JsonConvert.SerializeObject(new
{
    ManagementPersonalDataConsent = consentTimestamp,
    Name = clientName,
    Surname = clientSurname,
    Email = clientEmail,
    PhoneNumberPrefix = phoneNumberPrefix,
    PhoneNumberNumber = phoneNumberNumber,
    PensionSituationId = pensionSituation.Id,
    CivilStatusId = civilStatus.Id,
    LanguageId = language.Id,
    LegalAcceptanceId = legalAcceptance.Id,
    Address = new
    {
        City = "Baar",
        Zip = "6340",
        Street = "Neugasse",
        StreetNr = "28A",
        CountryId = country.Id,
        CoName = "Zoo",
        CoSurname = "Zurich"
    },
    TaxLiabilityId = taxLiability.Id,
    GenderId = gender.Id,
    Nationality1Id = nationality.Id,
    BirthDate = clientBirthDate
});
var httpResponseMessage = await httpClient.PostAsync("api/v1/users", new StringContent(payload, Encoding.UTF8, "application/json"));
httpResponseMessage.EnsureSuccessStatusCode();
var userId = JsonConvert.DeserializeObject<ClientOutputModel>(await httpResponseMessage.Content.ReadAsStringAsync()).Id;
var accessToken = adminToken;

								
// clientEmail, clientName and clientSurname are entered by the client.

HttpRequest languageRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("languages/code/DE"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

var response = httpClient.send(languageRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
LanguageOutputModel languageObj = new Gson().fromJson(response.body(), LanguageOutputModel.class);
var languageId = languageObj.Id;

HttpRequest legalAcceptanceRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("legal-acceptances/active"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(legalAcceptanceRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
LegalAcceptanceOutputModel legalAcceptanceObj = new Gson().fromJson(response.body(), LegalAcceptanceOutputModel.class);
var legalAcceptanceId = legalAcceptanceObj.Id;

HttpRequest nationalityRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("nationalities/code/CH"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(nationalityRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
NationalityOutputModel nationalityObj = new Gson().fromJson(response.body(), NationalityOutputModel.class);
var nationalityId = nationalityObj.Id;

HttpRequest countryRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("countries/code/CH"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(countryRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
CountryOutputModel countryObj = new Gson().fromJson(response.body(), CountryOutputModel.class);
var countryId = countryObj.Id;

HttpRequest pensionRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("pension-situations/code/PENSION-FUND"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(pensionRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
PensionSituationOutputModel pensionObj = new Gson().fromJson(response.body(), PensionSituationOutputModel.class);
var pensionId = pensionObj.Id;

HttpRequest taxLiabilityRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("tax-liabilities/code/CH"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(taxLiabilityRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
TaxLiabilityOutputModel taxLiabilityObj = new Gson().fromJson(response.body(), TaxLiabilityOutputModel.class);
var taxLiabilityId = taxLiabilityObj.Id;

HttpRequest civilStatusRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("civil-statuses/code/SINGLE"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(civilStatusRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
CivilStatusOutputModel civilStatusObj = new Gson().fromJson(response.body(), CivilStatusOutputModel.class);
var civilStatusId = civilStatusObj.Id;

HttpRequest genderRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("genders/code/MALE"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(genderRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
GenderOutputModel genderObj = new Gson().fromJson(response.body(), GenderOutputModel.class);
var genderId = genderObj.Id;

// Preparing payload
JsonObject registrationPayload = new JsonObject();
registrationPayload.addProperty("ManagementPersonalDataConsent", consentTimestamp);
registrationPayload.addProperty("CivilStatusId", civilStatusId);
registrationPayload.addProperty("Name", clientName);
registrationPayload.addProperty("Surname", clientSurname);
registrationPayload.addProperty("Email", clientEmail);
registrationPayload.addProperty("PhoneNumberPrefix", phoneNumberPrefix);
registrationPayload.addProperty("PhoneNumberNumber", phoneNumberNumber);
registrationPayload.addProperty("PensionSituationId", pensionId);
registrationPayload.addProperty("LanguageId", languageId);
registrationPayload.addProperty("LegalAcceptanceId", legalAcceptanceId);
registrationPayload.addProperty("GenderId", genderId);
registrationPayload.addProperty("BirthDate", clientBirthDate);
registrationPayload.addProperty("Nationality1Id", nationalityId);
registrationPayload.addProperty("TaxLiabilityId", taxLiabilityId);
JsonObject address = new JsonObject();
address.addProperty("City", "Baar");
address.addProperty("Zip", "6340");
address.addProperty("Street", "Neugasse");
address.addProperty("StreetNr", "1");
address.addProperty("CountryId", countryId);
registrationPayload.add("Address", address);

HttpRequest createRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("users"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.ADMIN_TOKEN)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(registrationPayload.toString()))
    .build();

response = httpClient.send(createRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
ClientOutputModel clientObj = new Gson().fromJson(response.body(), ClientOutputModel.class);

var userId = clientObj.Id;
// Continue using the existing administrative access token.
var accessToken = Settings.ADMIN_TOKEN;