Help us understand the problem. What is going on with this article?

Twilioで在宅勤務の外線電話をステキな感じにする3(SIPクライアント+Twilio番号で発信)

More than 3 years have passed since last update.

これまでのもの

Twilioで在宅勤務の外線電話をステキな感じにする(一斉呼び出し・時間外非応答)(前置き編)
http://qiita.com/chabose/items/2dc18db77bdf14c2738f
Twilioで在宅勤務の外線電話をステキな感じにする(一斉呼び出し・時間外非応答・Slack通知)(実装編)
http://qiita.com/chabose/items/f098aa4ff28ad5492fa3

今回作るもの

前回までに着信部分を作ったので、今回は発信を実装します。
Twilioで取得した電話番号で着信できても、その番号で折り返しができなければあまり意味がありません。
なので、前述のSIPクライアントから発信した場合、Twilioで取得した番号で発信先に電話がかかるようにします。

イメージはこんな感じです。
outgoing.png

フロー

  1. SIPクライアントから電話番号に発信する
  2. TwiMLが呼ばれ、発信先番号を解釈する
  3. Twilio番号を発番にして外部に発信する

太字部分が今回実装する部分です。

実装

電話番号の解釈

SIPクライアントを利用した場合、通常のように番号入力して発信すると、宛先が090XXXXXXXX@sipdomain.example.comのような形でSIPサーバーに送られます。

一方、Twilioが発信のときに使う番号は、+国番号(日本:81)と国内番号の先頭0を取ったもの、つまり+8190XXXXXXXXのような形式なので、これを合わせてあげる必要があります。

  1. 電話番号の先頭が0の場合は国内電話なので、@よりあとを削除、先頭の0を削除し、+81をつけて発信先番号を作成する(ex. 09012345678@sipdomain.example.com)
  2. 先頭の番号が+の場合は、国際電話なので、@よりあとを削除し、発信先番号を作成する(ex. +18001234567@sipdomain.example.com)
  3. それ以外の場合はSIPの内線の可能性があるので、そのまま発信先番号として利用する(ex. 1001@sipdomain.example.com)

コード

outbound.php
<?php
header("content-type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";

$to = $_POST['To'];
$endpos = strpos($to,"@");
$number = substr($to,4,$endpos-4);
$firstletter = substr($number, 0,1);

switch($firstletter){
    case "+":
        $dial = "<Number>${number}</Number>\n";
        break;

    case "0":
        $number = substr($number, 1);
        $dial = "<Number>+81${number}</Number>\n";
        break;

    default:
        $dial = "<Sip>${to}</Sip>";
}
?>  
<Response>
        <Dial callerId="+8150XXXXXXXX">
            <?=$dial?>
        </Dial>
</Response>

こんな感じですかね。
callerIdには必ずTwilioで購入した番号を記載します。

これをおいたURLを
[プログラマブルVoice]-[SIPドメイン]-設定画面-[REQUEST URL]に設定すれば発信については完了です。

次は

Lambda+API Gatewayですね。

chabose
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away