PHP×Twilio×再配達サービス#1

2013.10.30

弊社で色々取り上げられていますTwilioですが、今回PHPのTwilML libraryを使ってみました。
Twilioを始めるにあたっては こちらを参考にしてください。

今回はamazon linux上で動作させています。(PHPの動作環境は整っている前提ですすめます)

ライブラリを用意する

まず、ライブラリを こちらからダウンロードします。
ダウンロードしたZIPファイルを解凍し、適当な箇所に配置します。

動かしてみる

まずは簡単に動かしてみましょう。

[PHP] gather(array('numDigits' => 1, 'timeout' => 30, 'action' => 'http://xxx.xxx.xxx/test.php')); $gather->say("はじめまして", array('language' => 'ja-jp')); print $response; ?> [/PHP]

Services_Twilio_TwimlクラスのTwiMLタグに対応したメソッドを呼び出すことで直接TwiMLを記述しなくてすみます。 IEブラウザで表示すると以下のようにTwiMLが表示されます。

[XML] はじめまして [/XML]

アプリを登録して電話から呼び出してみる

Twilioのサイトにログインし、メニューの「NUMBERS」をクリックし、取得した電話番号を選択します。

電話番号設定

Voice Request URLに作成した、アプリのURLを設定し、Save Changeボタンをクリックし保存します。

URL設定

表示されている電話番号に電話をすると、「はじめまして」という音声が流れます。(※1)
こちらのTwiMLの定義は「はじめまして」という音声が流れ、電話からのキー入力を待ちます。ここで何かキーを入力するとaction属性のURLが呼び出されます。(※2)

  • ※1 表示されている電話番号は+81ではじまっていますが、これは国際電話をかける際の国番号なので日本国内から電話をかけるときは+81を0に置き換えて電話をすれば大丈夫です。
  • ※2 トライアカウントの場合は、最初に有料版にアップグレードしてくださいというメッセージが流れた後に、作成したアプリが呼び出されます。

再配達サービスを作る

では、次にもう少し実際に使えそうなサービスについて考えてみたいと思います。
今回は再配達の受付サービスを作りたいと思います。全体のフローとしては以下のようにしたいと思います
flow
電話がかかってきた時の最初のアクションはこんな感じです。

最後にシャープを押すと入力完了とさせるのはfinishOnKey属性を使います。ここでは入力完了のキーとしてシャープを設定しています。
またgatherタグにtimeout属性を設定することで、ユーザからの入力に対しての待ち時間を設定できます。今回待ち時間は30秒にしています。ユーザから30秒間レスポンスがなかった場合は次のタグが実行されます。この場合、sayタグに設定されている音声が読み上げられアプリは終了します。

[start.php]

[PHP] gather(array('finishOnKey ' => '#', 'timeout' => 30, 'action' => 'http://xxx.xxx.xxx/numberCheck.php')); $gather->say("クラスメソッド宅配サービス自動受付センターです。 お手持ちのご不在連絡票のお問い合わせ番号を入力し、最後にシャープを押してください。", array('language' => 'ja-jp')); $response->say("ボタンが押されませんでしたので、終了します。", array('language' => 'ja-jp')); print $response; ?> [/PHP]

IEブラウザで表示すると以下のようにTwiMLが表示されます。

[XML] クラスメソッド宅配サービス自動受付センターです。お手持ちのご不在連絡票のお問い合わせ番号を入力し、最後にシャープを押してください。 ボタンが押されませんでしたので、終了します。 [/XML]

次に入力されたお問い合わせ番号の確認を行い、正しければお届けの時間を指定させ、間違っていれば再入力される処理をします。
ユーザがプッシュ入力した値はDigitsというリクエストパラメータに設定されています。
また入力間違いが出来るのを3回までとしています。これをどのように実装するかですが、もっとも簡単なのはセッションを使用することです。Twilioでもブラウザのようにセッションを使用できます。セッションはTwilioアプリケーションが最初に呼ばれる時に新たにセッションが作成され、電話が終了するまで継続されます。
不在連絡票の有無の確認方法についてはCustomerLogicクラスを作成しデータベースへ問い合わせるようにしています。

[numberCheck.php]

[PHP] isExistNumber($num)) { $gather = $response->gather(array('numDigits' => 1, 'timeout' => 30, 'action' => 'http://xxx.xxx.xxx/selectDate.php')); $gather->say("不在連絡票を確認しながら再配達日を入力してください。本日のお届けなら1を明日のお 届けなら2を入力してください", array('language' => 'ja-jp')); $response->say("ボタンが押されませんでしたので、終了します。", array('language' => 'ja-jp')); } else { if(isset($_SESSION['count']) && $_SESSION['count'] >= 3) { // 入力ミスが3回を超えたので終了メッセージを設定 $response->say("入力に誤りがあるか、操作に問題があるため、自動受付ができません。ご利用ありがとうございました。", array('language' => 'ja-jp')); } else { // 入力回数のカウントアップ $count = $_SESSION['count']; $count += 1; $_SESSION['count'] = $count;

// 再入力させる $gather = $response->gather(array('finishOnKey ' => '#', 'timeout' => 30, 'action' => 'http://54.253.252.247/numberCheck.php')); $gather->say("入力に誤りがあります。もう一度お問い合わせ番号を入力し、最後にシャープを押してください", array('language' => 'ja-jp')); $response->say("ボタンが押されませんでしたので、終了します。", array('language' => 'ja-jp')); } }

print $response;

?> [/PHP]

まとめ

前半部分についてまずは記載をしてみましたが、簡単に作ることが出来たのが分かるかと思います。今回はPHPのフレームワークは使いませんでしたが、規模が大きくなるようでしたらフレームワークを使ってTwilioライブラリを使用した方が良いと思います。
FuelPHPをお使いになる方はFuelPHP用のライブラリがありますので、そちらをおすすめします。