Documentation Index
Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Requirements
- Node.js >= 18.0.0
Installation
npm install @waffo/waffo-node
# or
yarn add @waffo/waffo-node
# or
pnpm add @waffo/waffo-node
Initialization
import { Waffo, Environment } from '@waffo/waffo-node';
const waffo = new Waffo({
apiKey: 'your-api-key',
privateKey: 'your-base64-encoded-private-key',
waffoPublicKey: 'waffo-public-key',
merchantId: 'your-merchant-id',
environment: Environment.SANDBOX,
});
Payment
import { randomUUID } from 'crypto';
const paymentRequestId = randomUUID().replace(/-/g, '');
const response = await waffo.order().create({
paymentRequestId,
merchantOrderId: `ORDER_${Date.now()}`,
orderCurrency: 'HKD',
orderAmount: '100.00',
orderDescription: 'Test Product',
notifyUrl: 'https://your-site.com/webhook',
userInfo: {
userId: 'user_123',
userEmail: 'user@example.com',
userTerminal: 'WEB',
},
paymentInfo: { productName: 'ONE_TIME_PAYMENT' },
goodsInfo: { goodsUrl: 'https://your-site.com/product/001' },
});
if (response.isSuccess()) {
const data = response.getData();
console.log('Redirect URL:', data.orderAction);
console.log('Acquiring Order ID:', data.acquiringOrderId);
}
Inquiry
const inquiry = await waffo.order().inquiry({ acquiringOrderId: 'ACQ...' });
Subscription
const response = await waffo.subscription().create({ ... });
const inquiry = await waffo.subscription().inquiry({ subscriptionId: '...' });
await waffo.subscription().cancel({ subscriptionId: '...' });
Refund
const response = await waffo.order().refund({
refundRequestId: 'ref_...',
acquiringOrderId: 'ACQ...',
refundAmount: '50.00',
refundReason: 'Customer requested',
});
const inquiry = await waffo.refund().inquiry({ refundRequestId: 'ref_...' });
Webhook handling
const handler = waffo.webhook()
.onPayment((notification) => {
console.log('Payment:', notification.orderStatus);
})
.onRefund((notification) => {
console.log('Refund:', notification.refundStatus);
})
.onSubscriptionStatus((notification) => {
console.log('Subscription:', notification.subscriptionStatus);
})
.onSubscriptionChange((notification) => {
console.log('Subscription Change:', notification.subscriptionChangeStatus);
});
// Express.js example
app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
const body = req.body.toString();
const signature = req.headers['x-signature'] as string;
const result = await waffo.webhook().handleWebhook(body, signature);
res.setHeader('X-SIGNATURE', result.responseSignature);
res.setHeader('Content-Type', 'application/json');
res.status(200).send(result.responseBody);
});
Error handling
import { WaffoUnknownStatusError, WaffoError } from '@waffo/waffo-node';
try {
const response = await waffo.order().create({ ... });
if (response.isSuccess()) {
// Handle success
} else {
// API returned an error (code != "0")
}
} catch (error) {
if (error instanceof WaffoUnknownStatusError) {
// Important: the payment may have succeeded! Confirm via the inquiry API
const inquiry = await waffo.order().inquiry({ paymentRequestId });
} else if (error instanceof WaffoError) {
// Client-side error (configuration, signature, etc.); fix and retry
}
}