TwilioでPHPからSMSと電話機能を試しました

## はじめに
初めまして、[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)の西谷です。

今回はPHPからSMSメッセージを送信する要件があったため、調査を行いました。
当初はプログラムから携帯電話にメッセージを送信する方法は検討もつかない状態でした。
Twilioを使えばいいと聞いて調べた結果、APIですべて出来るようになっており、びっくりしています。

間違い・助言等があればコメントにてお知らせいただけたらと思います。

## Twilioの導入
SMSの送信や電話を代わりに掛けてくれるサービスです。
[こちら](https://twilio.kddi-web.com/signup/)から登録できます。
登録後500円の無料枠を頂けるのでお気軽に試すことが出来ます。

登録後、チュートリアル通りに電話番号を購入します。
<img width="590" alt="スクリーンショット 2019-04-09 22.04.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/274674/2dd569b8-1838-fdb7-d935-a388e1bfeb97.png">

購入後に表示される、SIDとAUTHTOKENはAPI側で利用します。

PHP側のSDK導入は簡単で以下コマンドを実行するだけです。

```sh
composer require twilio/sdk
```

## SMSを送信する
SMSの送信はリファレンス通りで簡単にできます。  

送信先の電話番号はE.164形式で指定します。
日本の場合、`080-xxxx-xxxx`は`+8180xxxxxxxx`となります。


```php
use Twilio\Rest\Client;

$account_sid = '{SID}';
$auth_token = '{AUTHTOKEN}';
$twilio_number = '{購入した電話番号}';

$client = new Client($account_sid, $auth_token);
$client->messages->create(
    '{送信先の番号}', 
    [
        'from' => $twilio_number,
        'body' => '送信テスト'
    ]
);
```

`account_sid`, `auth_token`, `twilio_number`はダッシュボードから確認することが出来ます。

<img width="585" alt="スクリーンショット 2019-04-10 2.37.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/274674/f6213fb3-5d3e-65f8-e91f-311ebf3e3373.png">

## SMSに対して返信する
取得した電話番号にSMSが送信された場合は返信することができます。
こちらはTwilio側からWebhookで返答内容を取得するため、ローカル開発の場合は[ngrock](https://ngrok.com)などで開発環境を公開する必要があります。

全体の手順としては次のようになっています。
1. 受信内容に対して返信するAPIを作成する
2. 返信APIを公開する
3. Twilioで返信APIのURLを登録する
4. 電話番号に対してSMSを送信しると、返信APIの内容がSMSで返信される

#### 返信APIの実装
`$_REQUEST['Body']`で送信内容を取得できます。
これがあれば、API側で作り込めば大抵なことは出来そうな気がします。

```php
use Twilio\TwiML\MessagingResponse;

$body = $_REQUEST['Body'];        
header("content-type: text/xml");

$response = new MessagingResponse();
$response->message(
    "「{$body}」に対する返信です。"
);

echo $response;
```

#### TwilioにWebhook登録
Twilioの設定画面の電話番号からWebhookを設定出来ます。
こちらに先程実装したAPIのURLを登録します。

<img width="1333" alt="スクリーンショット 2019-04-10 22.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/274674/575095ff-c4c4-171e-f87b-c099b89aafba.png">


登録後に、購入した電話番号にSMSを送信するとAPI通りの返信を受け取れます！
![スクリーンショット 2019-04-11 0.13.21.png](https://qiita-image-store.s3.amazonaws.com/0/274674/116571a3-1a80-9c8d-e73a-063ed964caa9.png)


## 電話関連の機能
電話を掛けられる場合は自動音声で応答することが出来ます。
また、APIから電話をかけることも出来ます。

#### 電話に応答する
こちらはSMSの返信と同じです。
まずは応答のAPIを実装します。

```php
header("content-type: text/xml");

$response = new VoiceResponse();
$response->say(
    "test message",
    ["voice" => "alice"]
);

echo $response;
```

こちらのURLをTwilioに登録するだけです。
<img width="1437" alt="スクリーンショット 2019-04-11 0.42.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/274674/894e0386-add5-6610-cd13-a1694c685f54.png">

後は購入した電話番号に電話を掛けると自動音声で応答してくれると思います！

#### 電話をかける
APIを実行すると指定番号に電話が掛かります。
こちらもE.164で電話番号を指定します。

電話内容は`url`で指定することが出来ます。(サンプルでは上記の応答メッセージを指定しています)
また、`method`を指定しない場合はPOSTでデータ取得を行う点にご注意ください。


```php
use Twilio\Rest\Client;

$account_sid = '{SID}';
$auth_token = '{AUTHTOKEN}';
$twilio_number = '{購入した電話番号}';

$client = new Client($this->account_sid, $this->auth_token);
$client->account->calls->create(
    "{電話番号}",
    $this->twilio_number,
    [
        "url" => "http://f1683917.ngrok.io/api/test/voice.xml",
        "method" => "GET"
    ]
);
```

## おわりに
今回はTwilioでSMSと電話機能について調査しました。
応用すれば、緊急時に自動で電話を掛けたりと面白いことができそうです。(コストはかかりますが。。。)

他にも録音やルール設定など多くの機能がありますので、機会があればこれらも触ってみようと思います。

### Wantedlyでもブログ投稿してます
Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers