|1| Giới thiệu

Twilio là dịch vụ cho phép bạn xây dựng ứng dụng liên quan đến việc gửi và nhận các tin nhắn và cuộc gọi trên điện thoại một cách tự động.
Bài viết này sẽ demo cách tạo cuộc gọi tự động đến số điện thoại của khách hàng bằng PHP. Sau khi khách hàng nhận cuộc gọi, sẽ nghe thông tin và lựa chọn các options bằng cách nhấn số 1 hoặc 2 hoặc 3 (tuỳ vào bạn setup).

|2| Tạo tài khoản Twilio dùng thử

Bạn vào trang https://www.twilio.com và đang ký một tài khoản. Sau đó sẽ vào màn hình console https://www.twilio.com/console. Tại đây bạn đăng ký để được được cấp một số điện thoại trial với tài khoản $15. Bạn sẽ setup số điện thoại này để gọi đến số của khách hàng.

uc?id=11wZY5pbaLhhFOjJCGRQ75km3QPQ0L7tQ&export=download

Như hình trên, bạn sẽ có 3 thông tin cần thiết cho việc setup TRIAL NUMBER, ACCOUNT SID, AUTH TOKEN.

Bạn cũng đừng quên kiểm tra xem giới hạn khu vực ở Việt Nam đã được check chưa. Kiểm tra và check ở https://www.twilio.com/console/voice/calls/geo-permissions/low-risk

uc?id=17pjEvNNKK6_HhYxqF7KQbRe_n9XTncCF&export=download

|3| Code với PHP

Chương trình của chúng ta ở đây là sẽ gọi điện đến số của khách hàng, sau đó chờ input trả về từ khách hàng. Nó sẽ có những bước sau:

  1. Gọi đến khách hàng và phát thông tin.
  2. Chờ nhận input trả về từ khách hàng.
  3. Nếu khách không input gì thì lặp lại câu phát thông tin ở bước 1.
  4. Nếu khách đã input thì cám ơn rồi thoát.

Ở bước 2, việc chờ input từ khách thì ta sẽ sử dụng module Gather mà Twilio cung cấp. Tham khảo tại đây

① Cài Twilio SDK
composer require twilio/sdk
② Cài ngrok

Ngrok là một dịch vụ xịn xò dùng để public ip local. Có thể tham khảo thêm tại đây.

Sau khi download về, bạn mở CMD di chuyển vào thư mục chứa file ngrok vừa down về và chạy lệnh sau:

ngrok http 3000

3000 là port bạn đang mở ở local khi chạy ứng dụng php của bạn (localhost:3000)

Sau khi chạy lệnh trên xong, ngrok sẽ tạo cho bạn 1 link mới. Link này tương đương vs http://localhost:3000. Bạn sẽ dùng link đó để sử dụng trong twilio.

uc?id=1cwD1gn5J_s8Y78EnQ8rmSjNMGXqANpfw&export=download

③ Tạo file 1-outbound-call.php để kích hoạt cuộc gọi
<?php
require_once '/path/to/vendor/autoload.php'; // Loads the library
use Twilio\Rest\Client;

const SERVICE_SSL_URL = "http://70a04428.ngrok.io"

$sid    = "YOU_ACCOUNT_SID";
$token  = "YOUR_AUTH_TOKEN";
$client = new Client($sid, $token);

$to     = "+84901234567";    // YOUR CUSTOMER'S NUMBER
$from   = "+12029463870";  // TRIAL NUMBER
$params = [
            'url' => SERVICE_SSL_URL.'/2-call-answered-gather.php'
        ];

$call = $client->calls->create($to, $from, $params);

Sau khi create() được thực thi, dịch vụ Twilio sẽ được kích hoạt. Twilio sẽ gọi lại đường dẫn url mà bạn đã khai báo bên trên để lấy thông tin sẽ phát thoại.

④ Tạo file 2-call-answered-gather.php
<?php
require_once '/path/to/vendor/autoload.php';
use Twilio\Twiml;

const SERVICE_SSL_URL = "http://70a04428.ngrok.io"

// Use the Twilio PHP SDK to build an XML response
$response = new Twiml();

// Use the <Gather> verb to collect user input
$params = [
            'method' => 'POST',
            'numDigits' => 1,  // limit number input
            'action' => SERVICE_SSL_URL.'/3-gather.php' // called after input
        ];
$gather = $response->gather($params);

// use the <Say> verb to request input from the user
$gather->say('Press 1 to take a survey. Press 2 to hear a joke.');

// If the user doesn't enter input, loop
$response->redirect(SERVICE_SSL_URL.'/2-call-answered-gather.php');

// Render the response as XML in reply to the webhook request
header('Content-Type: text/xml');
echo $response;

Sau khi câu lệnh $gather->say(...) được thực hiện, thì khách hàng sẽ nghe lời thoại bạn đã định nghĩa và dừng chờ khách hàng nhập số. Nếu khách nhập số thì ngay lập tức sẽ được chuyển đến file dưới đây để xử lý. Nếu khách không input gì thì sẽ nhảy xuống câu lệnh bên dưới là lệnh $response->redirect()

⑤ Tạo file 3-gather.php để xử lý input từ user
<?php
require_once '/path/to/vendor/autoload.php';
use Twilio\Twiml;

const SERVICE_SSL_URL = "http://70a04428.ngrok.io"

// Use the Twilio PHP SDK to build an XML response
$response = new Twiml();

// If the user entered digits, process their request
if (array_key_exists('Digits', $_POST)) {
    switch ($_POST['Digits']) {
    case 1:
        $response->say('You selected to take the survey. Thank you!');
        break;
    case 2:
        $response->say('You selected to her a joke! Why did the robot cross the road? Because it was carbon bonded to the chicken!');
        break;
    default:
        $response->say('Sorry, I don\'t understand that choice.');
        $response->redirect(SERVICE_SSL_URL.'/2-call-answered-gather.php');
    }
} else {
    // If no input was sent, redirect to the /voice route
    $response->redirect(SERVICE_SSL_URL.'/2-call-answered-gather.php');
}

// Render the response as XML in reply to the webhook request
header('Content-Type: text/xml');
echo $response;

Ở bước này, Twilio sẽ trả về thông tin khách hàng đã input qua Digits. Dữ liệu response theo phương thức POST là do ở bước thứ 4 ta đã định nghĩa methodPOST. Bây giờ bạn đã có con số mà khách hàng input, lúc này bạn sẽ xử lý tuỳ vào chương trình của bạn.

Vậy quy trình thực thi giữa app của bạn vs Twilio là như thế nào?

  1. Từ app kích hoạt cuộc gọi đến dịch vụ Twilio. Twilio thực hiện cuộc gọi đến số điện thoại đã khai báo.
  2. Khách hàng bắt máy.
  3. Twilio redirect về app lấy message (cái mà Twilio sẽ phát thoại cho số điện thoại gọi đi)
  4. App trả lại cho Twilio message
  5. Twilio phát message qua điện thoại cho khách hàng nghe
  6. Twilio chờ khách hàng input.
  7. Khách hàng input.
  8. Twilio gửi về lại cho app.
  9. App xử lý rồi phản hồi Twilio.
  10. Twilio phát thoại tin nhắn mà app đã phản hồi.
  11. Kết thúc.

|4| Chốt bài

Demo nho nhỏ đã được hoàn thành. Twilio còn cung cấp các tính năng xịn xò khác như đa ngôn ngữ, giọng nam/nữ, v.v... Các bạn tham khảo thêm trên trang document của Twilio nhé.