gov-pay
Webhook гарын авлага

Webhook

Төлбөрийн мэдэгдэл хүлээн авах

Webhook бүртгэх

POST /api/v1/webhooks
{
  "url": "https://your-app.mn/webhook/govpay",
  "secret": "your-webhook-secret",
  "events": ["payment.submitted", "payment.confirmed"]
}

Бусад үйлдэл: GET /api/v1/webhooks (жагсаах), DELETE /api/v1/webhooks/{id} (идэвхгүй болгох → { "ok": true }).

Мэдэгдлийн бүтэц

GovPay таны url руу POST хийнэ. Event төрөл нь X-GovPay-Event header-т, body нь зөвхөн тухайн event-ийн payload (event/data/timestamp ороохгүй):

HeaderУтга
X-GovPay-Eventpayment.submitted эсвэл payment.confirmed
X-GovPay-SignatureHMAC-SHA256 hex (prefix-гүй)
Content-Typeapplication/json

payment.submitted body:

{
  "id": "9c0e7b21-3f4a-4d5e-8b6c-1a2d3e4f5a6b",
  "invoiceId": "5f8d0a3e-1b2c-4d6e-8a9f-0c1d2e3f4a5b"
}

payment.confirmed body:

{
  "id": "9c0e7b21-3f4a-4d5e-8b6c-1a2d3e4f5a6b",
  "amount": 150000
}

id нь төлбөрийн UUID. Дэлгэрэнгүй (статус, нэхэмжлэлүүд) хэрэгтэй бол GET /api/v1/payments/{id} дуудна.

HMAC гарын үсэг шалгах

Гарын үсэг нь body-гийн raw hex HMAC-SHA256sha256= гэх мэт prefix байхгүй:

const crypto = require('crypto');

function verifyWebhook(rawBody, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  return expected === signature;
}

// Express.js жишээ
app.post('/webhook/govpay', (req, res) => {
  const sig = req.headers['x-govpay-signature'];
  const event = req.headers['x-govpay-event'];
  const body = JSON.stringify(req.body);

  if (!verifyWebhook(body, sig, process.env.WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }

  console.log(`Event: ${event}`, req.body);
  res.status(200).send('OK');
});

Сервер 5 секундийн timeout-той илгээнэ. Хүлээн авагч 2xx буцаах нь зүйтэй.

Events

EventТайлбарPayload
payment.submittedТөлбөр засгийн газарт илгээгдсэн{ id, invoiceId }
payment.confirmedТөлбөр баталгаажсан{ id, amount }