ضعیفبد نیستمتوسطخوبعالی (3 votes, average: 5٫00 out of 5)
Loading...

ارسال و دریافت پیش نمایش پیام های Laravel با Nexmo

با توجه به استقبال شما از آموزش های لاراول میهن لرن است، تصمیم گرفتیم مجموعه مقالات آموزشی نیز در این زمینه منتشر کنیم. در این پست، یک سیستم دسکتاپ مبتنی بر وب را در اختیار شما قرار می دهیم و آن را برای ارسال و دریافت نوتیفیکیشن SMS با استفاده از سیستم اطلاع رسانی Laravel (که توسط Nexmoطراحی شده است) گسترش می دهیم.

آموزش ارسال و دریافت sms در لاراول

پیش نیازها

برای کار از طریق این پست، شما نیاز به یک حساب کاربری Nexmo و نصب و پیکربندی ابزار خط فرمان Nexmo و همچنین پیش نیازهای معمول Laravel خود را دارید.

در قسمت دوم پست، هنگامی که شما یک پیش نمایش SMS را از طریق Nexmo دریافت خواهید کرد، بنابراین باید به نوعی وب سرور محلی خود را در معرض دید قرار دهید.توصیه می کنیم از ngrok برای این امر استفاده کنید.

 

شروع

راه اندازی یک برنامه کاربردی و مدل های تولید و مهاجرتی خسته کننده است، و حتی مجبور نمودن شما به ایجاد فرم ها و دیدگاه ها بدتر است. برای صرفه جویی در همه هزینه های زیادی، ما یک منبع آغاز سریع ایجاد کرده ایم که می توانید آن را شبیه سازی و اجرا کنید که تمام کارهای خسته کننده ای که شما انجام می داد برایتان انجام دهد.

با تقسیم کردن مخازن Deskmo شروع کنید به طوری که زمانی که شما برخی از تغییرات را انجام داده اید، می توانید آنها را به Github متعهد کنید. سپس، شاخه initial-scaffolding را به دستگاه محلی خود وصل کنید. این شاخه شامل مدل های از پیش تولید شده، مهاجرت ها و اشکال است.

git clone -b initial-scaffolding https://github.com/<YOUR_USER>/deskmo cd deskmo

هنگامی که مخزن را در دستگاه خود داشته باشید، نسخه .env.example را به.env.example کپی کنید و هرگونه مقادیر که ممکن است  برای اجرای برنامه خود لازم باشد (مثلا اعتبارهای پایگاه داده) را ویرایش کنیدتغییر دهید.

بعدا باید composer install اجرا تا تمام وابستگی های شما را خارج کند. این یک نصب واریته Laravel ، به استثنایlaravelcollective/html برای تولید فرم ما اضافه شده است.

هنگامی که اجرا تمام شد، وقت آن است که برنامه خود را اجرا کنید. ما باید یک کلید کاربردی جدید ایجاد کنیم، مهاجرت پایگاه داده را اجرا کنیم و سرور ساخته شده را شروع کنیم.

php artisan key:generate php artisan migrate php artisan serve

برای استفاده از برنامه، باید یک حساب کاربری را ثبت کنید (نگران نباشید، این فقط در پایگاه داده محلی شما است!). ممکن است متوجه شوید که فرم ثبت نام یک فیلد اضافی دارد،phone_number . این شماره ای است که ما یک پیام به آن ارسال میکنیم بنابراین مطمئن شوید شماره خود را با دقت در فرم بین المللی وارد کرده اید و 0 پیشفرض (به عنوان مثال 14155550100) را فراموش نکنید.

ایجاد یک حساب کاربری به طور خودکار شما را به یک صفحه می فرستد که می گوید هیچ بلیطی وجود ندارد. با کلیک بر روی بلیط جدید در بالا سمت راست، یک بلیط جدید ایجاد کنید.

“شناسه کاربر گیرنده” شما “1” خواهد بود. در برخی موارد ممکن است یک اتمام خودکار خوب باشد، اما ورود به شناسه کاربری هم چنان به خوبی مقدور است.

پس از کلیک بر روی Submit ، باید به لیست بلیط برگردید، اما این بار باید نشان داده شده باشد.

ما در نهایت در موقعیت شروع به نوشتن کد هستیم! اگرچه ما یک سیستم را داریم که به شما اجازه می دهد بلیت ها را ایجاد کنید، اما هنوز هم می توانید آن را انجام دهید. در بقیه این پست، یک شماره تلفن Nexmo خریداری می کنیم، هر زمان که یک بلیط ایجاد می شود، به شما اطلاع رسانی می شود و مشتری را قادر می سازد که از طریق پیامک به بلیط پاسخ دهد.

 

خرید یک شماره تلفن Nexmo

قبلا ذکر شد که ما نیاز به یک شماره تلفن Nexmo برای دریافت پیش نمایش SMS داریم و می خواهیم به عنوان یک webhook فرستاده شود. برای اینکه مردم برای پاسخ دادن به آن آسان باشند، از همان شماره، به عنوان شماره خروجی ما نیز استفاده خواهیم کرد.

شما می توانید از طریق Nexmo Dashboard یک شماره را خریداری و پیکربندی کنید، اما امروز ما از Nexmo CLI استفاده می کنیم.

برای خرید یک شماره، ما از دستور number:search برای پیدا کردن یک شماره با هر دو پشتیبانی SMS و صدا استفاده می کنیم، سپس دستور number:buy را برای خرید آن شماره وارد می کنیم. ما در حال خرید یک شماره ایالات متحده در اینجا هستیم، اما شما می توانید ایالات متحده را با هر یک از 45+ کشور جایگزین کنید که Nexmo دارای شماره های محلی است.

nexmo number:search US --sms --voice nexmo number:buy <NUMBER> --confirm

توجه داشته باشید که ما به آن شماره برگشتی به زودی نیاز خواهیم پیدا کرد.

 

پیکربندی Nexmo

برای ارسال پیش نمایش از طریق سیستم اطلاع رسانی Laravel، ما به نصب nexmo/client با اجرا و پیکربندی برنامه خود با کلید API Nexmo ، به علاوه تعدادی که خریداری کرده ایم، نیاز داریم.

nexmo/client با اجرای composer require nexmo/client نصب کنید. بعد، config/services.php ویرایش کرده و گزینه های پیکربندی زیر را اضافه کنید:

'nexmo' => [ 'key' => env('NEXMO_KEY'), 'secret' => env('NEXMO_SECRET'), 'sms_from' => env('NEXMO_NUMBER'), ],

در نهایت، .env ویرایش و کلید API خود، شماره سری و Nexmo را ارئه دهید. می بایست شبیه به این باشه:

NEXMO_KEY=<YOUR_KEY> NEXMO_SECRET=<YOUR_SECRET> NEXMO_NUMBER=<YOUR_NUMBER>

همه اینها برای ادغام Nexmo با سیستم اطلاع رسانی لاراول – یک composer install و سه مقدار پیکربندی است.

 

ارسال یک اعلانیه

اکنون ما در موقعیتی هستیم تا یک اطلاعیه ارسال کنیم، اما هیچگونه اعلانی برای ارسال وجود ندارد ایجاد یک اطلاعیه جدید با اجرای php artisan make:notification TicketCreated و فایل جدید ایجاد شده خود را (app/Notifications/TicketCreated.php ) باز کنید.

اولین چیزی که تغییر می کند در خط 32 است، که در آن تابع via mail می فرستد. ما نمی خواهیم این را از طریق ایمیل بفرستیم، بنابراین مقدار آن را به nexmo تغییر می دهیم تا آن را به عنوان SMS ارسال کنیم.

کلاس اطلاع رسانی می داند چگونه پیام را برای یک ایمیل قالب بندی کند، اما نه برای اس ام اس. برای حل این مشکل، یک روش جدید به صورت زیر اضافه کنید:

public function toNexmo($notifiable) { return (new NexmoMessage) ->content($this->entry->content); }

این روش از دو اشیاء جدید استفاده می کند – NexmoMessage و $this->entry . بگذارید آنها را به کلاس اضافه کنیم:

use App\TicketEntry; use Illuminate\Notifications\Messages\NexmoMessage;

شما همچنین باید روش TicketEntry __construct() خود را برای قبولTicketEntry به روز کنید و $entry به عنوان یک متغیر کلاس اضافه کنید:

protected $entry; public function __construct(TicketEntry $entry) { $this->entry = $entry; }

ما اکنون یک اعلانیه داریم که می تواند به یک کاربر ارسال شود، اما ما هنوز هم آنجا نیستیم، زیرا نمی دانیم که ما باید آن را ارسال کنیم.

یک بلیط می تواند چندین مشترک را داشته باشد و یک کاربر می تواند به چندین بلیط مشترک شود. برای نشان دادن این رابطه، ما باید یک روش جدید را به کلاس Ticket اضافه کنیم.ما ticket_subscriptions به عنوان پارامتر دوم مشخص می کنیم چون این یک نام جدول محوری غیر استاندارد است (این کاربران بلیط خود را ندارند، آنها فقط در اعلانیه ها مشترک شده اند)

public function subscribedUsers() { return $this->belongsToMany(User::class, 'ticket_subscriptions'); }

پس از انجاماین  کار، TicketController را باز کنید و به لیست ورودی خود اضافه کنید تا ما بتوانیم اعلانیه ایجاد کنیم:

use App\Notifications\TicketCreated; use Notification;

سرانجام، ما باید در واقع اعلانیه را ارسال کنیم. در پایین روش store ، درست قبل از بازگشت به صفحه index، کد زیر را اضافه کنید:

Notification::send($ticket->subscribedUsers()->get(), new TicketCreated($entry));

این همه کاربران مشترک برای بلیط و یک TicketCreated جدید برای ورود تازه ایجاد می کند. تغییرات خود را ذخیره کنید و یک بلیط جدید را با ID 1 گیرنده (که باید حسابتان باشد) ایجاد کنید. شما باید ظرف چند ثانیه پیامک با محتوای ورود دریافت کنید.

تبریک! ما اعلان های SMS را به برنامه خود اضافه کردیم. هنگامی که ما همه چیز را پیکربندی کردیم، بسیار آسان و راحت بود، فقط چهار مرحله کوتاه:

  • ایجاد یک اعلان با php artisan make:notification
  • روش استفاده از nexmo
  • یک روش toNexmo() اضافه کنید تا toNexmo() بداند چگونه پیام را رندر کند
  • Notification::send() به برنامه ما برای ارسال اطلاع رسانی

 

دریافت پاسخ SMS

بنابراین، مشتری ما محتوای بلیط را به عنوان SMS دریافت کرده است، اما بعد چه؟ آیا آنها مجبورند به یک رایانه وارد شوند تا بتوانند به بلیط پاسخ دهند؟

در واقع ما هیچ راهی برای پاسخ دادن به آن نداریم و اگر ما مجبور باشیم برای ساختن چیزی تلاش کنیم، اجازه دهید آن را برای آنها آسان تر کنیم – بیایید راه را برای پاسخ دادن به آنها از طریق اس ام اس اضافه کنیم.

این پست فرض می کند که روش HTTP webhook شما در تنظیمات Nexmo شما به POST تنظیم شده است . این پیکربندی به طور پیش فرض تنظیم شده، پس بروید و بررسی کنید!

هنگامی که Nexmo یک پیام کوتاه در شماره تلفن شما دریافت می کند، آنها یک درخواست HTTP به درخواست شما ارسال می کنند. متاسفانه، برنامه شما در حال حاضر بر روی دستگاه محلی شما اجرا می شود و Nexmo نمی تواند به آن دسترسی پیدا کند. این جایی است که ngrok وارد می شود.

برای نمایش سرور محلی خود در اینترنت، ngrok http 8000 اجرا کنید. این جلسهngrok اطلاعات زیادی در آن ایجاد خواهد کرد. تنها چیزی که نیاز دارید نام میزبان ngrok ، که در کنار کلمه Forwarding قرار دارد، دنبال چیزی شبیه http://abc123.ngrok.io باشید.

Session Status online Account Michael (Plan: Free) Version 2.2.8 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://abc123.ngrok.io -> localhost:8000 Forwarding https://abc123.ngrok.io -> localhost:8000 Connections ttl opn rt1 rt5 p50 p90 6 0 0.00 0.00 0.11 0.78

هنگامی که یک URL ngrok دارید، باید به Nexmo بگویید که URL عمومی شما از ابزار Nexmo CLI استفاده می کند. دستور زیر را اجرا کنید، جایگزین های ngrok را با شماره Nexmo عوض کنید.

nexmo link:sms <NEXMO_NUMBER> http://<NGROK_URL>/ticket-entry

این پیکربندی Nexmo برای ارسال تمامی webhook ها به این شماره http://<NGROK_URL>/ticket-entry استفاده می شود. بگذارید یک تست سریع برای اطمینان حاصل بگیریم که همه چیز به درستی پیکربندی شده است. TicketEntryController را باز و روش store را با موارد زیر جایگزین کنید:

public function store(Request $request) { error_log(print_r($request->all(), true)); }

این هر درخواست ورودی را به کنسول در ترمینال وارد می کند که ما توسط php artisan serve آن را اجرا می کنیم، اما هنوز کار نخواهد کرد. قبل از اینکه بتوانیم گیرنده اس ام اس خود را آزمایش کنیم یک تغییر دیگر وجود دارد – ما بایستی حفاظت CSRF را برای مسیرticket-entry غیرفعال کنیم.

به طور پیش فرض، Laravel ما را از حملات سایت های متقاطع محافظت می کند با اعتبار یک نشانه CSRF در هر ارسال فرم (این کار خوبی است!)، اما Nexmo نمی تواند از شناسه استفاده کند. برای کار در اطراف آن، ویرایشHttp/Middleware/VerifyCsrfToken.php و اضافه کردن ticket-entry$except به آرایه $except زیر لازم است:

 protected $except = [ '/ticket-entry' ];

اگر در حال حاضر به یکی از اعلان های اس ام اس قبلی که قبلا دریافت کرده اید پاسخ دهید، باید یک آرایه از اطلاعات روی صفحه نمایش دهد (ممکن است تا یک دقیقه طول بکشد):

( [msisdn] => 14155550201 [to] => 14155550100 [messageId] => 0C0103008660C470 [text] => This is a test [type] => text [keyword] => THIS [message-timestamp] => 2018-01-09 02:11:40 [timestamp] => 1515464263 [nonce] => e143f53f-dev2-42f5-9103-f81e56a406c3 [sig] => ef52cbcabcc2e631eff3853ec1bfe38b )

این به این معنی است که ادغام ما به درستی پیکربندی شده است، و هر زمان که تعدادی پیامک دریافت می کند، Nexmo درخواست HTTP را به برنامه ما ارسال می کند.

نکته آخر این است که بیانیه print_r را با یک کد اضافه کنید که یک ورودی را به یک بلیط اضافه می کند. همانطور که هیچ مفهومی از پاسخ ها با پیام های SMS وجود ندارد و همه ما می توانیم انجام دهیم این است که آخرین بلیط را با فعالیت هایی که کاربر تماشا می کند، جستجو کنیم و فرض کنیم که پاسخ آنها برای این بلیط در نظر گرفته شده است.

همانطور که این منطق کاملا پیچیده است، اجازه دهید آن را به مدل User ما برای استفاده مجدد بعدی اضافه کنیم. app/User.php و روش زیر را اضافه کنید:

public function latestTicketWithActivity() { // Get all tickets this user is watching $watchedTickets = TicketSubscription::select('ticket_id')->where('user_id', $this->id)->get()->pluck('ticket_id'); // Grab the latest ticket with activity that's in this list $latestTicketEntry = TicketEntry::select("ticket_id")->whereIn('ticket_id', $watchedTickets)->orderBy('created_at', 'desc')->limit(1)->first(); // Fetch the actual ticket return $latestTicketEntry->ticket()->first(); }

این شی Ticket که جدیدترین TicketEntry به یک کاربر داده شده است.این همه چیزی است که ما باید پیغام خود پیوست کرده و به بلیط بفرستیم.

به TicketEntryController رفته و خط print_r با کد زیر جایگزین کنید، که براساس شماره تلفن خود یک کاربر را سرچ می کند، آخرین بلیط را به دست می گیرد و یک ورودی جدید آن را با محتوای پیام ورودی پیوست می کند:

// Make sure it's in the correct format $data = $this->validate($request, [ 'msisdn' => 'required', 'text' => 'required' ]); // Find the user based on their phone number $user = User::where('phone_number', $data['msisdn'])->firstOrFail(); // And then find their latest ticket $ticket = $user->latestTicketWithActivity(); // Create a new entry with the incoming SMS content $entry = new TicketEntry([ 'content' => $data['text'], 'channel' => 'sms', ]); // Attach this entry to the user and ticket, then save $entry->user()->associate($user); $entry->ticket()->associate($ticket); $entry->save(); return response('', 204);

در نهایت، ما باید برای کلاس هایی که در کد بالا استفاده کردیم، دو ورودی بیشتر اضافه می کنیم:

use App\User; use App\TicketEntry;

این پیام را ذخیره کنید و یک پاسخ اس ام اس ارسال کنید، سپس آخرین بلیط را تازه سازی کنید تا به عنوان پیام شما ظاهر شود.

دریافت SMS حتی ساده تر از ارسال اس ام اس است! ما فقط پنج مرحله کوچک از قابلیت صفر به پاسخهای SMS از طریق webhooks داریم:

  • پیکربندی webhoks nexmo برای یک شماره
  • اجرای ngrok برای نمایش سیستم محلی شما
  • غیرفعال کردن محافظت CSRF برای نقطه پایانی webhook
  • آخرین بلیط فعال را بردارید
  • پیام ورودی را به عنوان یک ورودی جدید ذخیره کنید

 

نتیجه

در این پست، ما از طریق سیستم اعلان Laravel و Nexmo، همچنین دریافت پیام های دریافتی SMS و ذخیره آنها در یک پایگاه داده، از طریق اعلان های ارسالی را پوشش دادیم.

در بخش بعدی این سری، ما به اضافه کردن پشتیبانی از تماس صوتی به برنامه میز کمک هایمان خواهیم پرداخت. تلفن زنگ زده سخت تر از نادیده گرفتن پیام متنی است و برای مسائل حساس به زمان ممکن است انتخاب صحیح باشد.

اگر فکر و یا سوالی دارید، دریغ نکنید و با نظرات خود ما را بهرمند کنید.

همچنین ببینید

امکانات جدید لاراول 5.5

روش های جدید مسیریابی معرفی شده در  5.5 Larave

به نام خدا Laravel 5.5 دو کلید میانبر مناسب را به کلاس Laravel Router  اضافه کرده …

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *