Ana içeriğe geç

Node.js Örneği

Tam çalışan bir Node.js webhook sunucusu ve status update istemcisi.

Kurulum

mkdir muditapos-client && cd muditapos-client
npm init -y
npm install express crypto

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');

.env

API_SECRET=your-api-secret-from-muditapos
INTERNAL_API_KEY=your-internal-api-key
PORT=3001