SMS是用於這些天各種用途。例如,Gmail和Facebook等大型網站使用SMS多因素身份驗證和通知用戶有關更新以改善他們的認證過程。這是單向的短信應用以來只能從這些網站的用戶發送消息。
雙向SMS應用更不是單向的復雜。雙向SMS的應用程序,用戶可以通過發送消息啟動一個會話,然後根據用戶的命令,應用程序響應。
在這篇文章中,我將解釋雙向短信相互作用的過程,並告訴你如何可以納入你的PHP應用程序。有許多流行的SMS網關,世界各地提供雙向通訊,在這裡我解釋,我將使用Clickatell。
雙向SMS生命周期的
雙向SMS的生命周期可以劃分為4個主要步驟如下所示:
1,用戶發送短信網關的請求
2,短信網關的請求轉發到應用服務器
3,應用服務器處理請求和響應SMS網關
4,短信網關轉發到用戶請求
第1步 - 用戶短信網關
用戶通過發送短信網關的談話。最初,它要經過用戶的移動服務提供商。這部分是不是對我們非常重要,因為它在本地服務提供商的域名。通過當地服務提供商的消息被接收的SMS網關。
用戶顯然需要他的消息發送到一個具體的數字。您可以使用雙向溝通,無論是簡碼或專用的長號碼(DID)特定於應用程序。這些數字是通過短信網關,通常您需要購買這些數字。
專用的數量是一個標准的電話號碼,如94112367899。一個簡碼是一個4 - 6位數字代碼。每個人都有自己的優點和缺點:
簡碼是專用長的數字相比,更容易記住。
可以使用專用號碼,全球范圍內,而簡碼通常僅限於在某個特定國家的單一服務提供商。
專用長的數字,可以處理大量的消息,對於一個給定的時間比較短碼數字。
選擇是否使用簡碼或專用的長數量最終取決於你。
一旦短信網關收到,它應該被路由到加工中的應用。之前的消息路由,網關需要做兩件事:
應用程序可以理解的一種方式,在准備的消息數據
應用程序的URL映射專用號碼或短代碼
每個網關都有它自己的方法轉移到應用服務器的數據,雖然XML或SOAP通過HTTP連接通常是最流行的。網關應該提供一些API文檔的排序為有史以來的方法是使用。
應用程序開發人員創建一個系統,以處理從網關收到的消息的具體切入點,這就是所謂的應用程序的URL。應用程序的URL映射到專用號碼或短代碼的過程中,從一個網關到另一個變化。一些允許直接通過用戶帳戶界面的配置,如Clickatell做。如果此選項不可用,我們有聯系網關的技術支持資源,並為他們提供與要配置的應用程序的URL。
第2階段 - 短信網關應用服務器
然後應用程序的所有者來決定如何從網關接收數據。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=b2aee337abd962489b123fda9c3480fa
1 <?php
2 $fromNo = $_GET["from"];
3 $toNo = $_GET["to"];
4 $message = $_GET["text"];
5 $msgID = $_GET["moMsgId"];
6
7 // Process the user command and generate output
8 ...
這裡有一個數據作為XML文檔發布的例子。
01
<?xml version="1.0"?>
02
<clickmo>
03
<api_id>xxx</api_id>
04
<moMsgId>fa6ba35b330ce1bc7e2008e5d92d57aa</moMsgId>
05
<from>handset_number_here</from>
06
<to>mo_number_here</to>
07
<timestamp>2007-02-26 14:36:50</timestamp>
08
<text>xxx</text>
09
<charset>ISO-8859-1</charset>
10
<udh></udh>
11
</clickmo>
view source
print?
01
<?php
02
$data = $_POST["data"];
03
04
$xmlDoc = new 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
// Process User Message and Generate Response
17
...
應用程序需要捕獲傳入的數據,使用可用的方法之一,並處理用戶的命令。此代碼在用戶的消息是一個簡單的場景少於160個字符,完美的作品。但會發生什麼事,如果消息是超過160個字符嗎?
假設一家電視台開始一個廣告,用戶可以發送短信廣告。一旦發送短信,用戶將收到一個時間段的廣告將顯示服務器。廣告是純文本將顯示在屏幕的底部。我們還假設我們有預定義的格式發送如下所示的消息。
廣告 運動 題 你的廣告 標題, 您的廣告信息內容
值對出現的消息中的所有內容。廣告將標簽和體育會代表廣告類別的價值。然後,標題是下一個標簽,它的價值將是廣告的標題。消息是最後的標簽,將用戶要在廣告中顯示的內容。
根據標題和消息長度,這條短信可以有超過160個字符。每一個漫長的消息被接收時,網關分割成多個部分的160個字符。但我們仍然必須處理的2件作為一個單一的消息。
如果我們使用前面的代碼例子來解析的消息,第1部分和2相同的消息會被處理為兩個不同的消息。因為這兩個部分沒有完整的命令,應用程序將發送回給用戶的錯誤。UDH的是要解決這個問題。
UDH的是什麼?
UDH組代表用戶數據頭。當我們發送一個漫長的消息,發送設備(移動電話)拆分的消息,並發送它作為單獨的消息。UDH的值將被分配到每個消息部分開始,使接收設備,可以識別他們屬於一個單一的消息和重組
UDH組值較早的場景看起來像這樣:
Part 1 - 05 00 03 CC 02 01
Part 2 - 05 00 03 CC 02 02
最後兩個十六進制值將在UDH的最重要的價值。第二個到最後一個數字是02在上面的代碼和消息定義的零件數量。因此,此消息被分成兩部分。如果三個部分,那麼這個值應該是03,等等。未來的數字定義的消息的一部分。01意味著它是第一部分,02意味著第二部分,等等。
現在,我們有什麼,我們需要知道處理時間延長,被分成多個部分的消息。
01
<?php
02
$fromNo = $_GET["from"];
03
$toNo = $_GET["to"];
04
$message = $_GET["text"];
05
$msgID = $_GET["moMsgId"];
06
$udh = $_GET["udh"];
07
08 $total = 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
// Save the message fragment in database
18
saveMessagePart($db, $from, $message, $udh);
19
}
20
else if ($total != 1) {
21
$prevParts = getMessageParts($db, $from);
22
$message = $prevParts . $message;
23
}
24
25
// process $message
26
...
現在,我們可以處理一個完整的信息和行動上,完成這一階段的請求周期。接下來的兩個階段,如何響應用戶通過網關發送回。
3和第4階段 - 短信網關,網關到用戶的應用服務器
在前一階段,我解釋的過程,從網關接收郵件,在您的應用程序和處理。一旦請求被處理和生成響應,我們需要把它送回來的網關。
一般來說,SMS網關提供一個回調URL為我們傳遞的響應數據。你通常必須提供接收器的數量,發件人的電話號碼,郵件內容,和一些認證信息。確切的參數將根據不同的網關,但他們為Clickatell ,從,文字,和api_id,用戶名,密碼。
01
<?php
02
$message = array(
03
"to" => 942288345,
04
"from" => 944488345,
05
"text" => "sample message",
06
"api_id" => API_KEY,
07
"user" => "myUsername",
08
"password" => "secret"
09
);
10
11
$apiUrl = "http://api.clickatell.com/http/sendmsg?";
12
foreach ($message as $parameter => $value ) {
13
$apiUrl .= $parameter . "=" . urlencode($value) . "&";
14
}
15
$apiUrl = rtrim($apiUrl, "&");
16
17
$ch = curl_init();
18
curl_setopt($ch, CURLOPT_HEADER, 0);
19 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
20
curl_setopt($ch, CURLOPT_URL, $apiUrl);
21
22
curl_exec($ch);
23
curl_close($ch);
上述第一個代碼示例編碼所有使用參數進行urlencode()並把它們添加到API的回調URL。然後,我們初始化卷曲的請求,並調用的URL。現已響應消息發送到網關,結束第3步。
第4步很簡單,我們沒有做任何在這一過程的一部分。網關是正確的順序中的所有消息發送到用戶的移動負責。
總結
我們開始討論雙向SMS消息是本教程中,為什麼它是有用的。然後,我們討論了雙向通訊的過程中,經過4個主要階段。現在,你應該能夠適用於涵蓋與任何特定的SMS網關的概念,並在你的PHP應用程序中實現雙向SMS。