Paso 1: Crea un proyecto de Worker
Si aún no tienes un proyecto de Workers, crea uno:npm create cloudflare@latest -- firma-signing
Selecciona “Hello World” Worker cuando se te solicite y luego elige JavaScript o TypeScript. Una vez que termine el proceso de creación:Paso 2: Guarda tu clave API como secreto
Añade tu clave API de Firma como un secreto cifrado. Wrangler te pedirá que pegues el valor:wrangler secret put FIRMA_API_KEY
Nunca escribas tu clave API directamente en los archivos fuente. Los secretos se cifran en reposo y se inyectan en el binding env de tu Worker en tiempo de ejecución.Paso 3: Crea un Worker para enviar solicitudes de firma
Reemplaza el contenido de src/index.js (o src/index.ts si elegiste TypeScript) con lo siguiente. Este Worker acepta una solicitud POST con los datos del firmante, llama al endpoint create-and-send de Firma y devuelve el ID de la solicitud de firma.const FIRMA_API = "https://api.firma.dev/functions/v1/signing-request-api";
export default {
async fetch(request, env) {
if (request.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
},
});
}
if (request.method !== "POST") {
return Response.json({ error: "Method not allowed" }, { status: 405 });
}
const { name, template_id, signer_email, signer_first_name, signer_last_name } =
await request.json();
const response = await fetch(
`${FIRMA_API}/signing-requests/create-and-send`,
{
method: "POST",
headers: {
Authorization: env.FIRMA_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
name,
template_id,
recipients: [
{
first_name: signer_first_name,
last_name: signer_last_name,
email: signer_email,
designation: "Signer",
order: 1,
},
],
}),
}
);
const data = await response.json();
if (!response.ok) {
return Response.json({ error: data }, { status: response.status });
}
return Response.json({
signing_request_id: data.id,
status: "sent",
});
},
};
El endpoint create-and-send crea la solicitud de firma y la envía a los destinatarios en una sola llamada. Si necesitas revisar o modificar la solicitud antes de enviarla, usa POST /signing-requests para crear un borrador y luego POST /signing-requests/{id}/send por separado.
Paso 4: Despliega
Wrangler mostrará la URL de tu Worker (algo como https://firma-signing.<tu-subdominio>.workers.dev). Tu frontend ya puede hacer POST con los datos del firmante a esa URL.Manejo de webhooks
Para hacer seguimiento de cuándo se firman los documentos, crea un segundo Worker que reciba los eventos de webhook de Firma. En el panel de Firma, en Configuración → Webhooks, registra un webhook que apunte a la URL de este Worker.export default {
async fetch(request, env) {
if (request.method !== "POST") {
return new Response("Method not allowed", { status: 405 });
}
const payload = await request.json();
const { type, data } = payload;
if (type === "signing_request.completed") {
const signingRequestId = data.signing_request.id;
console.log(`Signing request ${signingRequestId} completed`);
}
if (type === "signing_request.recipient.signed") {
const recipientEmail = data.recipient?.email;
console.log(`${recipientEmail} signed the document`);
}
return Response.json({ received: true });
},
};
Para uso en producción, verifica siempre la firma del webhook usando tu secreto de firma de webhook de Firma. Consulta la guía de webhooks para ver los detalles de implementación. Paso 1: Configura tu proyecto de Pages
Si ya tienes un proyecto de Cloudflare Pages, pasa al siguiente paso. Si no, crea uno:mkdir firma-app && cd firma-app
npm init -y
mkdir public functions
echo "<h1>Firma App</h1>" > public/index.html
Las Pages Functions viven en el directorio /functions. Cada archivo se asigna automáticamente a una ruta URL, así que functions/api/send-signing-request.js se convierte en /api/send-signing-request.Paso 2: Guarda tu clave API como secreto
Añade tu clave API de Firma como un secreto cifrado de Pages:wrangler pages secret put FIRMA_API_KEY --project-name your-project-name
Alternativamente, ve a Cloudflare panel → Pages → tu proyecto → Settings → Environment variables y añade FIRMA_API_KEY como una variable cifrada.Paso 3: Crea una Pages Function para enviar solicitudes de firma
Crea un nuevo archivo en functions/api/send-signing-request.js:const FIRMA_API = "https://api.firma.dev/functions/v1/signing-request-api";
export async function onRequestPost(context) {
const { name, template_id, signer_email, signer_first_name, signer_last_name } =
await context.request.json();
const response = await fetch(
`${FIRMA_API}/signing-requests/create-and-send`,
{
method: "POST",
headers: {
Authorization: context.env.FIRMA_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
name,
template_id,
recipients: [
{
first_name: signer_first_name,
last_name: signer_last_name,
email: signer_email,
designation: "Signer",
order: 1,
},
],
}),
}
);
const data = await response.json();
if (!response.ok) {
return Response.json({ error: data }, { status: response.status });
}
return Response.json({
signing_request_id: data.id,
status: "sent",
});
}
Las Pages Functions exportan manejadores nombrados por método HTTP: onRequestPost, onRequestGet, etc. Si necesitas manejar varios métodos, exporta onRequest y comprueba context.request.method dentro.
Paso 4: Despliega
Si tu proyecto de Pages está conectado a un repositorio Git, haz push de tus cambios y Cloudflare desplegará automáticamente. Para despliegues manuales:wrangler pages deploy public --project-name your-project-name
Tu función ya está activa en https://your-project.pages.dev/api/send-signing-request.Manejo de webhooks
Crea una segunda Pages Function en functions/api/firma-webhook.js para manejar los eventos de webhook entrantes de Firma. Registra esta URL en el panel de Firma, en Configuración → Webhooks.export async function onRequestPost(context) {
const payload = await context.request.json();
const { type, data } = payload;
if (type === "signing_request.completed") {
const signingRequestId = data.signing_request.id;
console.log(`Signing request ${signingRequestId} completed`);
}
if (type === "signing_request.recipient.signed") {
const recipientEmail = data.recipient?.email;
console.log(`${recipientEmail} signed the document`);
}
return Response.json({ received: true });
}
Para uso en producción, verifica siempre la firma del webhook usando tu secreto de firma de webhook de Firma. Consulta la guía de webhooks para ver los detalles de implementación.