Bir SMPP iletim makbuzunun yapısı
registered_delivery değeri 1 olarak bir SMS gönderdiğinizde SMSC, daha sonra alıcı veya alıcı-verici bağlantısı üzerinden bir deliver_sm PDU gönderir. esm_class içindeki 0x04 biti bunu gelen mesaj değil iletim makbuzu olarak işaretler; short_message alanı metin biçimli bir makbuz taşır. SMPP v3.4 spesifikasyonunun B Ekinde bu biçim örnek olarak verilir ve neredeyse tüm SMSC'ler onu izler: id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E text:….
B Eki katı bir kural değil örnek olduğundan gerçek makbuzlar değişir: küçük harfli anahtarlar, fazladan boşluklar, alt çizgili submit_date, saniyeli 12 haneli tarihler veya eksik text. Bu çözücü hepsini kabul eder ve hangi alanların eksik olduğunu söyler.
- id: SMSC'nin submit_sm_resp içinde döndürdüğü mesaj kimliği. Makbuzu mesajınızla eşleştirmek için kullanın. Spesifikasyon örneği 10 karakter gösterir, ancak birçok SMSC daha uzun, bazen onaltılık kimlikler kullanır.
- sub ve dlvrd: başlangıçta gönderilen ve iletilen mesaj sayısı, 3 haneli. Esas olarak dağıtım listeleri için önemlidir; tek SMS'te genellikle 001 ve 001 (veya 000) olur.
- submit date ve done date: mesajın gönderildiği ve nihai duruma ulaştığı zaman, SMSC'nin saatine göre.
- stat: nihai veya ara durum, DELIVRD gibi 7 harfli bir kod.
- err: 3 karakterli hata kodu, ağa veya SMSC'ye özgü; 000 hata yok demektir.
- text: özgün mesajın ilk 20 karakteri, çoğu zaman kısaltılmış veya boş.
- İsteğe bağlı TLV'ler bu veriyi daha temiz biçimde tekrarlayabilir: receipted_message_id (0x001E), message_state (0x0427) ve network_error_code (0x0423).
DLR stat kodları ve anlamları
SMPP v3.4 sekiz mesaj durumu tanımlar. ENROUTE ve ACCEPTD ara durumlardır; diğerleri nihaidir. API'miz her kanalı altı webhook durumuna normalleştirir (SUBMITTED, SENT, DELIVERED, READ, FAILED, REJECTED) ve çözücü her stat değeri için en yakın eşleşmeyi gösterir. Bu eşlemeyi gösterge olarak değerlendirin: hesabınız için kesin kural devreye alma sırasında netleştirilir.
- DELIVRD (message_state 2): cihaza iletildi. En yakın webhook durumu: DELIVERED.
- ACCEPTD (6): resmî tanımı 'müşteri hizmetleri tarafından abone adına elle okundu'dur, ancak çoğu SMSC bunu ara 'ağ tarafından kabul edildi' makbuzu olarak gönderir. En yakın: SENT.
- ENROUTE (1): hâlâ yolda, örneğin yeniden deneme için kuyrukta. En yakın: SENT.
- UNDELIV (5): iletilemez, örneğin geçersiz veya etkin olmayan numara. En yakın: FAILED.
- EXPIRED (3): cihaza ulaşılamadan geçerlilik süresi doldu, çoğunlukla cihaz kapalı veya kapsama dışı olduğu için. En yakın: FAILED.
- DELETED (4): iletimden önce silindi, örneğin cancel_sm ile. En yakın: FAILED.
- REJECTD (8): ağ veya bir güvenlik duvarı tarafından reddedildi, örneğin kayıtsız bir SMS başlığı (Sender ID) ya da engellenen içerik. En yakın: REJECTED.
- UNKNOWN (7): SMSC'de nihai durum yok. Kanıtlanmış bir hata değil, doğrulanmamış olarak değerlendirin.
err kodları: neden evrensel bir liste yok
err alanı üç karakter genişliğindedir ve SMPP spesifikasyonu değerlerini tanımlamaz. 000 her zaman hata yok demektir, ancak sıfır olmayan değerler SMSC üreticisinden, operatörden veya aradaki bir toplayıcıdan gelir. Bazı SMSC'ler GSM MAP hata nedenlerini aktarır (örneğin MAP hatası 1 bilinmeyen abone, 27 ulaşılamayan abonedir), diğerleri her şeyi kendi tablosuna eşler.
Makbuz network_error_code TLV'sini (0x0423) taşıyorsa daha güvenilirdir: ilk oktet ağ türünü (3 GSM demektir), sonraki ikisi hata kodunu verir. Sıfır olmayan err içeren bir DELIVRD makbuzu tutarsızdır ve sağlayıcınızla görüşmeye değer; çözücü bunu işaretler.
command_status hataları ile iletim makbuzları
SMPP sorunları iki anda bildirir. submit_sm_resp içindeki command_status milisaniyeler içinde gelir ve SMSC'nin isteğinizi kabul edip etmediğini söyler; 0x00000000 (ESME_ROK) kabul edildi demektir, iletildi demek değildir. İletim makbuzu saniyeler ile günler sonra gelir ve nihai sonucu taşır.
command_status değerleri SMPP v3.4'ün 5.1.3 bölümünde tanımlıdır. Üretimde en yaygın olanlar 0x00000058 ESME_RTHROTTLED (anlaşılan saniye başına mesaj sayısını aştınız: yavaşlayın ve üstel geri çekilmeyle yeniden deneyin), 0x00000014 ESME_RMSGQFUL (kuyruk dolu: geri çekilin), 0x0000000A ve 0x0000000B (geçersiz kaynak veya hedef adres) ile 0x0000000D veya 0x0000000E'dir (bağlantı başarısız ya da yanlış parola). 0x00000400 ile 0x000004FF arasındaki değerler SMSC üreticisine özgü hatalara ayrılmıştır; bunları sağlayıcınıza sorun.
Tarihler, saat dilimleri ve iletim gecikmesi
Makbuz tarihleri YYMMDDhhmm biçimindedir ve birçok SMSC saniye ekler (YYMMDDhhmmss). Makbuz saat dilimi taşımaz: zaman, SMSC saatinin kullandığı zamandır, genellikle UTC. Çözücü tarihleri yazıldığı gibi gösterir ve gecikmeyi done date eksi submit date olarak hesaplar; ikisi de aynı saatten geldiği sürece saat diliminden etkilenmez.
Gecikme yararlı bir kalite göstergesidir. Ulaşılabilir bir cihaza giden sağlıklı OTP trafiği genellikle saniyeler içinde tamamlanır. Uzun gecikmeler ardından EXPIRED geliyorsa cihazların kapalı veya dolaşımda olduğuna işaret eder; submit tarihinden önce bir done tarihi ise iki saatin uyuşmadığı anlamına gelir. Dakika düzeyindeki tarihler saniyenin altındaki gecikmeyi ölçemez; bu yüzden saniye gönderen SMSC'leri tercih edin.
Makbuzları üretimde güvenilir biçimde işleme
İşleminiz başarısız olsa bile her deliver_sm'ye deliver_sm_resp ile yanıt verin; aksi hâlde SMSC onu yeniden gönderir ve bağlantıyı kısıtlayabilir. Ham makbuzu saklayın, ardından mesaj kimliğine göre eşzamansız ve tekrarlanabilir biçimde işleyin; çünkü makbuzlar iki kez veya sırasız gelebilir: geç gelen bir ENROUTE asla DELIVRD'nin üzerine yazmamalıdır.
Makbuzları hiç ayrıştırmak istemiyorsanız REST SMS API'miz aynı bilgiyi normalleştirilmiş webhook durumları olarak iletir ve kaçırılan makbuzlar POST /sms/resendDlr ile yeniden gönderilebilir. TLS üzerinden SMPP bağlantıları yüksek hacimli göndericiler ve bayiler için mevcuttur.
