Μετάβαση στο κύριο περιεχόμενο

Ενσωματώστε τον Υπογράφοντα Legalesign στον Ιστότοπό σας

Ενεργοποίηση για την ομάδα σας

Το συστατικό Υπογράφων απαιτεί ενεργοποίηση. Επικοινωνήστε με την υποστήριξη για να το ενεργοποιήσετε για την ομάδα σας.

Ο Υπογράφων Legalesign είναι ένα πλατφορμοανεξάρτητο web συστατικό που παρέχει μια ολοκληρωμένη και ομαλή εμπειρία υπογραφής εγγράφων μέσα από τη δική σας εφαρμογή. Λειτουργεί με απλό HTML, React, Vue, Angular ή οποιοδήποτε web framework.

Ενσωματώστε αυτό το συστατικό όπου οι χρήστες σας χρειάζεται να υπογράψουν έγγραφα — μέσα σε CRM, portal πελατών ή οποιαδήποτε εσωτερική εφαρμογή που αποδίδει HTML.

Εγκατάσταση

Φορτώστε απευθείας από το CDN (δεν απαιτείται εγκατάσταση):

<script type="module" src="https://cdn.legalesign.io/signer/latest/ls-signer.esm.js"></script>

Εγκατάσταση React

Εγκαταστήστε μέσω διαχειριστή πακέτων:

npm install legalesign-signer
# or
pnpm add legalesign-signer

Βασική Ενσωμάτωση

HTML & JavaScript

<ls-signer
recipient-id="abc123"
private-key="key"
session-id="session"
></ls-signer>

<script>
const signer = document.querySelector('ls-signer');
signer.addEventListener('signingSuccess', (e) => console.log('Signed:', e.detail.eventType, e.detail.documentId));
signer.addEventListener('signingFail', (e) => console.error('Failed:', e.detail.failureReason, e.detail.error));
signer.addEventListener('fieldChange', (e) => console.log('Field event:', e.detail.eventType));
</script>

React

import { useEffect, useState } from 'react';
import { LsSigner } from 'legalesign-signer/react';
import 'legalesign-signer/react.css';

function SigningPage() {
const [signerData, setSignerData] = useState(null);

useEffect(() => {
fetch('/your-backend/to-get-token')
.then(res => res.json())
.then(setSignerData);
}, []);

if (!signerData) return <p>Loading...</p>;

return (
<LsSigner
recipientId={signerData.recipientId}
privateKey={signerData.token}
sessionId={signerData.sessionId}
onSuccess={({ eventType, documentId }) => console.log(eventType, documentId)}
onFail={({ eventType, failureReason, error }) => console.error(eventType, failureReason, error)}
onChange={({ eventType, uuid, saved, field, document }) => console.log('Event:', eventType)}
/>
);
}

Το React απαιτεί react και react-dom (έκδοση 18 ή 19) ως peer dependencies.

Vue

<template>
<ls-signer
ref="signer"
:recipient-id="recipientId"
:private-key="privateKey"
:session-id="sessionId"
/>
</template>

<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';

const signer = ref(null);

function handleSuccess(e) {
console.log('Signed:', e.detail);
}
function handleFail(e) {
console.error('Failed:', e.detail);
}

onMounted(() => {
signer.value.addEventListener('signingSuccess', handleSuccess);
signer.value.addEventListener('signingFail', handleFail);
});

onBeforeUnmount(() => {
signer.value?.removeEventListener('signingSuccess', handleSuccess);
signer.value?.removeEventListener('signingFail', handleFail);
});
</script>
Συμβουλή

Αν χρησιμοποιείτε Vue με Vite, προσθέστε isCustomElement: (tag) => tag.startsWith('ls-') στη ρύθμιση του Vue plugin για να καταστείλετε τις προειδοποιήσεις σχετικά με άγνωστα στοιχεία.

Προειδοποίηση

Το Vue 3 μετατρέπει σε πεζά τα ονόματα συμβάντων σε προσαρμοσμένα στοιχεία, επομένως το @signingSuccess δεν θα λειτουργήσει. Χρησιμοποιήστε addEventListener στο ref του στοιχείου όπως φαίνεται παραπάνω.

Nuxt 3

Εγκλωβίστε το <ls-signer> μέσα σε <ClientOnly> για να αποφύγετε σφάλματα SSR. Προσθέστε τη ρύθμιση του προσαρμοσμένου στοιχείου στο nuxt.config.ts:

export default defineNuxtConfig({
vue: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('ls-'),
},
},
});

Πιστοποίηση

Το συστατικό υπογράφοντος απαιτεί ένα βραχυπρόθεσμο token από το backend σας. Υπάρχουν δύο επιλογές:

  1. GraphQL generateComponentToken — Κλήση με component: LS_SIGNER και είτε recipientId είτε sessionId στο scope του υπογράφοντα (δώστε μόνο το ένα, όχι και τα δύο).
  2. REST API — Κλήση GET /signer/{signerId}/component-token/ με το API key σας.

Και οι δύο επιστρέφουν το token και το sessionId που χρειάζεται το συστατικό. Δείτε Έγκριση Widget για τη λεπτομερή ροή token από διακομιστή.

Επιλογή 1: GraphQL (Node.js)

Χρήση recipientId (η πιο συνηθισμένη – χρησιμοποιήστε όταν γνωρίζετε τον παραλήπτη αλλά δεν έχετε ακόμη συνεδρία):

const response = await fetch('https://graphql.uk.legalesign.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.LEGALESIGN_API_KEY}`,
},
body: JSON.stringify({
query: `mutation MintSignerToken($input: GenerateComponentTokenInput!) {
generateComponentToken(input: $input) {
token
tokenType
sessionId
expiresIn
expiresAt
}
}`,
variables: {
input: {
component: 'LS_SIGNER',
signer: { recipientId: '<recipient-id>' }
}
}
})
});

const { data } = await response.json();
const { token, sessionId } = data.generateComponentToken;

Εναλλακτικά, αν ήδη έχετε sessionId από προηγούμενη κλήση:

variables: {
input: {
component: 'LS_SIGNER',
signer: { sessionId: '<session-id>' }
}
}

Επιλογή 2: REST API

const response = await fetch(
`https://eu-api.legalesign.com/api/v1/signer/${signerId}/component-token/`,
{
headers: {
Authorization: `Bearer ${process.env.LEGALESIGN_API_KEY}`,
},
}
);

const { token, sessionId } = await response.json();

Δώστε το token ως private-key και το sessionId ως session-id στο συστατικό.

Απαιτούμενα Χαρακτηριστικά

ΧαρακτηριστικόΤύποςΠεριγραφή
recipient-idstringΑναγνωριστικό παραλήπτη (base64, πρόθεμα rec ή UUID)
private-keystringToken που επιστρέφεται από το generateComponentToken
session-idstringΑναγνωριστικό συνεδρίας που επιστρέφεται από το generateComponentToken

Προαιρετικά Χαρακτηριστικά

ΧαρακτηριστικόΤύποςΠροεπιλογήΠεριγραφή
colourstringblueΌνομα χρώματος θέματος (δείτε Θεματισμός)
stylestring``Τροποποιήσεις στυλ (δείτε Προσαρμοσμένο CSS)
brandingbooleantrueΑφαίρεση branding Legalesign
languagestringΚαταναγκαστική χρήση συγκεκριμένης γλώσσας και απόκρυψη επιλογέα γλώσσας (δείτε Διεθνοποίηση)

Συμβάντα

Web component συμβάνReact propeventTypeΠότε
signingSuccessonSuccess"success"Το έγγραφο υπογράφτηκε με επιτυχία
signingFailonFail"failure"Η υπογραφή απέτυχε, απορρίφθηκε, έληξε, ακυρώθηκε, διαγράφηκε ή αφαιρέθηκε
fieldChangeonChange"ready"Το έγγραφο και οι εικόνες φορτώθηκαν πλήρως
fieldChangeonChange"save"Μια τιμή πεδίου αποθηκεύτηκε
fieldChangeonChange"select"Ένα πεδίο επιλέχθηκε ή πήρε εστίαση

signingSuccess / onSuccess

{
eventType: 'success';
documentId: string;
recipientId: string;
}

signingFail / onFail

{
eventType: 'failure';
failureReason: FailureReason;
error: string;
documentId?: string;
recipientId: string;
}
failureReasonΑιτία
documentExpiredΤο έγγραφο έχει λήξει ή η ημερομηνία λήξης είναι στο παρελθόν
sessionExpiredΤο API επέστρεψε 401 ή 403
cancelledΗ κατάσταση εγγράφου είναι "cancelled"
deletedΤο έγγραφο έχει διαγραφεί
rejectedΟ παραλήπτης απέρριψε το έγγραφο
removedΤο API επέστρεψε 404
signingErrorΟποιοδήποτε άλλο σφάλμα κατά το φόρτωμα ή την υπογραφή

fieldChange / onChange

και τα τρία eventType μοιράζονται το ίδιο συμβάν. Χρησιμοποιήστε το eventType για να διαφοροποιήσετε:

// eventType: 'ready' — document fully loaded
{ eventType: 'ready'; document: { documentId, name, state, recipientId, pageCount, expires?, isApprover, isWitness, canReassign, doOfferReject } }

// eventType: 'save' — field value saved
{ eventType: 'save'; uuid: string; saved: boolean; field: Record<string, any> }

// eventType: 'select' — field selected or focused
{ eventType: 'select'; uuid: string; field: Record<string, any> }

React Props

Το React component χρησιμοποιεί camelCase props και callback props αντί για DOM events:

PropΤύποςΑπαραίτητοΠεριγραφή
recipientIdstringΑναγνωριστικό παραλήπτη
privateKeystringΙδιωτικό κλειδί από το mutation generateComponentToken
sessionIdstringΑναγνωριστικό συνεδρίας
colourLsSignerColourΧρώμα θέματος
brandingbooleanΕμφάνιση branding Legalesign. Από προεπιλογή true.
languagestringΚαταναγκαστική χρήση συγκεκριμένης γλώσσας (δείτε Διεθνοποίηση)
onSuccess(data: { eventType: 'success'; documentId: string; recipientId: string }) => voidΚαλείται σε επιτυχή υπογραφή
onFail(data: { eventType: 'failure'; failureReason: FailureReason; error: string; documentId?: string; recipientId: string }) => voidΚαλείται σε αποτυχία υπογραφής
onChange(data: { eventType: 'ready' | 'save' | 'select'; document?: DocumentSummary; uuid?: string; saved?: boolean; field?: Record<string, any> }) => voidΚαλείται σε γεγονότα πεδίων και σε φόρτωση εγγράφου

Γενικός χειριστής (για debugging & πρωτοτυποποίηση)

Καθώς κάθε συμβάν περιλαμβάνει eventType, μπορείτε να συνδέσετε μια ενιαία λειτουργία σε όλα τα συμβάντα:

React:

const handleSignerEvent = (e) => {
switch (e.eventType) {
case 'success': console.log('Signed:', e.documentId); break;
case 'failure': console.log('Failed:', e.failureReason, e.error); break;
case 'ready': console.log('Ready:', e.document?.name); break;
case 'save': console.log('Saved field:', e.uuid, e.saved); break;
case 'select': console.log('Selected field:', e.uuid); break;
}
};

<LsSigner
onSuccess={handleSignerEvent}
onFail={handleSignerEvent}
onChange={handleSignerEvent}
/>

Web component:

const handleSignerEvent = (e) => {
switch (e.detail.eventType) {
case 'success': console.log('Signed:', e.detail.documentId); break;
case 'failure': console.log('Failed:', e.detail.failureReason, e.detail.error); break;
case 'ready': console.log('Ready:', e.detail.document?.name); break;
case 'save': console.log('Saved field:', e.detail.uuid, e.detail.saved); break;
case 'select': console.log('Selected field:', e.detail.uuid); break;
}
};

signer.addEventListener('signingSuccess', handleSignerEvent);
signer.addEventListener('signingFail', handleSignerEvent);
signer.addEventListener('fieldChange', handleSignerEvent);

Θεματισμός

Ορίστε χρωματικό θέμα με το prop colour. Όλες οι αποχρώσεις παράγονται αυτόματα.

Διαθέσιμα Χρώματα

pink · blue · purple · indigo · teal · green · lightblue · burnt · aubergine · red · yellow · cyan · lime · trueGreen

Παραλείψτε το prop για το προεπιλεγμένο μπλε.

<ls-signer colour="pink" ...></ls-signer>
<LsSigner colour="pink" ... />

Το prop colour ορίζει την ιδιότητα data-ls-theme στη ρίζα του component. Τα CSS custom properties ορίζουν μια κλίμακα σκιάς 10–100 για κάθε χρώμα:

ΑπόχρωσηΧρήση
10Ανοιχτά φόντα, λεπτοί γεμίσματα
20Λεπτά περιγράμματα
30Δακτύλιοι εστίασης
60Κύριο χρώμα (κουμπιά, σύνδεσμοι, ενεργές καταστάσεις)
70Κατάσταση hover
80Σκούρες/ισχυρές τονίσεις

Προσαρμοσμένο CSS

Το συστατικό εκθέτει CSS custom properties που μπορούν να παρακαμφθούν για να προσαρμόσετε την εμφάνιση πέρα από το χρωματικό θέμα. Αυτό το σύνολο ιδιοτήτων είναι για την ώρα περιορισμένο, επικοινωνήστε μαζί μας για περισσότερα.

<ls-signer
style="--ls-font-family: 'Inter', sans-serif; --ls-color-primary-60: #e91e63;"
recipient-id="abc123"
private-key="key"
session-id="session"
></ls-signer>

Διαθέσιμες Ιδιότητες

ΙδιότηταΠροεπιλογήΠεριγραφή
--ls-font-family'IBM Plex Sans', sans-serifΚύρια οικογένεια γραμματοσειράς
--ls-color-primary-10 έως --ls-color-primary-100Πλήρης κλίμακα κύριου χρώματος (υπερισχύει του θέματος)
--ls-color-error#f64a44Χρώμα κατάστασης σφάλματος
--ls-color-error-light#fff0f0Φόντο σφάλματος
--ls-color-success#46dbaaΧρώμα κατάστασης επιτυχίας
--ls-color-success-light#effff9Φόντο επιτυχίας
--ls-color-warning#fad232Χρώμα κατάστασης προειδοποίησης
--ls-color-warning-light#fffcefΦόντο προειδοποίησης
--ls-color-border#d8d9dcΠροεπιλεγμένο χρώμα περιγράμματος
--ls-color-border-subtle#e0e2e5Λεπτό χρώμα περιγράμματος
--ls-color-bg-subtle#f7f8faΛεπτό χρώμα φόντου

Σημείωση: Για πλήρη έγχυση προσαρμοσμένου CSS (στόχευση εσωτερικών στοιχείων απευθείας, παράκαμψη μεγεθών γραμματοσειράς, ακτίνας περιγράμματος, διαστημάτων κλπ), αυτή είναι ένα προγραμματισμένο μελλοντικό χαρακτηριστικό. Παρακαλούμε επικοινωνήστε μαζί μας αν σας ενδιαφέρει.

Διεθνοποίηση

Το συστατικό υποστηρίζει 17 γλώσσες με μεταφράσεις ενσωματωμένες στο build. Η γλώσσα ανιχνεύεται αυτόματα από τον browser. Ένας ενσωματωμένος επιλογέας γλώσσας στο UI υπογραφής επιτρέπει στον παραλήπτη να αλλάζει γλώσσα ανά πάσα στιγμή.

Ορίστε το χαρακτηριστικό language για να επιβάλετε συγκεκριμένη γλώσσα. Όταν παρέχεται, ο ενσωματωμένος επιλογέας γλώσσας αποκρύπτεται και αγνοείται η ανίχνευση browser.

<ls-signer language="fr" recipient-id="abc123" private-key="key" session-id="session"></ls-signer>
<LsSigner language="fr" recipientId="abc123" privateKey="key" sessionId="session" />

Προτεραιότητα σειράς: prop language → γλώσσα browser → Αγγλικά ως προεπιλογή.

ΚωδικόςΓλώσσαΚωδικόςΓλώσσα
enΑγγλικάnlΟλλανδικά
frΓαλλικάfiΦινλανδικά
bgΒουλγαρικάitΙταλικά
esΙσπανικάheΕβραϊκά
deΓερμανικάsvΣουηδικά
gsΣκωτσέζικα ΓαελικάcyΟυαλικά
arΑραβικάisΙσλανδικά
elΕλληνικάiwΕβραϊκά (παλαιά)
ptΠορτογαλικά
roΡουμανικά

Έκδοση CDN

Το URL του CDN υποστηρίζει τόσο το latest όσο και αριθμούς δεσμευμένων εκδόσεων:

<!-- Always get the most recent version (recommended) -->
<script type="module" src="https://cdn.legalesign.io/signer/latest/ls-signer.esm.js"></script>

<!-- Pin to a specific version -->
<script type="module" src="https://cdn.legalesign.io/signer/v1.1.0/ls-signer.esm.js"></script>

Συνιστούμε τη χρήση latest — αυτό εξασφαλίζει ότι η ενσωμάτωση σας λαμβάνει αυτόματα διορθώσεις σφαλμάτων, ενημερώσεις ασφαλείας και νέα χαρακτηριστικά. Χρησιμοποιήστε σταθερή έκδοση αν χρειάζεστε να κλειδώσετε σε γνωστή λειτουργική έκδοση κατά τη διάρκεια περιόδου QA freeze ή ελεγχόμενης διανομής. Δείτε το πλήρες ιστορικό εκδόσεων στο npm για διαθέσιμες εκδόσεις.

Πλήρες Παράδειγμα

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document Signing</title>
<script type="module" src="https://cdn.legalesign.io/signer/latest/ls-signer.esm.js"></script>
</head>
<body>
<ls-signer
recipient-id="abc123"
private-key="key"
session-id="session"
colour="teal"
></ls-signer>

<script>
const signer = document.querySelector('ls-signer');

signer.addEventListener('signingSuccess', (event) => {
console.log('Document signed:', event.detail.documentId);
window.location.href = '/thank-you';
});

signer.addEventListener('signingFail', (event) => {
console.error('Signing failed:', event.detail.failureReason, event.detail.error);
});

signer.addEventListener('fieldChange', (event) => {
if (event.detail.eventType === 'ready') {
console.log('Ready to sign:', event.detail.document.name);
}
});
</script>
</body>
</html>

Υποστήριξη Browser

  • Chrome/Edge (τελευταίες εκδόσεις)
  • Firefox (τελευταίες εκδόσεις)
  • Safari (τελευταίες εκδόσεις)
  • Mobile browsers (iOS Safari, Chrome Mobile)

Πόροι

Βίντεο: Μετάβαση από iframe στο Συστατικό Υπογράφοντα