Loyetta

SMS Gönderimi

SMS gönderimi uç noktanıza yönlendirildiğinde, bir veya daha fazla kullanıcıya mesaj iletilmesi gerektiğinde Loyetta bir sms.send webhook'u gönderir. Loyetta telefon numaralarını göndermez — user_ids içindeki her user_id'yi kendi tarafınızda bir telefon numarasına eşler ve SMS'i kendi sağlayıcınız üzerinden iletirsiniz.

Herhangi bir sms.send isteğine göre işlem yapmadan önce imzasını doğrulayın. Doğrulama akışı, başlıklar, yeniden denemeler ve idempotency kuralları tüm kanallarda ortaktır — bkz. Webhook'lar: Genel Bakış → Doğrulama.


Olay

X-Loyetta-Eventsms.send
MetotPOST
İçerik türüapplication/json

Yük

json
{
  "user_ids": ["01JRXYZ1234ABCDEF56789GH"],
  "message": "Doğrulama kodunuz 482910."
}
AlanTürAçıklama
user_idsstring[]Mesajın ait olduğu Loyetta kullanıcı kimlikleri (ULID). Her birini kendi tarafınızda bir telefon numarasına eşleyin.
messagestringGönderilecek mesaj metni.

Loyetta user_ids'inin telefon numaralarına eşlenmesi sizin sorumluluğunuzdadır — Loyetta telefon numaralarını yükte göndermez. Bunları kendi kayıtlarınızdan (veya kimlik doğrulama sırasında sağladığınız phone değerinden) çözümleyin.


Webhook'u işleme

  1. İmzayı doğrulayın (bkz. Genel Bakış). Başarısız olursa 401 ile reddedin.
  2. Hızlı onaylayın — hemen bir 2xx döndürün, ardından SMS'i asenkron olarak (kuyruk/worker) iletin. İstek 15 saniye sonra zaman aşımına uğrar.
  3. Yeniden denenen bir gönderimin iki kez gönderilmemesi için X-Loyetta-Delivery başlığını kullanarak tekilleştirin. Bkz. Idempotency.
  4. user_ids içindeki her user_id için telefon numaralarını çözümleyin ve SMS sağlayıcınız üzerinden gönderin.

Örnek

js
// Doğrulanmış webhook işleyicinizin içinde (verify() için bkz. Genel Bakış):
app.post('/webhooks/loyetta', express.raw({ type: 'application/json' }), async (req, res) => {
  const rawBody = req.body.toString('utf8');
  if (!verify(rawBody, req.get('X-Loyetta-Signature') || '', SECRET)) {
    return res.status(401).send('Invalid signature');
  }

  if (req.get('X-Loyetta-Event') !== 'sms.send') {
    return res.status(200).send('ignored');
  }

  // Önce onaylayın, ardından asenkron işleyin.
  res.status(200).send('ok');

  const deliveryId = req.get('X-Loyetta-Delivery');
  if (await alreadyProcessed(deliveryId)) return; // idempotency

  const { user_ids, message } = JSON.parse(rawBody);
  const phones = await resolvePhoneNumbers(user_ids); // kendi eşlemeniz
  for (const phone of phones) {
    await sendSmsViaYourProvider(phone, message);
  }
  await markProcessed(deliveryId);
});

user_ids bir veya daha fazla alıcı içerebilir — listenin tamamı üzerinde döngü kurun. Aynı message, dizideki her kullanıcıya gönderilir.