SMSは最近さまざまな目的で使用されています。たとえば、Gmail や Facebook などの大規模な Web サイトは SMS 多要素認証を使用し、認証プロセスを改善するための更新についてユーザーに通知します。メッセージはこれらのサイトのユーザーからのみ送信できるため、これは一方向の SMS アプリです。
双方向 SMS アプリケーションは、一方向ほど複雑ではありません。双方向 SMS アプリケーションを使用すると、ユーザーはメッセージを送信して会話を開始でき、ユーザーのコマンドに基づいてアプリケーションが応答します。
この記事では、双方向の SMS インタラクションのプロセスを説明し、それを PHP アプリケーションに組み込む方法を説明します。世界中には双方向通信を提供する人気の SMS ゲートウェイが多数ありますが、ここでは Clickatell を使用して説明します。
双方向 SMS ライフサイクルの
双方向 SMS のライフサイクルは、次の 4 つの主要なステップに分けることができます:
1、ユーザーはSMSゲートウェイにリクエストを送信します
2. SMSゲートウェイリクエストがアプリケーションサーバーに転送されます
3. アプリケーションサーバーはリクエストを処理し、SMS ゲートウェイに応答します
4. SMS ゲートウェイがユーザーリクエストを転送します
ステップ 1 - ユーザー SMS ゲートウェイ
ユーザーは SMS ゲートウェイ経由で会話を送信します。最初は、ユーザーのモバイル サービス プロバイダーを経由します。この部分はローカル サービス プロバイダーのドメイン名に含まれるため、私たちにとってはあまり重要ではありません。メッセージがローカル サービス プロバイダー経由で受信される SMS ゲートウェイ。
ユーザーは明らかに、自分のメッセージを特定の番号に送信する必要があります。アプリケーション固有のショートコードまたは専用ロング番号 (DID) のいずれかの双方向通信を使用できます。これらの番号は SMS ゲートウェイ経由で送信されるため、通常はこれらの番号を購入する必要があります。
専用番号は、94112367899 などの標準の電話番号です。ショートコードは4~6桁のコードです。誰もが独自の長所と短所を持っています:
ショートコードは専用であり、長い数字よりも覚えやすいです。
専用番号は世界中で使用できますが、ショートコードは通常、特定の国の単一のサービスプロバイダーに限定されます。
専用の長い番号は、短いコード番号と比較して、一定時間内に大量のメッセージを処理できます。
ショートコードを使用するか、専用の長い量を使用するかは、最終的にはユーザーの選択になります。
SMS ゲートウェイがメッセージを受信したら、処理アプリケーションにルーティングする必要があります。以前のメッセージ ルーティングでは、ゲートウェイは 2 つのことを行う必要があります:
アプリケーションが理解できる方法でメッセージデータを準備します
アプリの専用番号またはショートコードへの URL マッピング
各ゲートウェイにはアプリケーション サーバーにデータを転送する独自の方法がありますが、通常は HTTP 接続を介した XML または SOAP が最も一般的です。ゲートウェイは、これまでに使用されたメソッドに関する何らかの API ドキュメントを提供する必要があります。
アプリケーション開発者は、ゲートウェイから受信したメッセージの特定のエントリ ポイント (アプリケーション URL と呼ばれます) を処理するシステムを作成します。アプリケーション URL を専用番号またはショート コードにマッピングするプロセスは、ゲートウェイごとに異なります。 Clickatell のように、ユーザー アカウント インターフェイスを介して直接構成できるものもあります。このオプションが利用できない場合は、ゲートウェイに連絡して、構成するアプリケーションの URL を提供するテクニカル サポート リソースを用意しています。
フェーズ 2 – SMS ゲートウェイ アプリケーション サーバー
次に、アプリケーション所有者は、ゲートウェイからデータを受信する方法を決定します。 clickatell を使用すると、ユーザー アカウント内でこのメソッドを指定できます。利用できない場合は、再度、特定のゲートウェイの技術チームに問い合わせる必要があります。
以下のコード例は、Clickatell が HTTP GET メソッド経由で送信したデータをどのように受信できるかを示しています。他のゲートウェイも同様の方法を提供します。
https://www.example.com/sms/sms.php?api_id=12345&from=279991235642&to=27123456789×tamp=2008-08-0609:43:50&text=Hereisthe%20messagetext&charset=ISO-8859-1&udh=&moMsgId=b2aee 337ab d962489b123fda9c3480fa
1
2 $fromNo = $_GET["from"];
3 $toNo = $_GET["to"];
4 $message = $_GET["text"];
5 $msgID = $_GET["moMsgId"];
6
7 // ユーザーコマンドを処理し、出力を生成します
8 ...
XML ドキュメントとして公開されるデータの例を次に示します。
01
02
<クリックモ>
03
04
05
06
07
<タイムスタンプ>2007-02-26 14:36:50タイムスタンプ>
08
09
10
11
クリックモ>
ソースを見る
印刷しますか?
01
02
$data = $_POST["データ"];
03
04
$xmlDoc = 新しい DOMDocument();
05
$xmlDoc->loadXML($data);
06
07
$fromNo = $xmlDoc->getElementsByTagName("from");
08
$fromNo = $fromNo->item(0)->nodeValue;
09
10
$toNo = $xmlDoc->getElementsByTagName("to");
11
$toNo = $toNo->item(0)->nodeValue;
12
13
$message = $xmlDoc->getElementsByTagName("text");
14
$message = $message->item(0)->nodeValue;
15
16
// ユーザーメッセージを処理し、応答を生成します
17
...
アプリケーションは受信データをキャプチャし、利用可能なメソッドのいずれかを使用して、ユーザーのコマンドを処理する必要があります。このコードは、ユーザーのメッセージが 160 文字未満の単純なシナリオでは完全に機能します。しかし、メッセージが 160 文字を超える場合はどうなるのでしょうか?
テレビ局が広告を開始し、ユーザーが SMS 広告を送信できるとします。 SMS が送信されると、ユーザーはサーバーによって広告が表示される期間を受け取ります。広告はプレーンテキストで、画面の下部に表示されます。また、以下のようなメッセージを送信するための事前定義された形式があることを前提としています。
広告キャンペーンのタイトル 広告のタイトル、広告情報の内容
値のペアが表示されるメッセージ内のすべて。広告にはラベルが付けられ、スポーツが広告カテゴリの価値を表します。タイトルは次のタグであり、その値は広告のタイトルになります。メッセージは、ユーザーが広告に表示したいコンテンツを含む最後のタグです。
タイトルとメッセージの長さによっては、このテキスト メッセージは 160 文字を超える場合があります。長いメッセージをそれぞれ受信すると、ゲートウェイはそれを 160 文字の複数の部分に分割します。しかし、それでも 2 つの部分を 1 つのメッセージとして処理する必要があります。
前のコード例を使用してメッセージを解析すると、同じメッセージのパート 1 とパート 2 が 2 つの異なるメッセージとして処理されます。これら 2 つの部分には完全なコマンドがないため、アプリケーションはユーザーにエラーを返します。 UDHはこの問題を解決します。
UDHとは何ですか?
UDH グループはユーザー データ ヘッダーを表します。長いメッセージを送信すると、送信デバイス (携帯電話) はメッセージを分割し、別のメッセージとして送信します。 UDH 値は、受信デバイスが単一のメッセージに属していることを識別して再組み立てできるように、最初に各メッセージ部分に割り当てられます
以前の UDH グループ値を使用したシナリオは次のようになります:
パート 1 - 05 00 03 CC 02 01
パート 2 - 05 00 03 CC 02 02
最後の 2 つの 16 進値が、UDH で最も重要な値になります。最後から 2 番目の番号は 02 で、上記のコードとメッセージで定義された部品番号です。したがって、このメッセージは 2 つの部分に分かれています。 3 つの部分がある場合、この値は 03 などになります。次の番号はメッセージの部分を定義します。 01 は最初のパートであることを意味し、02 は後半のパートであることを意味します。
ここで、処理時間が延長され、メッセージが複数の部分に分割されることを知る必要があります。
01
02
$fromNo = $_GET["from"];
03
$toNo = $_GET["to"];
04
$message = $_GET["テキスト"];
05
$msgID = $_GET["moMsgId"];
06
$udh = $_GET["udh"];
07
08 $合計 = 1;
09
$count = 1;
10
if ($udh) {
11
$tmp = str_split($udh, 2);
12
$total = hexdec($tmp[4]);
13
$count = hexdec($tmp[5]);
14
}
15
16
if ($count != $total) {
17
// メッセージフラグメントをデータベースに保存します
18
SaveMessagePart($db, $from, $message, $udh);
19
}
20
else if ($total != 1) {
21
$prevParts = getMessageParts($db, $from);
22
$message = $prevParts .
23
}
24
25
// $message
を処理します
26
...
これで、完全なメッセージとアクションを処理でき、リクエスト サイクルのこの段階が完了します。次の 2 つの段階では、ユーザーがゲートウェイを通じて応答をどのように送り返すかが決まります。
ステージ 3 と 4 – SMS ゲートウェイ、ユーザーのアプリケーション サーバーへのゲートウェイ
前の段階では、ゲートウェイからメールを受信し、アプリケーションでそれを処理するプロセスについて説明しました。リクエストが処理され、レスポンスが生成されたら、それをゲートウェイに送り返す必要があります。
一般に、SMS ゲートウェイは、応答データを渡すためのコールバック URL を提供します。通常、受信者の数、送信者の電話番号、メッセージの内容、およびいくつかの認証情報を指定する必要があります。正確なパラメータはゲートウェイによって異なりますが、clickatell、from、text、および api_id、ユーザー名、パスワードです。
01
02
$message = 配列(
03
「へ」 => 942288345、
04
「から」=> 944488345、
05
"テキスト" => "サンプルメッセージ",
06
"api_id" => API_KEY、
07
"ユーザー" => "私のユーザー名",
08
「パスワード」=>「シークレット」
09
);
10
11
$apiUrl = "http://api.clickatell.com/http/sendmsg?";
12
foreach ($message as $parameter => $value ) {
13
$apiUrl .= $parameter . "&";
14
}
15
$apiUrl = rtrim($apiUrl, "&");
16
17
$ch =curl_init();
18
curl_setopt($ch, CURLOPT_HEADER, 0);
19curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
20
curl_setopt($ch, CURLOPT_URL, $apiUrl);
21
22
curl_exec($ch);
23
curl_close($ch);
上記の最初のコード例では、urlencode() を使用してすべてのパラメータをエンコードし、API コールバック URL に追加します。次に、curl リクエストを初期化し、URL を呼び出します。応答メッセージがゲートウェイに送信され、ステップ 3 が完了します。
ステップ 4 は簡単です。このプロセスでは何も行う必要はありません。ゲートウェイは、すべてのメッセージを正しい順序でユーザーの携帯電話に送信する責任があります。
まとめ
このチュートリアルは、双方向 SMS メッセージングとそれが役立つ理由について説明することから始めます。次に、双方向通信プロセスが通過する 4 つの主要な段階について説明しました。これで、特定の SMS ゲートウェイでカバーされている概念を適用し、PHP アプリケーションに双方向 SMS を実装できるようになります。