Node.js Örneği¶
Tam çalışan bir Node.js webhook sunucusu ve status update istemcisi.
Kurulum¶
Webhook Sunucusu¶
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
const API_SECRET = process.env.API_SECRET || 'your-api-secret';
const PORT = process.env.PORT || 3001;
// İmza doğrulama middleware
function verifySignature(req, res, next) {
const signature = req.headers['x-muditapos-signature'];
if (!signature) {
console.warn('İmza header eksik, devam ediliyor...');
return next(); // Dev ortamda geçirebilirsiniz
}
const body = JSON.stringify(req.body);
const expected = crypto
.createHmac('sha256', API_SECRET)
.update(body)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).json({ error: 'Geçersiz imza' });
}
next();
}
// ─── Yeni Sipariş ───
app.post('/webhooks/new-order', verifySignature, (req, res) => {
const order = req.body;
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log('🆕 YENİ SİPARİŞ');
console.log(` Platform : ${order.provider}`);
console.log(` Sipariş ID : ${order.providerOrderId}`);
console.log(` Müşteri : ${order.customerName}`);
console.log(` Telefon : ${order.customerPhone}`);
console.log(` Adres : ${order.customerAddress}`);
console.log(` Toplam : ${order.totalAmount} TL`);
console.log(` Ödeme : ${order.paymentMethod}`);
console.log(` Not : ${order.note || '-'}`);
console.log(` Gel-Al : ${order.isPickup ? 'Evet' : 'Hayır'}`);
console.log(` Ürünler:`);
order.items?.forEach((item, i) => {
console.log(` ${i + 1}. ${item.name} x${item.quantity} = ${item.totalPrice} TL`);
if (item.options?.length > 0) {
item.options.forEach(opt => console.log(` + ${opt.name} (${opt.price} TL)`));
}
});
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
// ✅ Hemen 200 döndür, arka planda işle
res.json({ status: 'received' });
// Kendi veritabanınıza kaydedin...
saveOrderToDatabase(order).catch(console.error);
});
// ─── İptal ───
app.post('/webhooks/cancel-order', verifySignature, (req, res) => {
console.log('❌ SİPARİŞ İPTAL:', req.body.providerOrderId);
res.json({ status: 'received' });
});
// ─── Durum Güncelleme ───
app.post('/webhooks/order-status', verifySignature, (req, res) => {
console.log('🔄 DURUM DEĞİŞTİ:', req.body.providerOrderId, req.body.newStatus);
res.json({ status: 'received' });
});
// Placeholder DB fonksiyonu
async function saveOrderToDatabase(order) {
// Kendi veritabanı mantığınız burada
console.log(`💾 Sipariş kaydedildi: ${order.id}`);
}
app.listen(PORT, () => {
console.log(`✅ Webhook sunucusu hazır: http://localhost:${PORT}`);
});
Status Update Gönderme¶
const https = require('https');
const POS_API = 'https://stage.pos.muditakurye.com.tr';
const INTERNAL_KEY = process.env.INTERNAL_API_KEY || 'your-internal-key';
async function updateOrderStatus(providerOrderId, platform, action, reason = '') {
const body = JSON.stringify({
providerOrderId,
platform,
action,
reason,
});
const response = await fetch(`${POS_API}/internal/orders/status`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Internal-Api-Key': INTERNAL_KEY,
},
body,
});
const data = await response.json();
console.log(`📤 Status update: ${action} → ${JSON.stringify(data)}`);
return data;
}
// Kullanım örnekleri:
// Sipariş onayla
updateOrderStatus('getir-order-123', 'GETIR', 'VERIFY');
// Hazırlamaya başla
updateOrderStatus('getir-order-123', 'GETIR', 'PREPARE');
// Kuryeye teslim et
updateOrderStatus('getir-order-123', 'GETIR', 'HANDOVER');
// Teslim edildi
updateOrderStatus('getir-order-123', 'GETIR', 'DELIVER');
// İptal
updateOrderStatus('ys-order-456', 'YEMEKSEPETI', 'CANCEL', 'Stok yok');