DRM-X 5.0 Encryption SDK Benutzerhandbuch
Für technisches Personal — wie man Videos verschlüsselt, indem man das Verschlüsselungstool über die Befehlszeile auf dem eigenen Server / der eigenen Website aufruft
Gilt für: DRM-X 5.0 (Internationale Edition com / China-Edition cn) · Plattformen: Windows / Linux x86_64 / macOS 11.0+
Inhaltsverzeichnis
1Inhalt des SDK-Pakets
Nach dem Entpacken des Archivs DRM-X5.0_Encryption_SDK enthält das Verzeichnis die folgenden Dateien:
| Datei | Beschreibung |
|---|---|
| drm-x5-encrypt-sdk.exe | Windows-Verschlüsselungsprogramm (x64) |
| drm-x5-encrypt-sdk-linux-x86_64 | Linux-Verschlüsselungsprogramm (x86_64, statisch gelinkt — keine Shared-Library-Abhängigkeiten; läuft direkt auf CentOS / Ubuntu usw.) |
| drm-x5-encrypt-sdk-macos-x86_64 | macOS-Verschlüsselungsprogramm (Intel-Chip, macOS 11.0 oder später) |
| drm-x5-encrypt-sdk-macos-arm64 | macOS-Verschlüsselungsprogramm (Apple Silicon M-Serie-Chip, macOS 11.0 oder später) |
| cmd.txt | Beispiele für den Aufruf über die Befehlszeile für die drei Plattformen |
| GetPackagerEncryptedParams.php | Eine ausführbare PHP-Demo, die den Webdienst aufruft, um die Verschlüsselungsparameter abzurufen (siehe Abschnitt 4.4) |
Die Befehlszeilenargumente sind auf allen drei Plattformen identisch — nur der Name der Programmdatei unterscheidet sich.
2Überblick über den Verschlüsselungs-Workflow
SCHRITT 1 · Verschlüsselungsparameter abrufen
Rufen Sie GetPackagerEncryptedParams auf, um ProfileEncryptedParam abzurufen (d. h. die verschlüsselte Zeichenfolge für -profile — einmal abrufen und für die Wiederverwendung zwischenspeichern). Die Base64-Werte der Eingabe- / Ausgabepfade werden lokal von Ihrem Programm kodiert; es ist nicht erforderlich, den Webdienst dafür aufzurufen.
SCHRITT 2 · Befehlszeile zusammenstellen
Füllen Sie das erhaltene -profile und die lokal Base64-kodierten Pfade in die vier Argumente des Verschlüsselungsprogramms ein: -server_domain / -profile / -input_file_utf8_base64_encoded / -output_file_utf8_base64_encoded
SCHRITT 3 · Verschlüsselung ausführen
Führen Sie das Befehlszeilenprogramm auf Ihrem Server aus, um die Verschlüsselung durchzuführen.
SCHRITT 4 · Verschlüsselte Dateien veröffentlichen
Laden Sie die verschlüsselten Dateien aus dem Ausgabeverzeichnis hoch / veröffentlichen Sie sie. Lizenzen werden vom DRM-X 5.0-Server ausgestellt, wenn Benutzer den Inhalt abspielen.
Warum zuerst den DRM-X 5.0 Webdienst aufrufen?Das Argument -profile des Verschlüsselungsprogramms ist nicht die numerische ID des Lizenzprofils — es ist eine verschlüsselte Zeichenfolge, die an Ihr Konto gebunden ist (ProfileEncryptedParam). Diese Zeichenfolge kann nicht lokal generiert werden; sie kann nur über den Webdienst abgerufen werden. Sie wird eins zu eins einer ProfileID zugeordnet, und sobald sie abgerufen wurde, kann sie zwischengespeichert und wiederverwendet werden — Sie müssen den Webdienst nicht für jede Datei aufrufen. Die Base64-Werte der Eingabe- / Ausgabepfade hingegen sollten lokal in Ihrem Programm kodiert werden (siehe Abschnitt 6) — dafür ist kein Webdienst-Aufruf erforderlich.
3Voraussetzungen
3.1 DRM-X 5.0-Kontoinformationen (aus der DRM-X-Administrationskonsole abgerufen)
| Element | Zweck |
|---|---|
| AdminEmail | E-Mail-Adresse des Administrators, verwendet für die Webdienst-Authentifizierung. Erfordert ein Advanced-Konto oder höher. |
| WebServiceAuthStr | Authentifizierungszeichenfolge für die Webdienst-Integration. Sehen Sie sie in der Administrationskonsole unter "Website Integration Parameter Settings" ein. |
| ProfileID | Numerische Lizenzprofil-ID — legt fest, welches Lizenzprofil für diese Verschlüsselung verwendet wird. |
3.2 Anforderungen an die Serverumgebung
| Plattform | Anforderungen |
|---|---|
| Windows | Windows 7 / Server 2008 R2 oder später (x64) |
| Linux | x86_64-Architektur (CentOS 7+ / Ubuntu 16.04+ und andere gängige Distributionen). Statisch gelinkt — keine Abhängigkeiten zu installieren. |
| macOSmacOS | macOS 11.0 oder später, Intel- oder Apple Silicon-Chip |
| Serverseitige Integration (optional) | PHP 7.4+ (mit aktivierten Erweiterungen soap und openssl), um den Webdienst automatisch aufzurufen |
Sicherheitshinweis: WebServiceAuthStr entspricht einem Kontoschlüssel. Er darf nur serverseitig gespeichert werden — platzieren Sie ihn niemals in Front-End-Webseiten, Client-Software oder öffentlichen Repositorys.
4Schritt eins: Aufrufen des DRM-X 5.0 Webdienstes zum Abrufen der Verschlüsselungsparameter
4.1 Webdienst-Informationen
| Element | Wert |
|---|---|
| Internationaler Endpunkt | https://5.drm-x.com/haihaisoftlicenseservice.asmx |
| Chinesischer Endpunkt | https://5.drm-x.cn/haihaisoftlicenseservice.asmx |
| Methodenname | GetPackagerEncryptedParams |
| Protokoll | SOAP 1.1 (POST) |
| SOAPAction | http://tempuri.org/ASPNET.StarterKit.Commerce/HaihaisoftLicenseService/GetPackagerEncryptedParams |
Der Endpunkt muss zur Edition Ihres Kontos passen: Internationale Konten verwenden 5.drm-x.com (Befehlszeile: -server_domain com); China-Konten verwenden 5.drm-x.cn (Befehlszeile: -server_domain cn). Die Verwendung der falschen Edition führt dazu, dass die Authentifizierung fehlschlägt oder die verschlüsselten Dateien nicht abspielbar sind.
4.2 Anforderungsparameter
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
| AdminEmail | Ja | E-Mail-Adresse des DRM-X 5.0-Administrators |
| WebServiceAuthStr | Ja | Webdienst-Authentifizierungszeichenfolge |
| ProfileID | Ja | Lizenzprofil-ID (numerisch; keine Kodierung erforderlich) |
| Input | Ja | Vollständiger Pfad der zu verschlüsselnden Datei (einfache Zeichenfolge; keine Kodierung erforderlich) |
| Output | Ja | Vollständiger Pfad der verschlüsselten Ausgabedatei |
| ProfileEncryptedParam / enc_Input / enc_Output | Nein | Reservierte Felder — normalerweise eine leere Zeichenfolge übergeben |
4.3 Zuordnung zwischen Antwortfeldern und Befehlszeilenargumenten (Kern)
| Antwortfeld | Befehlszeilenargument | Beschreibung |
|---|---|---|
| ProfileEncryptedParam | -profile | Eine verschlüsselte Lizenzprofil-Zeichenfolge, die an Ihr Konto gebunden ist (URL-Safe Base64, enthält - und _). Sie müssen den vom Webdienst zurückgegebenen Wert verwenden — übergeben Sie niemals die numerische Profile-ID und kodieren Sie sie niemals selbst. Sie muss nur einmal pro ProfileID abgerufen werden und kann dann langfristig zwischengespeichert und wiederverwendet werden — es ist nicht erforderlich, den Webdienst für jede Datei aufzurufen. |
| enc_Input | -input_file_utf8_base64_encoded | Der UTF-8-Base64-kodierte Eingabepfad. Es wird empfohlen, ihn lokal in Ihrem Programm zu kodieren (PHP: base64_encode(); in anderen Sprachen zuerst in UTF-8-Bytes konvertieren, dann Base64 — siehe Abschnitt 6). Dafür ist kein Webdienst-Aufruf erforderlich; der vom Dienst zurückgegebene Wert enc_Input funktioniert genauso gut. |
| enc_Output | -output_file_utf8_base64_encoded | Der UTF-8-Base64-kodierte Ausgabepfad. Es wird empfohlen, ihn lokal zu kodieren (gleiche Methode wie oben); der vom Dienst zurückgegebene Wert enc_Output funktioniert ebenfalls. |
| GetPackagerEncryptedParamsResult | — | Status- / Nachrichtentext. Hinweis: |
4.4 Aufrufbeispiel (PHP / SoapClient)
Dieser Webdienst ist ein standardmäßiger SOAP 1.1-Dienst, der aus jeder Sprache auf dieselbe einheitliche Weise aufgerufen werden kann: Senden Sie einen SOAP-Umschlag per POST an den in 4.1 aufgeführten Endpunkt (oder lassen Sie einen SOAP-Client ihn automatisch aus ?WSDL generieren), übergeben Sie die Parameter aus 4.2 und lesen Sie dann die drei Felder aus 4.3 in der Antwort. Gängige SOAP-Client-Bibliotheken nach Sprache:
| Sprache / Plattform | Gängige SOAP-Clients |
|---|---|
| PHP | Integrierte SoapClient-Klasse (in diesem Handbuch verwendet, WSDL-Modus) |
| Java | JAX-WS (wsimport), Apache Axis2, Apache CXF |
| Python | zeep、suds |
| C# / .NET | Visual Studio "Add Service Reference" oder SvcUtil |
| Node.js | soap-Paket |
Das folgende Beispiel verwendet PHPs SoapClient, um den vollständigen Aufruf zu demonstrieren. Speichern Sie den Code als get_params.php auf Ihrem Server und führen Sie ihn aus (PHP 7.4+ mit aktivierter soap-Erweiterung) — er gibt die drei Befehlszeilenargumentwerte aus:
SoapClient-Hinweise:
- Die Erweiterung php-soap muss installiert und aktiviert sein (unter Windows in php.ini extension=soap auskommentieren; unter Linux das Paket php-soap installieren).
- Geschäftsfehler wie fehlgeschlagene Authentifizierung lösen KEINEN SoapFault aus. Der Dienst gibt weiterhin HTTP 200 mit einer wohlgeformten Antwort zurück, und der Fehlertext befindet sich in GetPackagerEncryptedParamsResult. Stellen Sie den Erfolg immer durch Überprüfung der Feldwerte fest, wie in 4.3 beschrieben.
- Verwenden Sie zum Debuggen var_dump($client->__getLastRequest()), um den tatsächlichen Anforderungsumschlag zu untersuchen.
5Schritt zwei: Ausführen des Verschlüsselungsbefehls
5.1 Erste Verwendung (Linux / macOS)
Wechseln Sie in einem Terminal in das Verzeichnis des Programms und erteilen Sie zuerst die Ausführungsberechtigung:
5.2 Vorlagen für Einzeldatei-Verschlüsselungsbefehle
Windows (cmd / PowerShell):
Linux:
macOS:
5.3 Argumentreferenz
| Argument | Beschreibung |
|---|---|
| -server_domain | Ziel-DRM-X 5.0-Server-Edition: com = International, cn = China. Sie muss mit der Plattform Ihres Kontos und dem in Schritt 4 verwendeten Webdienst-Endpunkt übereinstimmen. |
| -profile | Die verschlüsselte Lizenzprofil-Zeichenfolge — der vollständige von Webdienst zurückgegebene Wert ProfileEncryptedParam (URL-Safe Base64, enthält - und _). Übergeben Sie keine numerische ID, kodieren Sie sie nicht selbst mit Base64 und fügen Sie keine abschließenden Zeichen hinzu oder entfernen Sie sie. Sie muss nur einmal pro ProfileID abgerufen werden und kann dann langfristig zwischengespeichert und wiederverwendet werden. |
| -input_file_utf8_base64_encoded | Der UTF-8-Base64-kodierte Eingabedateipfad. Es wird empfohlen, ihn lokal zu kodieren (z. B. PHPs base64_encode($path), siehe Abschnitt 6); der vom Dienst zurückgegebene Wert enc_Input funktioniert ebenfalls. Sowohl absolute als auch relative Pfade werden unterstützt, und Pfade dürfen Nicht-ASCII-Zeichen und Leerzeichen enthalten. |
| -output_file_utf8_base64_encoded | Der UTF-8-Base64-kodierte Ausgabedateipfad. Es wird empfohlen, ihn lokal zu kodieren (gleiche Methode wie oben); der vom Dienst zurückgegebene Wert enc_Output funktioniert ebenfalls. Das übergeordnete Verzeichnis der Ausgabe muss bereits existieren — das Programm erstellt es nicht. |
5.4 Vollständige Beispiele
Windows:
Hier dekodiert RDpcSmFzb25c... zu D:\Jason\input\01-testVideo.mp4.
Linux:
Dies verschlüsselt ./input/01-linux-encrypt-video.mp4 → ./output/01-linux-encrypt-video2_P.mp4.
5.5 Überprüfen des Ergebnisses
- Wenn das Programm fertig ist, prüfen Sie, ob im Ausgabeverzeichnis eine verschlüsselte Datei erstellt wurde (ein _P-Suffix wird empfohlen, um sie zu unterscheiden, z. B. course01_P.mp4);
- Die Verschlüsselung erfordert Netzwerkzugriff auf den DRM-X-Server. Stellen Sie sicher, dass Ihre Firewall / Sicherheitsgruppe ausgehenden Zugriff auf 5.drm-x.com oder 5.drm-x.cn zulässt;
- Es wird empfohlen, den vollständigen Workflow mit einem kleinen Testvideo zu überprüfen, bevor Produktionsinhalte in großen Mengen verschlüsselt werden.
6Base64-Kodierung der Eingabe- / Ausgabepfade (lokale Kodierung empfohlen)
Empfohlene Vorgehensweise: Generieren Sie die Werte von -input_file_utf8_base64_encoded / -output_file_utf8_base64_encoded, indem Sie sie in Ihrem eigenen Programm kodieren — es ist nicht erforderlich, den Webdienst einmal pro Datei aufzurufen. Die Kodierungsregel: Konvertieren Sie die Pfadzeichenfolge zuerst in UTF-8-Bytes und wenden Sie dann die standardmäßige Base64-Kodierung an. Hinweis: Ihre Quelldateien müssen als UTF-8 gespeichert werden (dies ist besonders bei Nicht-ASCII-Pfaden wichtig; verwenden Sie unter Windows keine ANSI- / GBK-Kodierung). Beispiele nach Sprache:
| Sprache / Umgebung | Beispiel (Kodierung des Pfades /home/video/course01.mp4) |
|---|---|
| PHP | base64_encode('/home/video/course01.mp4') |
| Java | Base64.getEncoder().encodeToString(path.getBytes(StandardCharsets.UTF_8)) |
| Python | base64.b64encode(path.encode('utf-8')).decode() |
| C# / .NET | Convert.ToBase64String(Encoding.UTF8.GetBytes(path)) |
| Node.js | Buffer.from(path, 'utf8').toString('base64') |
| Linux / macOS shell | printf '%s' "/home/video/course01.mp4" | base64 |
| Windows PowerShell | [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("C:\video\course01.mp4")) |
Um es noch einmal zu betonen: Es gibt keine Möglichkeit, das Argument -profile lokal zu generieren. Es ist eine verschlüsselte Zeichenfolge, die an Ihr Konto gebunden ist und nur über den GetPackagerEncryptedParams-Webdienst abgerufen werden kann.
7Beispiele für serverseitige Automatisierung
Die Verkettung von "Parameter abrufen + Verschlüsselungsprogramm aufrufen" ermöglicht eine Ein-Klick-Verschlüsselung aus dem Backoffice Ihrer Website oder eine geplante Batch-Verschlüsselung. Das folgende PHP-Beispiel ruft das Linux-Verschlüsselungsprogramm auf (fortgesetzt aus dem Code in Abschnitt 4.4; zur Laufzeit sollte $profile zuerst aus dem Cache gelesen werden, und der Webdienst in 4.4 nur aufgerufen werden, wenn kein zwischengespeicherter Wert vorhanden ist):
Beispiel für ein Shell-Batch-Verschlüsselungsskript (Linux — kodiert Pfade lokal und verschlüsselt dann jede Datei):
Empfohlene Vorgehensweise: Rufen Sie das ProfileEncryptedParam für eine bestimmte ProfileID einmal über den Webdienst ab und speichern Sie es zur Wiederverwendung zwischen — rufen Sie den Webdienst nicht einmal pro verschlüsselter Datei auf. Generieren Sie enc_Input / enc_Output-Äquivalente direkt durch Base64-Kodierung (UTF-8) der Pfade auf Ihrem Server (in PHP: base64_encode($path), siehe Abschnitt 6) — kein Webdienst-Aufruf erforderlich. Begrenzen Sie bei der Batch-Verschlüsselung die Parallelität (z. B. 2-4 Verschlüsselungsprozesse pro Server), um eine Sättigung von Bandbreite und CPU zu vermeiden.
8Häufig gestellte Fragen (FAQ)
Q1: Der Webdienst gibt "Your XML web service login info is not correct..." zurück
AdminEmail oder WebServiceAuthStr ist falsch. Überprüfen Sie beide in der DRM-X-Administrationskonsole; stellen Sie sicher, dass die Werte keine führenden oder abschließenden Leerzeichen enthalten. Beachten Sie auch, dass selbst bei diesem Fehler der HTTP-Statuscode weiterhin 200 ist — Ihr Programm muss den Erfolg durch Überprüfung der Antwortfelder feststellen, nicht anhand des HTTP-Statuscodes.
Q2: Die direkte Übergabe der numerischen ID (z. B. 1001) an -profile verursacht einen Fehler
-profile muss die vollständige vom Webdienst zurückgegebene verschlüsselte Zeichenfolge ProfileEncryptedParam sein — nicht die numerische Profile-ID. Die numerische ID wird nur beim Aufruf des Webdienstes verwendet.
Q3: Der Pfad enthält Nicht-ASCII-Zeichen oder Leerzeichen und die Verschlüsselung schlägt fehl?
Pfade werden als Base64 übertragen, und Nicht-ASCII-Zeichen und Leerzeichen werden vollständig unterstützt. Der Schlüssel liegt darin, dass die Kodierung UTF-8 verwenden muss: Unter Windows verwenden Notepad / cmd möglicherweise standardmäßig ANSI- (GBK-) Kodierung, die den Pfad nach der Base64-Dekodierung beschädigt. Kodieren Sie Pfade in Ihrem Programm als UTF-8, wie in Abschnitt 6 beschrieben (bei einer als UTF-8 gespeicherten PHP-Quelldatei funktioniert einfaches base64_encode() direkt; Legacy-GBK-kodierte Zeichenfolgen können zuerst mit iconv('GBK', 'UTF-8', $path) oder mb_convert_encoding() konvertiert und dann kodiert werden).
Q4: Das Programm meldet einen Ausgabefehler / kann das Ausgabeverzeichnis nicht finden
Das übergeordnete Verzeichnis der Ausgabedatei muss im Voraus erstellt werden (z. B. mkdir -p ./output). Überprüfen Sie außerdem, ob der Benutzer, der das Programm ausführt, Schreibberechtigung für dieses Verzeichnis hat.
Q5: macOS meldet, das Programm "cannot be opened because the developer cannot be verified"
Das Programm ist nicht von Apple notarisiert, daher blockiert Gatekeeper den ersten Start. Wählen Sie eine der beiden Abhilfen: ① Führen Sie xattr -d com.apple.quarantine ./drm-x5-encrypt-sdk-macos-arm64 in einem Terminal aus, um das Quarantäne-Flag zu entfernen; ② Oder klicken Sie in Systemeinstellungen → Datenschutz & Sicherheit auf "Trotzdem öffnen".
Q6: Unter Linux kann das Programm nicht ausgeführt werden (Permission denied oder Formatfehler)
Führen Sie zuerst chmod +x drm-x5-encrypt-sdk-linux-x86_64 aus. Wenn Sie "cannot execute binary file" erhalten, bestätigen Sie, dass der Server x86_64 ist (uname -m). Das aktuelle Paket enthält nur x86_64-Builds; für ARM-Server wenden Sie sich bitte an Haihaisoft.
Q7: Sollte ich com oder cn verwenden? Was passiert, wenn ich das falsche wähle?
Es muss mit der Plattform Ihres DRM-X-Kontos übereinstimmen: Internationale Konten verwenden com (und rufen 5.drm-x.com auf), China-Konten verwenden cn (und rufen 5.drm-x.cn auf). Eine Nichtübereinstimmung verursacht einen Authentifizierungsfehler oder Verschlüsselungsparameter, die nicht zur Plattform passen.
Q8: Wie überprüfe ich die verschlüsselten Dateien?
Öffnen Sie die Ausgabedateien im DRM-X 5.0-Demo-Player / Ihrem integrierten Player und bestätigen Sie: Die Wiedergabe wird ohne Lizenz blockiert und spielt normal ab, nachdem Sie einen Testbenutzer in der Administrationskonsole autorisiert haben. Überprüfen Sie in kleinem Maßstab, bevor Sie Produktionsinhalte in großen Mengen verschlüsseln.
9Hinweise und bewährte Verfahren
- Bewahren Sie die Originaldateien auf: Schreiben Sie die Ausgabe an einen neuen Speicherort oder unter einem neuen Dateinamen (z. B. mit einem _P-Suffix), damit die Originalvideos niemals überschrieben werden.
- Klein vor groß: Wenn Sie ein neues Profil oder einen neuen Server zum ersten Mal verwenden, führen Sie ein kurzes Testvideo durch den gesamten Ablauf "Parameter abrufen → verschlüsseln → lizenzierte Wiedergabe", bevor Sie die Stapelverarbeitung durchführen.
- Bearbeiten Sie die Argumente niemals von Hand: -profile ist eine Base64-verschlüsselte Zeichenfolge — kopieren Sie sie vollständig (keine zusätzlichen führenden/abschließenden Leerzeichen, keine Zeilenumbruch-Kürzung).
- Halten Sie die Authentifizierungszeichenfolge geheim: WebServiceAuthStr gehört nur in die serverseitige Konfiguration; stellen Sie Demo-Webtools wie GetPackagerEncryptedParams.php nicht im öffentlichen Internet bereit.
- Netzwerkanforderung: Während der Verschlüsselung muss der Server die DRM-X-Server erreichen (International 5.drm-x.com / China 5.drm-x.cn); erlauben Sie ausgehenden Port 443, falls eine Firewall vorhanden ist.
Weitere DRM-X 5.0 Tutorials
DRM-X 5.0 EinführungsvideoDRM-X 5.0 ist eine neue Generation von Verschlüsselungssoftware-Plattformen. Haihaisoft bietet gängige DRM-X 5.0 Video-Demo-Tutorials an, einschließlich DRM-X 5.0 Einführung, Videoverschlüsselungs-Tutorial, Webseitenverschlüsselungs-Tutorial und wie man HTML5-Videoplayer einbettet.
JETZT ANSEHEN
So schützen Sie Videos mit DRM-X 5.0 ZJGet für WindowsDieses Video zeigt, wie Sie Dateien unter Windows mit dem ZJGet-Browser verschlüsseln.
JETZT ANSEHEN
So schützen Sie Videos mit DRM-X 5.0 ZJGet für macOSDieses Video zeigt, wie Sie Dateien unter macOS mit dem ZJGet-Browser verschlüsseln.
JETZT ANSEHEN
Erste Schritte mit DRM-X 5.0 ZJGet für WindowsDieses Video zeigt Ihnen, wie Sie mit dem ZJGet-Browser verschlüsselte Dateien unter Windows herunterladen, installieren und öffnen können.
JETZT ANSEHEN
DRM-X 5.0 ZJGet-BenutzerhandbuchZJGet Browser-Benutzerhandbuch. Dieses Tutorial hilft Ihnen, die Kernfunktionen und praktischen Tipps des ZJGet Browsers mühelos zu meistern.
JETZT ANSEHEN
DRM-X 5.0 ZJGet FAQHäufig gestellte Fragen (FAQ) zur Verwendung des ZJGet Browsers. Dieser Abschnitt enthält die nützlichsten Fragen und Antworten, um Ihnen zu helfen, alle Hindernisse zu überwinden, auf die Sie stoßen könnten.
JETZT ANSEHENFragen?
Unsere Mitarbeiter haben die Antworten.
Fragen Sie nach Haihaisoft-Produkten, Preisen, Implementierung oder allem anderen – unsere bestens geschulten Mitarbeiter stehen Ihnen gerne zur Verfügung.
Tel.: +64 27 507 9959 (Neuseeland)
QQ: 1279126286 / 994184623
Kontaktieren Sie uns unter Microsoft Teams
service#haihaisoft.com (ersetzen Sie # durch @)
Kontakt