用PHP实现双向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
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
02
03
04
05
06
07
08
09
10
11
view source
print?
01
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
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
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。
上一篇: 把一篇Word文章中所有的邮箱地址提取出来如何批量处理
下一篇: mysqldump使用惯用参数说明