Sipariş onayı, şifre sıfırlama kodu, randevu hatırlatması… Bunları panelden tek tek göndermek yerine kendi yazılımınızın otomatik göndermesini istiyorsanız ihtiyacınız olan şey bir SMS API. Bu yazıda Bizim SMS HTTP/XML API'si ile PHP üzerinden SMS gönderme, bakiye sorgulama ve iletim raporu almayı kopyalayıp çalıştırabileceğiniz örneklerle anlatıyoruz.
Yazılımınız, SMS sunucusuna bir HTTP isteği gönderir. İstek içinde kullanıcı adınız, API anahtarınız, başlığınız, numara(lar) ve mesaj metni bulunur. Sunucu isteği kontrol eder, mesajı operatörlere iletir ve size bir dönüş kodu ile gönderim kimliği (dlrId) döner. Bu kimlikle daha sonra mesajın iletilip iletilmediğini sorgularsınız.

test olan sanal hesabı kullanabilirsiniz; bu hesapla gerçek gönderim yapılmaz.Tüm istekler http://sms.bizimsms.mobi:8080 adresine yapılır.
| İşlem | Metot | Adres |
|---|---|---|
| SMS gönder (XML, toplu) | POST | /api/smspost/v1 |
| SMS gönder (tek numara) | GET | /api/smsget/v1 |
| Kredi sorgula | GET | /api/credit/v1 |
| Başlıkları listele | GET | /api/originator/v1 |
| İletim raporu | GET | /api/dlr/v1 |
| Kara listeye ekle | GET | /api/blacklistadd/V1 |
En basit yöntem. Tek numaraya tek mesaj gönderir; mesaj metni URL kodlanmalıdır.
<?php
$params = [
'username' => 'KULLANICI_ADINIZ',
'password' => 'API_SECRET_32_KARAKTER',
'header' => 'BASLIGINIZ',
'gsm' => '905321234567',
'message' => 'Siparişiniz onaylandı. Teşekkür ederiz.',
];
$url = 'http://sms.bizimsms.mobi:8080/api/smsget/v1?' . http_build_query($params);
$yanit = trim(file_get_contents($url));
echo $yanit; // Başarılıysa "00" ve ardından dlrId döner
Aynı mesajı çok sayıda numaraya göndermek, ileri tarihe zamanlamak veya geçerlilik süresi belirlemek için XML POST kullanın. Aşağıdaki fonksiyon doğrudan projenize eklenebilir:
<?php
function bizimSmsGonder(array $numaralar, string $mesaj, ?string $tarih = null): array
{
$kullanici = 'KULLANICI_ADINIZ';
$secret = 'API_SECRET_32_KARAKTER';
$baslik = 'BASLIGINIZ';
$noXml = '';
foreach ($numaralar as $no) {
$no = preg_replace('/\D/', '', $no); // sadece rakam
$noXml .= '<no>' . $no . '</no>';
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>';
$xml .= '<sms>';
$xml .= '<username>' . htmlspecialchars($kullanici) . '</username>';
$xml .= '<password>' . htmlspecialchars($secret) . '</password>';
$xml .= '<header>' . htmlspecialchars($baslik) . '</header>';
$xml .= '<validity>2880</validity>'; // dakika (1-2880)
if ($tarih) {
$xml .= '<sendDateTime>' . $tarih . '</sendDateTime>'; // ör. 2026.11.15.10.30.0
}
$xml .= '<message><gsm>' . $noXml . '</gsm>';
$xml .= '<msg><![CDATA[' . $mesaj . ']]></msg></message>';
$xml .= '</sms>';
$ch = curl_init('http://sms.bizimsms.mobi:8080/api/smspost/v1');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $xml,
CURLOPT_HTTPHEADER => ['Content-Type: text/xml; charset=UTF-8'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$yanit = trim((string) curl_exec($ch));
curl_close($ch);
// Yanıt: "00 <dlrId>" (başarılı) veya hata kodu
$parca = preg_split('/\s+/', $yanit, 2);
return [
'kod' => $parca[0] ?? '',
'dlrId' => ($parca[0] ?? '') === '00' ? ($parca[1] ?? '') : null,
'ham' => $yanit,
];
}
// Kullanım
$sonuc = bizimSmsGonder(['905321234567', '05441234567'], 'Randevunuz yarın 14:00. Değişiklik için 0212 000 00 00');
print_r($sonuc);
Not: Numaralar 10, 11 veya 12 hane olarak gönderilebilir; sistem 12 haneye (90 ile başlayan) tamamlar. Kullanmadığınız opsiyonel etiketleri (ör. sendDateTime) XML'e hiç eklemeyin; boş etiket 89 hatasına yol açar.
Kişiye özel mesajlarda (ör. "Sayın Ahmet Bey, borcunuz 450 TL") message yerine messages bloğu kullanılır; her alıcı için bir mb etiketi içinde no ve msg yer alır.
<?php
$q = http_build_query(['username' => 'KULLANICI_ADINIZ', 'password' => 'API_SECRET_32_KARAKTER']);
echo file_get_contents('http://sms.bizimsms.mobi:8080/api/credit/v1?' . $q);
// "00 12500" => 12.500 kredi
Gönderimden dönen dlrId ile raporu sorgulayın. İlk sorguyu gönderimden 90–180 saniye sonra yapmanız önerilir; kesin sonuçlar genellikle 48 saat içinde tamamlanır.
<?php
$q = http_build_query([
'username' => 'KULLANICI_ADINIZ',
'password' => 'API_SECRET_32_KARAKTER',
'id' => 'DLR_ID',
]);
echo file_get_contents('http://sms.bizimsms.mobi:8080/api/dlr/v1?' . $q);
// Numara bazlı durum: 0 bekliyor, 5 gönderildi, 6 ulaşmadı, 9 iletildi

| Kod | Anlamı | Ne yapmalı? |
|---|---|---|
| 00 | Başarılı | dlrId'yi kaydedin |
| 87 | Kullanıcı adı / şifre hatalı | API SECRET kullandığınızdan emin olun |
| 85 | Başlık bulunamadı / onaysız | Başlığı birebir (büyük-küçük harf) yazın |
| 81 | Yetersiz kredi | Bakiye yükleyin |
| 83 | Geçerli numara veya metin yok | Numara formatını kontrol edin |
| 84 | Gönderim tarihi hatalı | yyyy.m.d.H.m.s formatı, en fazla 1 yıl ileri |
| 89 | XML okunamadı | Boş etiket ve özel karakterleri kontrol edin |
| 77 | Aynı SMS son 2 dakikada gönderildi | Mükerrer istek kontrolü ekleyin |
| 93 / 97 | Eksik parametre / yanlış metot | GET–POST seçimini kontrol edin |
.env veya sunucu ortam değişkeninde tutun. Bu bilgi asla tarayıcıya (JavaScript) gönderilmemeli, istekler her zaman sunucu tarafından yapılmalı.Hayır. HTTP isteği gönderebilen her dil (C#, Python, Node.js, Java) ile kullanılabilir. Mantık aynıdır: aynı adrese aynı parametreleri gönderirsiniz.
Evet. Yukarıdaki fonksiyonu tema veya eklentinizde sipariş durum değişikliği kancasına (woocommerce_order_status_changed) bağlayarak otomatik sipariş SMS'i gönderebilirsiniz.
Dokümanda istek sayısı için bir sınır yoktur; yine de toplu gönderimleri tek XML'de birleştirmek en verimli yöntemdir.
Tam teknik doküman için API sayfamızı ziyaret edin. Entegrasyonda takıldığınız yerde teknik ekibimiz yardımcı olur; ücretsiz üyelik ile API anahtarınızı hemen alın.