ARIS Docs/API/Webhooks · HMAC

Webhooks · HMAC

ARIS уведомляет маркетплейс о каждом изменении статуса сделки. Каждый запрос подписан HMAC-SHA256 — обязательно проверяйте подпись.

Установить webhook URL

curl -X POST https://arisdoc.cloud/api/mkt/webhook \
  -H "X-Aris-Key: mk_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://your-marketplace.com/aris/webhook"}'

В ответ — секрет для HMAC-подписи:

{ "ok": true, "url": "https://your-marketplace.com/aris/webhook", "secret": "whsec_…" }

Получаемые события

| Событие | Когда | |---------------------|---------------------------------------------------| | deal.approved | Покупатель согласовал условия | | deal.rejected | Покупатель отклонил | | deal.escrow_hold | Деньги захолдированы | | deal.paid | Сделка раскрыта (released) | | deal.refunded | Возврат покупателю | | deal.disputed | Открыт спор |

Формат тела

{
  "event": "deal.approved",
  "id": "f51c…",
  "external_id": "order-100245",
  "title": "Арматура А500С 12мм, 20т",
  "amount": 1480000,
  "currency": "RUB",
  "status": "approved",
  "buyer_email": "buyer@example.com",
  "seller_email": "supplier@zavod.ru"
}

Проверка подписи

import crypto from "node:crypto";

function verify(body, signature, secret) {
  const expected = crypto.createHmac("sha256", secret).update(body).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}

app.post("/aris/webhook", express.raw({ type: "application/json" }), (req, res) => {
  if (!verify(req.body, req.headers["x-aris-signature"], process.env.ARIS_WEBHOOK_SECRET)) {
    return res.status(401).end();
  }
  const event = JSON.parse(req.body);
  // ... handle event
  res.status(200).end();
});
Тело должно быть сырым (raw) на момент подсчёта подписи. После JSON.parse → JSON.stringify подпись не сойдётся из-за нормализации пробелов.

Доставка и ретраи

Все доставки видны в админ-карточке маркетплейса в блоке «Webhook-лог»: время, событие, ID сделки, статус доставки и причина ошибки.