programmer1453 Türkiye için ise Netgsm kullanabilirsiniz. Bunun için Laravel'in notification özelliğini kullanıyoruz. https://laravel.com/docs/8.x/notifications
Netgsm için bir notification channel oluşturacaksınız. Diğer SMS, Mail, Push vs sağlayıcıları vs içinde aynı örnekten yola çıkabilirsiniz. Basit bir örnek olarak:
app/NotificationChannels/Netgsm/Netgsm.php
class Netgsm
{
public function send($notifiable, Notification $notification)
{
/** @var \App\NotificationChannels\Netgsm\NetgsmSmsMessage $message */
$message = $notification->toSms($notifiable);
$response = Http::withHeaders([
'Content-type' => 'text/xml'
])
->withBody($message->toXML($notifiable), 'text/xml')
->post('https://api.netgsm.com.tr/sms/send/xml')
->throw();
}
}
app/NotificationChannels/Netgsm/NetgsmSmsMessage.php
class NetgsmSmsMessage
{
public function __construct(
public string $message,
)
{
//
}
public function toXML($notifiable): bool|string
{
$to = $notifiable->routeNotificationFor('sms');
if (is_string($to)) {
$to = [$to];
}
$dom = new DOMDocument('1.0', 'utf-8');
$langAttribute = $dom->createAttribute('dil');
$company = $dom->createElement('company', 'firma adı buraya');
$langAttribute->value = 'TR';
$company->appendChild($langAttribute);
$root = $dom->appendChild($dom->createElement('mainbody'));
$header = $root->appendChild($dom->createElement('header'));
$header->appendChild($company);
$header->appendChild($dom->createElement('usercode', 'netgsm usercode buraya'));
$header->appendChild($dom->createElement('password', 'netgsm password buraya'));
$header->appendChild($dom->createElement('type', '1:n'));
$header->appendChild($dom->createElement('msgheader', 'netgsm header buraya'));
$body = $root->appendChild($dom->createElement('body'));
$msg = $body->appendChild($dom->createElement('msg'));
$msg->appendChild($dom->createCDATASection($this->message));
foreach ($this->to as $to) {
$body->appendChild($dom->createElement('no', $to));
}
return $dom->saveXML();
}
}
Ben burada Netgsm'in XML servisini kullandığım için mesajı XML istiyor, ben de XML'e çeviren bu sınıfı yazdım. Bunun verdiği çıktı:
<?xml version="1.0" encoding="UTF-8"?>
<mainbody>
<header>
<company dil="TR">firma adı buraya</company>
<usercode>netgsm usercode buraya</usercode>
<password>netgsm password buraya</password>
<type>1:n</type>
<msgheader>netgsm header buraya</msgheader>
</header>
<body>
<msg>
<![CDATA[Mesaj metni]]>
</msg>
<no>051212312312</no>
<no>051212312312</no>
</body>
</mainbody>
Notification için hangi alan SMS telefonu olarak kullanılacak onu belirlemek için ise User modelini routeNotificationFor yöntemi ekliyorsunuz. Burada yöntem adı hangi tipte mesaj gönderecekseniz onunla bitecek. SMS ise routeNotificationForSms; mail ise routeNotificationForMail gibi.
app/Models/User.php
public function routeNotificationForSms(): string
{
return $this->phone;
}
Şimdi bir tane notification oluşturalım:
php artisan make:notification UserRegistered
app/Notifications/UserRegistered.php
namespace App\Notifications;
class UserRegistered extends Notification
{
use Queueable;
public function via($notifiable)
{
return [
Netgsm::class
];
}
public function toSms(User $notifiable): NetgsmSmsMessage
{
return new NetgsmSmsMessage('Kayıt işleminiz tamamlanmıştır. Giriş yapabilirsiniz.');
}
}
Artık bir kullanıcıya SMS göndermek için şu yeterli:
$user = User::find(1);
$user->notify(new UserRegistered);