Php-Curl kullanılarak Bulutfon ile SMS gönderme uygulaması

Bu yazımızda PHP ile SMS göndermeyi anlatacağız. Bu yazı Bulutfon APIv2’ye göre güncellenmiş ve örnekler APIv2’ye göre verilmiştir.

Değişkenlerin tanımlanması

İlk önce satır satır kodumuzu paylaşalım. Sonra tek tek her bir değişkenin ne olduğunu açıklayalım.

// Değişkenler 
# Bulutfon panelinden alcağınız master token
$token = "APIv2 için alınan token ...";

# Bulutfon üzerinden onaylattığınız sms başlığı
$title = "SMS BASLIGINIZ";

# SMS gönderilecek telefon listesi
$receivers = array('90543XXXXXXX', '90542XXXXXXX');

# SMS içeriği
$message = "Mesaj içeriği"; 

# Ret linki
$reject_link = TRUE;

# Başarılı HTTP kodları 200, 201
# API'den 200 veya 201 dönüyorsa istek başarılırdır.
$success_http_status_code = array(200, 201);

# Başarısız HTTP kodları 400, 401, 422
$error_http_status_code = array(400, 401, 422);

# Data
$data = array(
    'title' => $title,
    'content' => $message,
    'receivers' => $receivers,
    'reject_link' => $reject_link
);
$data_string = json_encode($data);

Öncelikle verilecek değişkenlere göz gezdirelim.

Bulutfon panelinizden API kullanıcıları bölümünden API erişimi olan bir kullanıcı oluşturarak APIKEY almalısınız. Bu değeri $token değişkenine vererek işleme başlıyoruz. Bulutfon üzerinden onaylı SMS başlığınızı $title değişkenine, SMS göndereceğiniz numaraları, başında 9 olacak şekilde, 12 karakter olarak $receivers değişkenine, SMS içeriğini message değişkenine tanımlıyoruz. Gönderdiğimiz SMS’te SMS almak istemeyenler için $rejeck_link değişkenine TRUE vermemiz gerekiyor.

Gönderdiğimiz SMS’in ulaşıp ulaşmadığı bilgisini bize bildiren 200 ve 400 kodlarını da değişkenlere tanımlıyoruz. 200 ve 201 kodları gönderdiğimiz SMS’in gönderilen kişiye ulaştığı bilgisini verirken, 400, 401 ve 422 kodları gönderilen kişiye ulaşmadığı bilgisini bize verir.

SMS başlığını, SMS içeriğini, SMS gönderileceklerin listesini ve SMS ret linkini verdiğimiz değişkenleri bir dizi içerisine yazarak bir değişkene (data) tanımlıyoruz. Daha sonra bu veriyi json_encode() metodu ile json formatına dönüştürerek bir değişkene (data_string) tanımlıyoruz.

cURL ile SMS Gönderme İşlemleri

Değişkenlerimizi tanımladığımıza göre PHP ile cURL ayarlarını yapıp SMS gönderimini yapabiliriz.

// Curl ile SMS Gönder

# Curl oturumunu başlattık
$ch = curl_init(); 

// cURL Ayarları
# SMS gönderimi için kullanacağımız API adresi
curl_setopt($ch, CURLOPT_URL, 'http://api.bulutfon.com/v2/sms/messages?apikey=' . $token); 

# Burada curl post kullanacağımızı belirttik 1 yerine true da denebilir
curl_setopt($ch, CURLOPT_POST, 1); 

# Sonuçları true false yerine veri olarak döndür
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

# SSL'i pasif et sadece geliştirme ortamında yap.
# Productionda aşağıdaki iki satırın yapılması önerilmez.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

# cURL'da post tipinin JSON oldugunu söylüyor.
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array(
        'Content-Type:application/json',
        'Accept: application/json',
        'Content-Length: ' . strlen($data_string)
    )
);

#  Burada ise göndereceğimiz parametreleri belirtiyoruz.
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 

# Çalıştır ve verileri $response_data değişkenine yaz
$response_json = curl_exec($ch);

# Statü kodunu al
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

# Curl oturumunu kapat
curl_close($ch);

cURL oturumunu curl_init() metodunu bir değişkene atayarak başlattık. PHP’de veri tipi olarak json veri tipi yoktur. Bu nedenle veriyi string olarak tutuyor. Veri tipi string ama formatı json.

cURL ayarlarını curl_setopt() metodu ile yapıyoruz. Bu metot 3 parametre alıyor. Bunlardan ilki açtığımız cURL oturumu (curl init() metotunu verdiğimiz değişken), ikincisi değiştireceğimiz ayar ve üçüncüsü bu ayara verdiğimiz değerdir.

İsteğin tipini Post olarak ve verilen cevabı json alabilmek için, CURLOPT_RETURNTRANSFER’i 1 olarak belirliyoruz. Aksi halde cevabı boolean yani sadece true ya da false olarak alırız.

Ayarları tamamladıktan sonra curl_exec() metotu ile veri gönderimini sağlıyoruz. Bu metot başarı durumunda True, başarısızlık durumunda False döner. Ancak CURLOPT_RETURNTRANSFER seçeneği atanmışsa, başarı durumunda sonucu yoksa False döndürür.Mesaj iletim verilerini alabilmek için değişkene curl_getinfo() metotu ile cevabın alabilmeyi sağlıyoruz ve sonrasında curl_close() metotu ile işlemi sonlandırıyoruz.

Gönderim durumunu algılama

# $response_data'yı PHP array'e çevir.
$response_array = json_decode($response_json, true);

# SMS gitti mi?
if (in_array($http_status, $success_http_status_code)) {
    log_mes("SMS gitti.");
    log_mes("SMS ID: " . $response_array['id']);
    log_mes("SMS Icerik: " . $response_array['content']);
    log_mes("SMS Gelecek tarihli mi?: " . $response_array['is_future_sms']);
    log_mes("SMS Tarih: " . $response_array['send_date']);
    log_mes(var_dump($response_array));
} elseif (in_array($http_status, $error_http_status_code)) {
    log_mes("SMS gitmedi.");
    log_mes("Hata kodu: " . $response_array['error']['code']);
    log_mes("Hata basligi: " . $response_array['error']['title']);
    log_mes("Hata mesaji: " . $response_array['error']['message']);
} else {
    log_mes("Genel bir hata var. Belki 500 hatası olabilir.");
}

Bize cevap olarak gelen json veri tipini PHP dizinine dönüştürmek için json_decode() metotunu kullanmalıyız.

Son olarak if yapısında yazdığımız kod SMS gönderimi sonucunda gelen cevaba göre, başlangıçta tanımladığımız değişkenlere göre, 200 veya 201 kodunu vermesi durumunda “SMS gitti”, 400,401 veya 422 kodunu vermesi durumunda “SMS gitmedi” ya da bunların dışında bir kod gelirse “Genel bir hata var. Belki 500 hatası olabilir.” bilgisini bize verir. 500 Sunucu Hatasıdır.

Tüm kodu tek seferde gösterelim

Aşağıda ise bütün kodu tek bir parçada gösteriyoruz. Umarım makalemiz işinize yaramıştır. Her türlü sorunuzu yorum olarak bizlere sorabilirsiniz.

<?php

// Terminal için basit bir komut, web arayüzleri için gerekli değil.
function log_mes($message) {
    $message = date("H:i:s") . " - $message - " . PHP_EOL;
    print($message);
    flush();
    ob_flush();
}

// Değişkenler 
# Bulutfon panelinden alcağınız master token
$token = "APIv2 için alınan token ...";

# Bulutfon üzerinden onaylattığınız sms başlığı
$title = "SMS BASLIGINIZ";

# Formdan gelen alıcı listesi
$receivers = array('90543XXXXXXX', '90542XXXXXXX');

# Formdan gelen mesaj alanı
$message = "Mesaj icerigi"; 

# Red linki
$reject_link = TRUE;

# Success http status codes
# API'den 200 veya 201 dönüyorsa istek başarılırdır.
$success_http_status_code = array(200, 201);

# API'den 400, 401, 422 dönerse
$error_http_status_code = array(400, 401, 422);

// Curl ile SMS Gönder

# Data
$data = array(
    'title' => $title,
    'content' => $message,
    'receivers' => $receivers,
    'reject_link' => $reject_link
);
$data_string = json_encode($data);


# Curl oturumunu başlattık
$ch = curl_init(); 

// cURL Ayarları

# SMS gönderimi için kullanacağımız API adresi
curl_setopt($ch, CURLOPT_URL, 'http://api.bulutfon.com/v2/sms/messages?apikey=' . $token); 

# Burada curl post kullanacagımızı belirttik 1 yerine true de denebilir
curl_setopt($ch, CURLOPT_POST, 1); 

# Sonuçları true false yerine veri olarak dondur
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

# SSL'i aktif et
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

# Curlda post tipinin JSON oldugunu soyluyor.
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array(
        'Content-Type:application/json',
        'Accept: application/json',
        'Content-Length: ' . strlen($data_string)
    )
);

#  Burada ise göndereceğimiz parametreleri belirtiyoruz.
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 

# Çalıştır ve verileri $response_data değişkenine yaz
$response_json = curl_exec($ch);

# Statü kodunu al
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

# Curl oturumunu kapat
curl_close($ch);

# $response_data'yı PHP array'e çevir.
$response_array = json_decode($response_json, true);

# SMS gitti mi?
if (in_array($http_status, $success_http_status_code)) {
    log_mes("SMS gitti.");
    log_mes("SMS ID: " . $response_array['id']);
    log_mes("SMS Icerik: " . $response_array['content']);
    log_mes("SMS Gelecek tarihli mi?: " . $response_array['is_future_sms']);
    log_mes("SMS Tarih: " . $response_array['send_date']);
    log_mes(var_dump($response_array));
} elseif (in_array($http_status, $error_http_status_code)) {
    log_mes("SMS gitmedi.");
    log_mes("Hata kodu: " . $response_array['error']['code']);
    log_mes("Hata basligi: " . $response_array['error']['title']);
    log_mes("Hata mesaji: " . $response_array['error']['message']);
} else {
    log_mes("Genel bir hata var. Belki 500 hatası olabilir.");
}

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top