Cara Membuat Sms Gateway Dengan Php

SMS gateway memungkinkan kita bagi mengirim dan menerima SMS lakukan berbagai keperluan plong tuntutan, misal kerjakan reminder, notifikasi, serta konfirmasi.

Detik ini saya menggembangkan sebuah package SMS Gateway buat Laravel. Package ini diharapkan untuk mendukung bineka vendor. Bikin detik ini, hanya mendukung SMSGateway.me dan Zenziva. Selengkapnya bisa dibaca pada tautan di bawah.

SMS gateway

adalah sebuah sistem permintaan yang digunakan cak bagi mengirim juga menerima

SMS
, dan biasanya digunakan lega permintaan bisnis, baik bakal kemustajaban broadcast promosi (Bulk

SMS
), servis informasi terhadap pengguna, penyebaran content dagangan/jasa dan tidak lain.

Umumnya, ada dua cara yang digunakan bakal membangun SMS gateway.

  • Menggunakan perangkat tambahan berupa modem dan aplikasi pendukung seperti Gammu.
  • Memperalat layanan berbayar pihak ketiga seperti Sunan SMS atau Zenziva misalnya.

Masing-masing cara di atas memiliki kesuntukan dan kelebihan.

Seperti perangkat suplemen modem misalnya. Kita harus menancapkan modem tersebut puas sebuah PC ataupun laptop selama 24 jam munjung (atau selama SMS akan digunakan). Ini sebagaimana kita membangun server mini bagi sebuah task istimewa. Kelebihannya, kita bisa mengontrol SMS masuk ataupun keluar sesukanya.

Lain juga dengan layanan menggunakan pihak ketiga. Prinsip ini terbilang mudah digunakan. Kita cukup mengirim SMS secara programatically ke server mereka, sisanya sistem dan perangkat mereka yang akan mengangkut SMS ke penyambut. Kekurangannya, harga per SMS-nya jauh lebih mahal dibandign SMS reguler. Selain itu, untuk paket SMS paling murah, hanya boleh digunakan kerjakan mengirim SMS, tidak boleh menerima SMS. Nomornya pun terbatas dan (kebanyakan) bersifat acak. Bisa sih menggunakan momor premium, namun harganya tentu pula lain murah.

Masa ini, suka-suka alternatif buat membangun SMS gateway dengan mudah dan murah. Ialah menggunakan layanan SMSGateway.me.

Apa Itu SMSGateway.derita?

SMSGateway.berpenyakitan memungkinkan kita lakukan mengirim dan menerima SMS secara programmatically (dari aplikasi) dan menjadikan smartphone Android kita laksana perangkatnya.

Syaratnya tidak ribet, sepan instal permintaan SMSGateway.derita di Android, pastikan renyut untuk mengirim SMS mencukupi, serta smartphone dalam keadaan menyala momen digunakan.

Alur kerja untuk mengirim SMS adalah bagaikan berikut:

  • Permintaan mengirim SMS secara programmatically ke peladen SMSGateway.derita.
  • Data diterima Peladen.
  • Aplikasi menghelat server SMSGateway.berpenyakitan bagi mendapatkan antrian SMS.
  • Jikalau ada antrian, permintaan mengirim SMS serta merta melintasi smartphone.

Hal yang sama pula berlaku bakal alur kerja buat mengakui SMS.

  • Aplikasi mengerjakan permintaaan ke server SMSGateway.derita.
  • Permintaan diteruskan ke tuntutan SMSGateway.me di Android.
  • Sekiranya ada SMS masuk, mengirimkan SMS tersebut ke peladen SMSGateway.me.
  • Server SMSGateway.me mengembalikan balasan substansial data SMS masuk.

Using our free service you can turn your Android phone into a free SMS Gateway. Allowing you to both send and receive SMS messages programmatically using our restful API.

Mempersiapkan SMS Gateway

Daftar terlebih dahulu pada layanan SMSGateway.derita, untuk mendapatkan email (username) dan password. Tenang, layanan ini gratis — setidaknya untuk sampai saat ini — .

Instal petisi SMSGateway.me pada smartphone Android nan mau digunakan bak SMS server. Setelah aplikasi diinstal, login ke aplikasi SMSGateway.me di Android dengan email dan password yang sama bilamana kita mendaftar pada versi web.

Dengan login ke dalam tuntutan Android, kita akan mendaftarkan dan mendapatkan laporan baru berwujud Device ID. Device ID ini nantinya akan gegares digunakan cak bagi autentikasi bersamaan dengan email & password puas saat utus SMS dari aplikasi.

Perumpamaan deklarasi lampiran, device nan didaftarkan dalam layanan bisa kian pecah satu. Hal tersebut bisa dilakukan dengan cara menginstal tuntutan SMSGateway.me kerjakan Android sreg smartphone yang farik.

Mempersiapkan Permohonan Berbasis Laravel

Penjelasan bagi membangun aplikasi sahaja saya tulis secara garis besar. Saya anggap kalian sudah familiar dengan Laravel beserta fitur di dalamnya.

Migrations

Buat sebuah tabel dengan nama
messages
memperalat migrations. Pastikan konfigurasi basisdata telah diatur sebelumnya.

        php artisan make:migration create_messages_table --create=messages
      

Tambahkan beberapa kolom lega tabel
messages.

        /**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');

// contact information
$table->integer('contact_id');
$table->string('contact_number', 30);
$table->string('contact_name', 100);

// message information
$table->string('device_id', 30);
$table->text('message');
$table->enum('type', ['inbox', 'outbox', 'draft'])->default('outbox');
$table->dateTime('expired_at');
$table->timestamps();

$table->index(['contact_name', 'contact_number']);
});
}

Sejatinya, n domestik proses pengiriman SMS, tabel ini tidak harus digunakan. Belaka, tak ada salahnya kita menyimpan pesan keluar sebagi log. Tabel ini nantinya akan sangat berfaedah saat digunakan lakukan menyimpan pesan turut berpunca smartphone.

Eksekusi migrations di atas dengan perintah berikut.

        php artisan migrate
      

Model

Migrations dan grafik
messages
sudah dibuat, selanjutnya ialah membuat teoretis.

        php artisan make:model Message
      

Adapun lokasi taris cermin tersebut ada di
app/Message.php.

Tambahkan ruangan
expired_at
ke dalam magic property
$dates
mudah-mudahan nilai kembaliannya berupa objek Carbon layaknya kolom
created_at
dan
updated_at.

        <?php

namespace App;

use Illuminate\Database\Eloquent\Acuan;

class Message extends Ideal
{
/**
* @var array
*/
protected $dates = ['expired_at'];
}

Config

Lakukan config baru dengan menambahkan taris
smsgateway.php
pada direktori
config. Config ini nanti berisi informasi credential seperti email, password, dan device ID yang akan digunakan plong controller bikin utus dan mengamini SMS melintasi Api.

        <?php

return [
'email' => env('SMS_EMAIL', '[email protected]'), // insert your email here
'password' => env('SMS_PASSWORD', ''), // insert your password here
'device' => env('SMS_DEVICE', ''), // insert your device ID here
];

Pada config di atas, saya menunggangi kepentingan
env()
yang memungkinkan kita menambahkan dan mengatak nilainya berasal gabung
.env.

Validasi dengan Form Request

Seharusnya controller lebih ramping, untuk validasinya kita memperalat form request yang bisa dibuat melampaui
artisan.

        php artisan make:request Message/ValidationRequest
      

Mengenai isi lengkapnya adalah andai berikut.

        <?php

namespace App\Http\Requests\Message;

use Illuminate\Foundation\Http\FormRequest;

class ValidationRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'number' => 'required|max:30',
'name' => 'required|string|max:50',
'message' => 'required',
];
}
}

Controller

Bikin controller mentah dengan nama
MessageController
menggunakan
artisan.

        php artisan make:controller MessageController
        // lakukan mendapatkan layout default berbasis bootstrap
        php artisan make:auth
      

Di kerumahtanggaan controller ini, kita akan menambahkan dua buah method, adalah
form()
dan
send(). Yang mana, method
form()
berfungsi untuk menampilkan perolehan nomor telepon tujuan, segel, serta pesan yang akan dikirim. Padahal method
send()
berfungsi untuk mengirim SMS mengunakan SMSGateway.berpenyakitan.

Berikut isi class
MessageController.

        <?php

namespace App\Http\Controllers;

use App\Http\Requests\Message\ValidationRequest;
use App\Message;

/**
* @author Yugo <[email protected]>
* @copyright Laravel.web.id - 2022
*/
class MessageController extends Controller
{
/**
* Show form for send messae
*/
public function form()
{
return view('contents.messages.form');
}

/**
* @param ValidationRequest $request
*/
public function send(ValidationRequest $request)
{
abort_if(!function_exists('curl_init'), 400, 'CURL is not installed.');

$curl = curl_init('http://smsgateway.berpenyakitan/api/v3/messages/send');

curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, [
'email' => config('smsgateway.email'),
'password' => config('smsgateway.password'),
'device' => config('smsgateway.device'),
'number' => $request->number,
'name' => $request->name,
'message' => $request->message,
]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($curl));

curl_close($curl);

if ($response->success === true) {
if (!empty($response->result->fails)) {
\Log::debug($response->result->fails);
} else {
foreach ($response->result->success as $success) {
$messages[] = [
'type' => 'outbox',
'contact_id' => $success->contact->id,
'contact_name' => $success->contact->name,
'contact_number' => $success->contact->number,
'device_id' => $success->device_id,
'message' => $success->message,
'expired_at' => \Carbon\Carbon::now()->timestamp($success->expires_at),
'created_at' => \Carbon\Carbon::now(),
'updated_at' => \Carbon\Carbon::now(),
];
}

Message::insert($messages);

return redirect()
->route('message.form')
->withSuccess('Message has been sent successfully.');
}
} else {
\Log::debug(json_encode($response->errors));
}

return redirect()
->back()
->withError('Failed to send message.');
}
}

PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and communicate to many different types of servers with many different types of protocols. libcurl currently supports the http, https, ftp, gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with PHP’s ftp extension), HTTP form based upload, proxies, cookies, and user+password authentication.

Adv minim penjelasan. Dalam method
send()
saya menunggangi librari cURL untuk mengirim data ke server SMSGateway.berpenyakitan. Adapun method-nya sendiri berupa POST dengan isi data nomor telepon, jenama, dan wanti-wanti.

Response dari API SMSGateway.me diproses kembali bikin kemudian disimpan ke dalam tabel
messages
menggunakan model yang telah dibuat sebelumnya.

Kamil response data ketika berakibat.

        {
"success": true,
"result": {
"success": [
{
"id": "308",
"device_id": "4",
"message": "hello world!",
"status": "pending",
"send_at": "1414624856",
"queued_at": "0",
"sent_at": "0",
"delivered_at": "0",
"expires_at": "1414634856",
"canceled_at": "0",
"failed_at": "0",
"received_at": "0",
"error": "None",
"created_at": "1414624856",
"contact": {
"id": "14",
"name": "Phyllis Turner",
"number": "+447791064713"
}
}
],
"fails": [
]
}
}

SMSgateway.derita juga menyisihkan librari PHP siap pakai untuk melampiaskan n domestik mengirim dan mengambil data dari server mereka. Librarinya seorang boleh diunduh lega tautan berikut smsgateway.berpenyakitan/sms-api-libraries/sms-gateway-me-php.zip.

Form

Untuk berkas hijau dengan segel
form.blade.php
pada direktori
resources/views/contents/messages. Salin template di bawah kerjakan membuat form bingkis SMS. Kalau terbiasa, dimodifikasi sedemkian rupa agar lebih nyaman internal pemanfaatan.

        @extends('layouts.app')

@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">{{ $title or 'Send Message' }}</div>
<div class="panel-body">

@if (session()->has('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif

@if (session()->has('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif

<form class="form-horizontal" role="form" method="POST" action="{{ route('message.send') }}">
{{ csrf_field() }}
{{ method_field('post') }}

<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">Recipient Number</label>

<div class="col-md-6">
<input id="number" type="text" class="form-control" name="number" value="{{ old('email') }}" autofocus>

@if ($errors->has('number'))
<span class="help-block">
<strong>{{ $errors->first('number') }}</strong>
</span>
@endif
</div>
</div>

<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
<label for="name" class="col-md-4 control-nama">Name</label>

<div class="col-md-6">
<input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}">

@if ($errors->has('name'))
<span class="help-block">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
</div>

<div class="form-group{{ $errors->has('message') ? ' has-error' : '' }}">
<label for="message" class="col-md-4 control-label">Message</merek>

<div class="col-md-6">
<textarea class="form-control" name="message">{{ old('message') }}</textarea>

@if ($errors->has('message'))
<span class="help-block">
<strong>{{ $errors->first('message') }}</strong>
</span>
@endif
</div>
</div>

<div class="form-group">
<div class="col-md-8 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Send Message
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

Hasil akhir form di atas bisa dilihat plong rencana di bawah.

Route

MVC sudah siap, anju terakhir adalah mendefinisikan URI baru plong jaras
routes/web.php.

        Route::get('message/send', '[email protected]')->name('sms.form');
Route::post('message/send', '[email protected]')->name('sms.send');

Cak semau dua definisi URI nan sama , yaitu
message/send. Lamun begitu, keduanya memiliki HTTP Verb yang berbeda, di mana baris pertama menggunakan GET, sedangkan baris berikutnya menggunakan POST.

        php artisan route:list
      

Uji Coba

Jalankan built-in server dengan perintah
php artisan serve
dan akses aplikasi melalui peramban dengan URL
http://localhost/message/send.

Isikan data nomor telepon, nama, dan pesan, kemudian klik tombol Send. Apakah SMS terkirim dan diterima dengan ter-hormat?

Jika iya, Selamat! Kalian telah berhasil takhlik aplikasi tercecer menggunakan SMS gateway.

Fitur

Daftar fitur yang ada waktu ini dan yang akan dikembangkan.

Saat ini:

  • Kirim SMS
  • Pengelolaan pesan timbrung dan pesan keluar

Internal pengembangan:

  • Manajemen pergaulan
  • Kirim pesan menggunakan antrian (queue) Laravel
  • Tambahkan sebagi channel notifikasi

Konklusi

Petisi di atas masih terbatas hanya faktual mengirim SMS. Sementara itu, dalam dokumentasi Jago merah SMSGateway.me ada banyak data yang bisa dikelola. Tiba dari autentikasi, device, pesan masuk/keluar, sampai dengan daftar kontak. Pengarsipan lengkapnya seorang dapat dilihat lega halaman ini.

Eksemplar konseptual aplikasi di atas bisa dilihat pada repositori Github Laravel.web.id. Jika plong tulisan ini doang dicontohkan kerjakan mengirim SMS saja, di repositori akan selalu saya perbarui mengikuti fitur yang disediakan oleh SMSGateway.me.

Kalian juga dapat berkontribusi sreg repositori tersebut dengan membuat Pull Request atau melaporkan bug melintasi jerambah Issues. 😉

Source: https://medium.com/laravel-web-id/membangun-sms-gateway-dengan-android-smsgateway-me-dan-laravel-cd4bdaf5d2c4