Chaindoc SDK-d
Chaindoc pakub kahte TypeScript SDK-d: Server SDK backendi tööks Node.js keskkonnas ja Embed SDK allkirjastamise liidese integreerimiseks otse sinu veebirakendusse. Mõlemad sisaldavad täielikke tüübikirjeldusi, null sõltuvust käivitamise ajal ja töötavad suvalise raamistikuga.
Saadaolevad SDK-d
npm seadistuse ja raamistikuspetsiifilise konfiguratsiooni (keskkonnamuutujad, providerid jne) jaoks vaata paigaldusjuhendit.
- Server SDK (@chaindoc_io/server-sdk) - Backend integratsioon Node.js 18+
- Embed SDK (@chaindoc_io/embed-sdk) - Frontend allkirjastamise liides veebirakendustele
- Python SDK - Tulekul varsti
- PHP SDK - Tulekul varsti
Server SDK
Server SDK pakib REST API tüübikindlasse Node.js liidesesse. Seda kasutad dokumentide haldamiseks, allkirjapäringute loomiseks, failide üleslaadimiseks ja plokiahela verifitseerimise käivitamiseks.
Paigaldamine
npm install @chaindoc_io/server-sdkKiire alustamine
import { Chaindoc } from '@chaindoc_io/server-sdk';
import { readFile } from 'fs/promises';
// 1. Initialize the SDK
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
// 2. Upload a document file
const buffer = await readFile('./contract.pdf');
const file = new Blob([buffer], { type: 'application/pdf' });
const { media } = await chaindoc.media.upload([file]);
// 3. Create a document
const doc = await chaindoc.documents.create({
name: 'Service Agreement',
description: 'Contract for consulting services',
media: media[0],
status: 'published', // Triggers blockchain verification
hashtags: ['#contract', '#2024'],
meta: [{ key: 'client', value: 'Acme Corp' }],
});
// 4. Create a signature request
const sigRequest = await chaindoc.signatures.createRequest({
versionId: doc.document.versions[0].uuid,
recipients: [{ email: 'signer@example.com' }],
deadline: new Date('2024-12-31'),
embeddedFlow: true,
});
// 5. Create session for frontend SDK
const session = await chaindoc.embedded.createSession({
email: 'signer@example.com',
metadata: {
documentId: doc.documentId,
signatureRequestId: sigRequest.signatureRequest.uuid,
},
});
console.log('Session ID:', session.sessionId);Express.js integratsioon
import express from 'express';
import { Chaindoc, ChaindocError } from '@chaindoc_io/server-sdk';
import multer from 'multer';
const app = express();
const upload = multer({ storage: multer.memoryStorage() });
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
// Upload and create document
app.post('/api/documents', upload.single('file'), async (req, res) => {
try {
const file = new Blob([req.file!.buffer], { type: req.file!.mimetype });
const { media } = await chaindoc.media.upload([file]);
const doc = await chaindoc.documents.create({
name: req.body.name,
description: req.body.description || '',
media: media[0],
status: 'published',
hashtags: req.body.hashtags || [],
meta: req.body.meta || [],
});
res.json({ documentId: doc.documentId });
} catch (error) {
if (error instanceof ChaindocError) {
res.status(error.statusCode || 500).json({ error: error.message });
} else {
res.status(500).json({ error: 'Internal server error' });
}
}
});
// Create embedded session for signer
app.post('/api/signing/session', async (req, res) => {
try {
const { email, documentId, signatureRequestId } = req.body;
const session = await chaindoc.embedded.createSession({
email,
metadata: { documentId, signatureRequestId },
});
res.json({ sessionId: session.sessionId });
} catch (error) {
if (error instanceof ChaindocError) {
res.status(error.statusCode || 500).json({ error: error.message });
}
}
});
app.listen(3000);Next.js API marsruudid
import { NextRequest, NextResponse } from 'next/server';
import { Chaindoc, ChaindocError } from '@chaindoc_io/server-sdk';
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
export async function POST(request: NextRequest) {
try {
const { email, documentId, signatureRequestId } = await request.json();
const session = await chaindoc.embedded.createSession({
email,
metadata: { documentId, signatureRequestId },
});
return NextResponse.json({
sessionId: session.sessionId,
expiresAt: session.expiresAt,
});
} catch (error) {
if (error instanceof ChaindocError) {
return NextResponse.json(
{ error: error.message },
{ status: error.statusCode || 500 }
);
}
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}Vigade käsitlemine
Mässi API kõikud alati try-catch plokkidesse ja käsitle ChaindocError spetsiifiliselt:
import { ChaindocError } from '@chaindoc_io/server-sdk';
try {
const doc = await chaindoc.documents.create({ /* ... */ });
} catch (error) {
if (error instanceof ChaindocError) {
console.error('API Error:', error.message);
console.error('Status Code:', error.statusCode);
switch (error.statusCode) {
case 400:
// Bad request - check parameters
break;
case 401:
// Unauthorized - check API key
break;
case 404:
// Not found
break;
case 429:
// Rate limited - SDK will auto-retry
break;
}
}
}Embed SDK
Embed SDK võimaldab näidata Chaindoc allkirjastamise liidest otse sinu veebirakenduses. See haldab iframe'i, OTP verifitseerimist ja suhtlust sinu rakenduse ja Chaindoc vahel. Kasutajad allkirjastavad dokumendid lahkumata sinu lehelt.
Paigaldamine
npm install @chaindoc_io/embed-sdkPõhiline kasutus
import { ChaindocEmbed } from '@chaindoc_io/embed-sdk';
// 1. Initialize SDK (once per page)
const chaindoc = new ChaindocEmbed({
publicKey: 'pk_live_xxxxxxxxxxxxx',
environment: 'production',
});
// 2. Get session from your backend
const response = await fetch('/api/signing/create-session', {
method: 'POST',
body: JSON.stringify({ documentId, signerEmail }),
});
const { sessionId } = await response.json();
// 3. Open signing flow
const instance = chaindoc.openSignatureFlow({
sessionId,
onReady: () => {
console.log('Signing interface loaded');
},
onSuccess: (data) => {
console.log('Document signed:', data.signatureId);
instance.close();
},
onError: (error) => {
console.error('Signing failed:', error.code, error.message);
},
onCancel: () => {
console.log('User cancelled');
instance.close();
},
});React integratsioon
import { useCallback, useRef, useEffect } from 'react';
import { ChaindocEmbed, EmbedInstance } from '@chaindoc_io/embed-sdk';
function SignButton({ sessionId }: { sessionId: string }) {
const sdkRef = useRef<ChaindocEmbed | null>(null);
const instanceRef = useRef<EmbedInstance | null>(null);
useEffect(() => {
sdkRef.current = new ChaindocEmbed({
publicKey: process.env.REACT_APP_CHAINDOC_PUBLIC_KEY!,
});
return () => {
sdkRef.current?.destroy();
};
}, []);
const handleSign = useCallback(() => {
if (!sdkRef.current) return;
instanceRef.current = sdkRef.current.openSignatureFlow({
sessionId,
onSuccess: (data) => {
console.log('Signed!', data.signatureId);
instanceRef.current?.close();
},
onCancel: () => {
instanceRef.current?.close();
},
});
}, [sessionId]);
return <button onClick={handleSign}>Sign Document</button>;
}Vue 3 integratsioon
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import { ChaindocEmbed, type EmbedInstance } from '@chaindoc_io/embed-sdk';
const props = defineProps<{ sessionId: string }>();
let sdk: ChaindocEmbed | null = null;
let instance: EmbedInstance | null = null;
onMounted(() => {
sdk = new ChaindocEmbed({
publicKey: import.meta.env.VITE_CHAINDOC_PUBLIC_KEY,
});
});
onUnmounted(() => {
sdk?.destroy();
});
function openSignature() {
if (!sdk) return;
instance = sdk.openSignatureFlow({
sessionId: props.sessionId,
onSuccess: (data) => {
console.log('Signed!', data.signatureId);
instance?.close();
},
onCancel: () => {
instance?.close();
},
});
}
</script>
<template>
<button @click="openSignature">Sign Document</button>
</template>Inline režiim
Modaali asemel manusta allkirjastamise liides otse oma lehele:
const instance = chaindoc.openSignatureFlow({
sessionId,
mode: 'inline',
container: document.getElementById('signature-container'),
onSuccess: (data) => {
console.log('Signed!');
},
});Teemad
Kohanda välimust heledate või tumedate teemadega:
const instance = chaindoc.openSignatureFlow({
sessionId,
theme: 'dark',
// ... other options
});
// Change theme dynamically
instance.changeTheme('light');Täielik töövoog näiteks
Siin on mõlemad SDK-d koos: Server SDK backendis dokumentide ja sessioonide loomiseks, Embed SDK frontendis allkirjastamise liidese näitamiseks.
1Backend: Dokumendi üleslaadimineKasuta Server SDK-d failide üleslaadimiseks ja dokumentide loomiseks
2Backend: Allkirjapäringu loomineLoo allkirjapäring embedded flow'ga lubatud
3Backend: Sessiooni genereerimineLoo embedded sessioon iga allkirjastaja jaoks
4Frontend: Embed SDK initsialiseerimineInitsialiseeri SDK avaliku võtmega
5Frontend: Allkirjastamise avamineAva allkirjastamise liides sessiooni ID-ga
6Frontend: Edu käsitlemineTöötle allkirjastatud dokument ja uuenda liidest
// server.ts
import { Chaindoc } from '@chaindoc_io/server-sdk';
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
// Upload & create document
const { media } = await chaindoc.media.upload([pdfFile]);
const doc = await chaindoc.documents.create({
name: 'Contract',
description: 'Service agreement',
media: media[0],
status: 'published',
hashtags: ['#contract'],
meta: [],
});
// Create signature request
const sigRequest = await chaindoc.signatures.createRequest({
versionId: doc.document.versions[0].uuid,
recipients: [{ email: 'signer@example.com' }],
deadline: new Date('2024-12-31'),
embeddedFlow: true,
});
// Create session
const session = await chaindoc.embedded.createSession({
email: 'signer@example.com',
metadata: {
documentId: doc.documentId,
signatureRequestId: sigRequest.signatureRequest.uuid,
},
});
// Return sessionId to frontend
res.json({ sessionId: session.sessionId });Parimad praktikad
- Initsialiseeri SDK üks kord lehe/komponendi elutsükli jooksul
- Hävita SDK instants alati komponendi unmountimisel
- Käsitle kõiki callback sündmusi (onSuccess, onError, onCancel)
- Hoiusta API võtmed keskkonnamuutujates
- Kasuta TypeScript-i parema tüübikindluse jaoks
- Rakenda korrektne vigade käsitlemine ChaindocError-ga
- Testi sandbox võtmetega enne produktsioonis kasutamist
Keskkonna konfiguratsioon
// Backend
const chaindoc = new Chaindoc({
secretKey: 'sk_live_xxxxx',
});
// Frontend
const embed = new ChaindocEmbed({
publicKey: 'pk_live_xxxxx',
environment: 'production',
});Mida teha edasi
- Paigaldus — npm seadistus, keskkonna konfiguratsioon ja raamistikuspetsiifilised providerid
- API dokumentatsioon — täielik REST endpointide viide
- Webhookid — reaalajas sündmuste teavitused sinu backendile
- Kiire alustamine — saada esimene allkiri 10 minutiga
- Turvalisus — API võtme haldus ja produktsiooni tugevdamine