Code Examples

JavaScript (Node.js)

const crypto = require('crypto');

function canonicalizeJSON(obj, seenObjects = new WeakSet()) {
    if (obj === null) return 'null';
    if (typeof obj === 'undefined') return 'undefined';
    if (typeof obj === 'boolean' || typeof obj === 'number') return String(obj);
    if (typeof obj === 'string') return JSON.stringify(obj);
    if (obj instanceof Date) return JSON.stringify(obj.toISOString());
    
    if (Array.isArray(obj)) {
        if (seenObjects.has(obj)) return '[Circular]';
        seenObjects.add(obj);
        const items = obj.map(item => canonicalizeJSON(item, seenObjects));
        seenObjects.delete(obj);
        return `[${items.join(',')}]`;
    }
    
    if (typeof obj === 'object') {
        if (seenObjects.has(obj)) return '{Circular}';
        seenObjects.add(obj);
        const sortedKeys = Object.keys(obj).sort();
        const pairs = sortedKeys.map(key => {
            const value = canonicalizeJSON(obj[key], seenObjects);
            return `${JSON.stringify(key)}:${value}`;
        });
        seenObjects.delete(obj);
        return `{${pairs.join(',')}}`;
    }
    
    return JSON.stringify(obj);
}

function generateSignature(body, clientSecret) {
    const canonicalBody = body ? canonicalizeJSON(body) : '';
    return crypto
        .createHmac('sha256', clientSecret)
        .update(canonicalBody)
        .digest('hex');
}

// Add to request headers
const headers = {
    'x-client-id': clientId,
    'x-signature': generateSignature(requestBody, clientSecret),
    'x-timestamp': Date.now().toString(),
    'Content-Type': 'application/json'
};

Python

cURL

Last updated