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-Event | sms.send |
| Metot | POST |
| İçerik türü | application/json |
Yük
{
"user_ids": ["01JRXYZ1234ABCDEF56789GH"],
"message": "Doğrulama kodunuz 482910."
}| Alan | Tür | Açıklama |
|---|---|---|
user_ids | string[] | Mesajın ait olduğu Loyetta kullanıcı kimlikleri (ULID). Her birini kendi tarafınızda bir telefon numarasına eşleyin. |
message | string | Gö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
- İmzayı doğrulayın (bkz. Genel Bakış). Başarısız olursa
401ile reddedin. - Hızlı onaylayın — hemen bir
2xxdöndürün, ardından SMS'i asenkron olarak (kuyruk/worker) iletin. İstek 15 saniye sonra zaman aşımına uğrar. - Yeniden denenen bir gönderimin iki kez gönderilmemesi için
X-Loyetta-Deliverybaşlığını kullanarak tekilleştirin. Bkz. Idempotency. user_idsiçindeki heruser_idiçin telefon numaralarını çözümleyin ve SMS sağlayıcınız üzerinden gönderin.
Örnek
// 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.