Express.js Handler
Codeimport express from "express"; import { SaligPay } from "saligpay-node"; const app = express(); const saligpay = new SaligPay({ clientId: process.env.SALIGPAY_CLIENT_ID, clientSecret: process.env.SALIGPAY_CLIENT_SECRET, webhookSecret: process.env.SALIGPAY_WEBHOOK_SECRET, }); app.use("/webhooks/saligpay", express.raw({ type: "application/json" })); app.post("/webhooks/saligpay", async (req, res) => { await saligpay.webhooks.listen(req, res, async (payload) => { console.log("Webhook received:", payload); switch (payload.status) { case "completed": await db.orders.update(payload.externalId, { status: "PAID", paidAt: new Date(), }); break; case "failed": await db.orders.update(payload.externalId, { status: "FAILED", }); break; } }); });
Fastify Handler
Codeimport Fastify from "fastify"; import { SaligPay } from "saligpay-node"; const fastify = Fastify(); const saligpay = new SaligPay({ clientId: process.env.SALIGPAY_CLIENT_ID, clientSecret: process.env.SALIGPAY_CLIENT_SECRET, webhookSecret: process.env.SALIGPAY_WEBHOOK_SECRET, }); fastify.post("/webhooks/saligpay", async (request, reply) => { try { const payload = saligpay.webhooks.constructEvent(request.body); console.log("Payment:", payload.externalId, payload.status); return reply.send({ received: true }); } catch (error) { return reply.code(400).send({ error: "Invalid webhook" }); } });
Manual Processing
Codeconst payload = saligpay.webhooks.constructEvent(rawBody); // or with signature verification: const payload = saligpay.webhooks.constructVerifiedEvent(rawBody, signature, timestamp);
Webhook Payload Types
Codeinterface SaligPayWebhookPayload { id?: string; externalId: string; amount: number; status: WebhookPaymentStatus; paymentMethod: WebhookPaymentMethod; contact?: ContactInfo; metadata?: Record<string, unknown>; createdAt?: string; updatedAt?: string; } type WebhookPaymentStatus = | "pending" | "processing" | "completed" | "failed" | "cancelled" | "expired" | "refunded"; interface WebhookPaymentMethod { id: string; type: "gcash" | "maya" | "card" | "bank_transfer" | string; }
Webhook Event Types
Codetype WebhookEventType = | "checkout.completed" | "checkout.failed" | "checkout.expired" | "payment_intent.succeeded" | "payment_intent.failed" | "refund.created"; type WebhookEvent = | { type: "checkout.completed"; data: SaligPayWebhookPayload & { status: "completed" } } | { type: "checkout.failed"; data: SaligPayWebhookPayload & { status: "failed" } } | { type: "checkout.expired"; data: SaligPayWebhookPayload & { status: "expired" } } | { type: "payment_intent.succeeded"; data: SaligPayWebhookPayload & { status: "completed" } } | { type: "payment_intent.failed"; data: SaligPayWebhookPayload & { status: "failed" } } | { type: "refund.created"; data: SaligPayWebhookPayload & { status: "refunded" } };
WebhookConfig Interface
Codeinterface WebhookConfig { signingSecret?: string; timestampTolerance?: number; // Default: 300 seconds }
Last modified on
