質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Twilio

Twilioは電話・SMS・ビデオ・チャット・SNS連携等、様々なコミュニケーションチャネルの融合を可能とするクラウドコミュニケーションAPIサービスです。 従来は大規模な設備投資が必要だった電話と連携したシステムも、汎用的な開発言語で容易に開発が可能となり、 様々なコミュニケーションチャネルを活用したシステム構築が可能となります。

Q&A

解決済

1回答

1366閲覧

TwilioでSMS送信結果を取得する方法

avantgarden

総合スコア121

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Twilio

Twilioは電話・SMS・ビデオ・チャット・SNS連携等、様々なコミュニケーションチャネルの融合を可能とするクラウドコミュニケーションAPIサービスです。 従来は大規模な設備投資が必要だった電話と連携したシステムも、汎用的な開発言語で容易に開発が可能となり、 様々なコミュニケーションチャネルを活用したシステム構築が可能となります。

0グッド

0クリップ

投稿2019/09/10 11:06

Twilioを使ってSMS送信を実装しているのですが、送信できた場合、送信先番号が存在せず送信できなかった場合で、処理を切り分けたいと思っています。

具体的には、

form.php内で

require_once('send_sms.php');

でSMS送信プログラムを読み込み、
send_sms.phpで、

use Twilio\Rest\Client; require_once __DIR__ . '/twilio-php-master/Twilio/autoload.php'; $account_sid = {sid}; $auth_token = {auth_token}; $twilio_number = '{twilio_number}'; $client = new Client($account_sid, $auth_token); $client->messages->create( '{number}', array( 'from' => $twilio_number, 'body' => 'test', ) );

と記述して、送信自体は問題なく行えます。

ただ、公式サイト
https://www.twilio.com/docs/sms/send-messages#monitor-the-status-of-your-message
を参考にして

require_once('send_sms.php');

でSMS送信プログラムを読み込み、
send_sms.phpで、

use Twilio\Rest\Client; require_once __DIR__ . '/twilio-php-master/Twilio/autoload.php'; $account_sid = {sid}; $auth_token = {auth_token}; $twilio_number = '{twilio_number}'; $client = new Client($account_sid, $auth_token); $client->messages->create( '{number}', array( 'from' => $twilio_number, 'body' => 'test', 'statusCallback' => "http://{domain}/form.php" ) );

として、

require_once('send_sms.php'); echo('<pre>'); var_dump($_POST); echo('</pre>');

として、送信ステータス等を確認しようとしても何もでませんでした。

方法が間違えているのか、、正しい方法を教えていただきたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

さっとドキュメントを読んだ限りでは
statusCallback
で指定したURLに結果を送ってくれると書いてますね。

なので、自分でインターネット上に結果を受け取れるAPIを公開する必要があります。(SMSのステータスは複数回変化するのが普通なので、どのSMSプロバイダでもこんな感じのAPIになっています)

投稿2019/09/10 12:07

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

avantgarden

2019/09/10 13:33

すみません。私の理解力が足りず申し訳ないのですが、コールバックURLにcallback_receive.phpを指定したとすると、callback_receive.phpにはどういう処理を書くことになるのでしょうか?APIということは、SMS送信→API(callback_receive.php)を叩く→ステータス等を返す、という流れかになるのかと思うのですが。
tanat

2019/09/10 14:20 編集

若干誤解されている様な? callback_receive.phpとして自分のサーバに設置しておくと、「twillioが」自分のサーバにおいてあるcallback_receive.phpをAPIとして叩いてくれます。 ドキュメントだと以下のような処理をサンプルとして提示してありますね。 <?php $sid = $_REQUEST['MessageSid']; $status = $_REQUEST['MessageStatus']; openlog("myMessageLog", LOG_PID | LOG_PERROR, LOG_USER); syslog(LOG_INFO, "SID: $sid, Status: $status"); closelog(); ここではログに吐き出してるだけですが、DBに入れてアプリケーション側で扱いやすいようにするのが楽でしょうね。
avantgarden

2019/09/10 14:19

有難うございます。ドキュメントを探しても見つけられなかったのですが、差し支えなければURLを教えていただけないでしょうか?
tanat

2019/09/10 14:32

https://www.twilio.com/docs/sms/tutorials/how-to-confirm-delivery-php 上記のサンプルは↑にあったものです。(質問で提示されているリンクからスマホで適当にたどって行ったところにありました。) とりあえず file_put_contents("/save/path",serialize($_REQUEST).PHP_EOL,FILE_APPEND); とかして$_REQUESTを全部ファイルに保存しておいて、 APIを叩かせればどういう感じのリクエストが来るかわかると思います。
avantgarden

2019/09/10 14:40

ありがとうございます。一度、ファイルに保存して試してみます。 またご報告させていただきます。
avantgarden

2019/09/11 04:23

送り先にcallback_receive.phpを指定し、callback_receive.phpで$_REQUESTをファイル保存したところ、ちゃんとステータス等が出力されました! 存在しない番号宛にSMS送信すると、最終的に「undelivered」というステータスになるので、これをDBに書き込んで後の処理で利用すれば、やりたいことが実現できそうです。 TwilioにAPIを叩かせるということですね。勉強になりました。ありがとうございます。m(_ _)m
avantgarden

2019/09/11 04:51

すいません…。 callback_receive.phpで$_REQUESTでステータスを取得し、それをform.phpに返したいのですが、 callback_receive.phpで $ret = array('status' => $_REQUEST['SmsStatus']); echo json_encode($ret); として、form.phpで var_dump(json_decode($ret)); としても、NULLになってしまいます。 基本的なことだと思うのですが、値を返すにはどうしたらいいのでしょうか…
tanat

2019/09/11 05:04

callback_receive.php で受け取ったデータを一回ファイルやDBに保存しておいて、form.phpでそのファイルやDBからデータを取得する必要がありますね。 PHPファイル間のデータ連携はtwillioに限った話ではないので、掲示板等の入門用アプリケーションを作ってみると理解が早いです。(逆に言うと、回答欄で回答しきれる量では無いです)
avantgarden

2019/09/11 05:23

callback_receive.php から返ってきたステータスで分岐して、form.phpでDB更新をしようとおもってたのですが(更新するレコードのkeyの変数がform.phpにあるので)、 'statusCallback' => "http://{domain}/callback_recwive.php" の指定のところで、callback_recwive.php?id={$id} としてみたら、API側でちゃんと$_GETが出たので、API側でDB更新できそうです。 ちなみに、上記返信で書いていただいている >PHPファイル間のデータ連携 は基本的なことでしょうか…? apiからjsonを返してjsで処理をするとかなら良くやるのですが、PHPからPHPに返すというのは馴染みがないので。。 本題から外れてすみません…
tanat

2019/09/11 05:38

> ちなみに、上記返信で書いていただいている > >PHPファイル間のデータ連携 > は基本的なことでしょうか…? そうですね。webアプリケーションを作るうえでは基本的な内容と言えると思います。 複数のリクエスト間 と 複数のファイル間 ではまた話が違うのですが、その辺も入門書を一冊クリアしてみるとすっきりと把握できるかなと思います。
avantgarden

2019/09/11 05:50

APIということに囚われていたようで、同じサーバー内だしSESSION使えばいいのかなと思い立って、 callback_receive.phpで $_SESSION['success_flg'] = $_REQUEST['MessageStatus']; として、ステータスをSESSIONに格納してみたのですが、 form.phpで var_dump($_SESSION['success_flg']); としてもNULLとなり謎です。。
tanat

2019/09/11 05:57

SESSIONは同じ人相手に同じデータを保持する仕組みなので、今回のケースでは使えません。 基礎的な理解なく総当たりで対応するのはかなり困難なので、入門書籍や入門サイトで一通り基礎をさらうことをお勧めします。
avantgarden

2019/09/11 06:02

APIのリクエスト元がその人じゃないから、ということですよね。アホでした。基礎的なところをもう一度振り返ってみます。色々とありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問