Home >php教程 >php手册 >用PHP实现双向SMS

用PHP实现双向SMS

WBOY
WBOYOriginal
2016-06-13 10:51:501449browse

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
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
  xxx
04
  fa6ba35b330ce1bc7e2008e5d92d57aa
05
  handset_number_here
06
  mo_number_here
07
  2007-02-26 14:36:50
08
  xxx
09
  ISO-8859-1
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。

作者:ssoftware
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn