ارسال و دریافت sms توسط لاراول و nexmo
ارسال و دریافت SMS توسط laravel و Nexmo، در این مقاله به مبحث ارسال و دریافت SMS از برنامه لاراولی میپردازیم. برای این کار از Nexmo استفاده می کنیم
برای انجم این کار، ابتدا باید یک اکانت Nexmo بسازید، Nexmo CLI رو نصب کنید و پیکربندی اولیه لاراول رو انجام بدید. همچنین شما به یک تونل محلی نیاز دارید تا Nexmo بتونه HTTP request ارسال کنه. ما ngrok رو پیشنهاد می کنیم. همچنین اگر آموزش لاراول را مشاهده کرده باشید این امر برایتان راحت تر است.
شروع کار
برای شروع یک پروژه لاراولی می سازیم
composer create-project --prefer-dist laravel/laravel laravel-sms cd laravel-sms
و بعد Nexmo رو به پروژه اضافه می کنیم, کد زیر رو به composer.json اضافه کنید :
"require": { ..., "nexmo/laravel": "dev-master as 1.0", "nexmo/client": "dev-master as 1.0" },
پیکربندی Service Provider رو هم بصورت زیر در فایل config/app.php انجام بدید :
'providers' => [ ..., Nexmo\Laravel\NexmoServiceProvider::class ]
و alias رو بصورت زیر وارد کنید :
'Nexmo' => \Nexmo\Laravel\Facade\Nexmo::class
با دستورات زیر پکیج ها نصب شده و فایل پیکربندی Nexmo اضافه میشه :
composer update php artisan vendor:publish
حالا API KEY و API SECRET رو که از داشبورد Nexmo دریافت کردید رو در فایل config/nexmo.php بصورت زیر وارد کنید :
'api_key' => 'API_KEY', 'api_secret' => 'API_SECRET',
ارسال یک SMS
نکته : برای سادگی و سرعت بخشیدن به کار ما کدها رو داخل route.php وارد میکنیم :
این مسیر رو به فایل route.php اضافه کنید :
Route::get('/sms/send/{to}', function(\Nexmo\Client $nexmo, $to){ $message = $nexmo->message()->send([ 'to' => $to, 'from' => '@leggetter', 'text' => 'Sending SMS from Laravel. Woohoo!' ]); Log::info('sent message: ' . $message['message-id']); });
اینجا مقدار @leggetter برای فرستنده قرار داده شده که بسته به پیش شماره کشورها میتونه متفاوت باشه.
کار با شماره تلفنها
در بخش اول گفتیم باید Nexmo CLI رو نصب کنید, دلیلش استفاده از امکانات مختلفش از جمله کار با شماره تلفن هاست. نحوه نصب اون بصورت زیر هست و پیکربندی های لازم هم باید انجام بدید :
npm install -g nexmo-cli nexmo setup API_KEY API_SECRET
حالا میتونیم شماره هایی که اجاره کردیم رو لیست کنیم یا برای شماره ها جستجو کنیم و مورد مناسب رو اجاره کنیم. برای لیست کردن :
› nexmo number:list 14155550123
برای جستجو شماره های موبایل آمریکا :
› nexmo number:search US 14155550111 14155550222 14155550333
برای خرید :
› nexmo number:buy 14155550111 --confirm Number purchased: 14155550111
دوره آموزش لاراول 8
حالا میتونید مقدار from رو شماره ای که دارید قرار بدید یا اینکه بصورت غیرمستقیم از فایل env. استفاده کنید :
Route::get('/sms/send/{to}', function(\Nexmo\Client $nexmo, $to){ $message = $nexmo->message()->send([ 'to' => $to, 'from' => env('NEXMO_NUMBER'), 'text' => 'Sending SMS from Laravel. Woohoo!' ]); Log::info('sent message: ' . $message['message-id']); });
حالا سرور رو راه اندازی کنید :
php artisan serve Laravel development server started on http://localhost:8000/
حالا برای ارسال پیام به مسیر http://localhost:8000/sms/send/YOUR_NUMBER بروید و بجای Your number شماره حقیقی به همراه کدکشور رو وارد کنید.
اگر log پروژه رو ببینید sotrate/logs/laravel.log متوجه پیام زیر میشوید :
[2016-08-02 13:45:01] local.INFO: sent message: 03000000068F5D97
دریافت SMS های ورودی
برای اینکار باید از چند چیز مطمئن بشید :
1 – مطمئن بشید اپ شما توسط Nexmo بوسیله یک تونل محلی localtunnel قابل دسترس باشه
2 – یک مسیر جدید برای دریافت SMS بسازید
3 – برای مسیر دریافت SMS حتماً CSRF رو غیرفعال کنید
4 – Nexmo رو وقتی پیام جدیدی میرسه مطلع کنید تا یک webhook صدا بزنه
با فرض اینکه شما از ngrok استفاده میکنید دستورات زیر رو برای دسترسی اپ به Nexmo وارد کنید :
› ngrok http 8000 ngrok by @inconshreveable (Ctrl+C to quit) Tunnel Status online Version 2.1.3 Region United States (us) Web Interface http://127.0.0.1:4041 Forwarding http://814882e9.ngrok.io -> localhost:8000 Forwarding https://814882e9.ngrok.io -> localhost:8000 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
حالا مسیر جدید رو بسازید :
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){ });
در فایل VerifyCsrfToken.php که در فولدر middleware پروژه قرار داره به این صورت csrd مسیر رو غیرفعال کنید :
protected $except = [ '/sms/receive' ];
حالا برای قدم چهارم از Nexmo cli استفاده میکنیم :
nexmo link:sms 14155550111 https://814882e9.ngrok.io/sms/receive Number updated
حالا باید چنین پیامی رو در ترمینال ngrok ببینید :
HTTP Requests ------------- POST /sms/receive 200 OK
اگر پیامی جز این مشاهده کردید باید قدمهای قبلی رو بیشتر بررسی کنید تا مشکل حل بشه.
مسیر تعریف شده رو بصورت زیر کامل کنید :
Route::post('/sms/receive', function(\Nexmo\Client $nexmo){ $message = \Nexmo\Message\InboundMessage::createFromGlobals(); Log::info('got text: ' . $message->getBody()); });
حالا به شماره وارد شده یک SMS بفرستید . اگر موفق آمیز باشه پیام زیر نمایش داده میشه :
[2016-08-02 13:45:01] local.INFO: sent message: 03000000068F5D97 [2016-08-02 14:20:50] local.INFO: sent message: 0300000006917797 [2016-08-02 14:21:17] local.INFO: got text: Sending one back.