我只想用 PHP 从我的 Web 应用程序发送 SMS。谁能告诉我该怎么做?我需要为此做些什么?
17 回答
我不知道这是否适用于您,但我多次为自己省钱的做法是在用户的个人资料中询问他的运营商是什么,然后尝试将其与this list
. 从本质上讲,许多/大多数运营商都有一个连接到电话号码的电子邮件地址,您可以轻松地向该号码发送文本。例如,如果您有 ATT 并且您的电话号码是 786-262-8344,则发送至 7682628344@txt.att.net 的电子邮件将免费向您发送包含电子邮件主题/正文的短信。这项技术几乎可以免费覆盖您的所有美国用户。显然,根据您的应用程序的需要,这可能是不可能/足够/不希望的,但这是一个需要注意的选项。
您发送 SMS 消息的主要选项是使用现有的 SMS 提供商。根据我的经验(这在 SMS 消息传递 Web 应用程序中很广泛),您经常会发现与不同的提供商进行谈判是为您的应用程序获得最佳交易的最佳方式。
不同的提供商通常提供不同的服务和不同的功能。我最喜欢的供应商,事实上,过去曾愉快地与我协商降低费率的供应商是 TM4B ( http://www.tm4b.com )。这些家伙价格优惠,覆盖全球大部分地区,并拥有出色的客户服务。
下面是从我的一个实时 Web 应用程序中提取的一些代码(以及一些被混淆的部分),用于通过他们的 API 发送一条简单的消息:
require_once("tm4b.lib.php");
$smsEngine = new tm4b();
// Prepare the array for sending
$smsRequest["username"] = "YOURUNAME";
$smsRequest["password"] = "YOURPWORD";
$smsRequest["to"] = "+441234554443";
$smsRequest["from"] = "ME!";
$smsRequest["msg"] = "Hello, test message!";
// Do the actual sending
$smsResult = $smsEngine->ClientAPI($smsRequest);
// Check the result
if( $smsResult['status'] == "ok" ) {
print "Message sent!";
} else {
print "Message not sent.";
}
我过去使用过的许多其他提供商都有非常相似的界面,而且在定价方面都非常具有竞争力。您只需四处寻找适合您需求的提供商。
在成本方面,大多数西方国家的价格从几便士/美分不等(不过,大多数第三世界国家的价格略高,所以要小心)。如果您想从他们那里获得体面的价格,您将不得不批量支付大多数供应商,但他们通常会与您协商“比平常少”的批次。大多数提供商确实提供后付费选项,但只有当您成功完成与他们的一些交易时......其他人从一开始就提供它,但价格过高。
只发送,但便宜又容易
最简单的方法肯定是使用上面提到的@Paolo Bergantino的电子邮件黑客。要求您的用户输入他们的电话号码并从列表中选择他们的运营商很容易。一旦获得用户信息,在任何开发平台上都可以轻松发送电子邮件。
但是,我发现这种方法有两个非常重要的限制:
- 首先是蜂窝运营商都将通过其电子邮件网关发送的 SMS 消息优先于其他 SMS 流量。可能是因为发件人没有为他们支付这些费用。如果最小化延迟对您很重要,请不要使用此方法。
- 第二,尤其是在这个手机号码发达的现代时代,用户会时不时更换运营商,几乎肯定会忘记告诉你。如果您需要在一两年后可靠地将 SMS 消息传递给相同的人,那么这种方法将开始失败。
以便宜的价格发送和接收
如果您尝试将站点设置为在预算范围内发送和接收SMS 消息,则可以使用TextMarks等服务。TextMarks 允许您为您的服务选择一个关键字,该关键字允许用户通过 TextMarks 的共享短代码 41411 将消息路由给您。这里的问题是他们在每条消息中保留 20 个字符用于短广告以支付他们的服务费用。
专业品质
如果您需要低延迟、高可靠性和无广告,那么您几乎必须通过 SMS 聚合器,除非您足够大,可以单独与每个运营商协商。
我发现 SMS 聚合器需要注意的最重要的事情是,它们中的许多实际上是作为营销公司而不是应用程序托管商设立的——他们并不真正理解将 SMS 作为用户可以与之交互的渠道服务供应商。我发现使用短语“你的活动”而不是“你的应用程序”的聚合器是最严重的违规者。远离他们,并找到一个了解您作为应用程序开发人员需求的聚合器。
Twilio最近发布了一个 API 来发送SMS 消息。api 比较简单,基本的REST 接口来发送 SMS和一个post 返回文档来响应。
嗨,我的名字是 Jarod,我在 Twilio.com 工作,所以我有点偏见。但是话虽如此,使用Twilio REST API从您的 PHP Web 应用程序发送 SMS 非常容易。这是一个简单的例子:
<?php
// Get the PHP helper library from twilio.com/docs/php/install
require_once('/path/to/twilio-php/Services/Twilio.php'); // Loads the library
// Your Account Sid and Auth Token from twilio.com/user/account
$sid = "{{ account_sid }}";
$token = "{{ auth_token }}";
$client = new Services_Twilio($sid, $token);
$client->account->messages->sendMessage("+14158141829", "+14159352345", "Hi Shyju, Sorry it took me so long to get back to you. <3 The Internet.");
为此,我们使用了一个名为TextAnywhere的商业解决方案。
只需支付少量费用(每条 SMS 几便士),它们就可以为您提供 Web 服务(以及用于 .NET、ASP、Java、C++ 等的 API)。这很容易而且很有效,尽管它不是免费的。
在最基本的情况下,它就像使用 QueryString 中的数字和消息文本发出 URL 请求一样简单,其余的由他们的服务器为您完成。
如果你认识承运人,你就是黄金。大多数都有电子邮件网关。如果没有,您可以使用 Clickatell API,每条消息的费用约为 0.04 美元。我现在正在研究一种黑客攻击,您可以在其中使用 GSM 调制解调器和您的个人手机计划以及无限短信。如果有效,这可以节省很多钱。
如果您愿意投资安卓智能手机,您可以设置自己的 SMS 网关,最终价格会更便宜。
我使用SMS GATEWAY ME这是一个免费的 Android 应用程序,您可以发送这样的消息:
$URL = "http://v2.smsgateway.me/API/Send/Single.php";
$postdata = http_build_query(
array(
'Username' => "foo@bar.co.uk",
'Password' => "password",
'Number' => "+447791064782",
'Message' => "Hello World!",
)
);
$opts = array('http' => array('method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata));
$context = stream_context_create($opts);
$result = file_get_contents($URL, false, $context);
他们网站上有一个文档告诉您如何接受传入的消息。
如果您需要一种可靠的方式来发送多条 SMS,您应该寻找充当 Web 到 SMS 网关的 SMS 服务提供商。在这种情况下,将有一个基于 http 的界面,允许您通过调用 URL 并将收件人和消息作为参数传递来发送 SMS。
dktext 不仅允许您向请求的客户发送 bult 文本消息,而且很快将提供谷歌语音集成以使用与您的谷歌语音帐户相同的系统
要从 Web 应用程序发送 SMS,您需要将应用程序连接到 SMS Gateway。大多数 SMS 网关提供可用于执行此操作的外部 API。他们通常有文档,您可以使用这些文档来了解如何将 SMS 通知集成到您的 PHP 代码中。不幸的是,没有可靠的免费短信服务提供,因此您必须为此短信服务付费。您可以查看http://www.phpjabbers.com/web-sms/这似乎很容易。他们的集成代码非常简单:
<?php
$SMSLIB["phone"] = '44111222333'; // your phone number
$SMSLIB["key"] = 'abcdefghijklmnopqrs'; // your personal API code
include("smslib.php"); // we will provide you with smslib.php file
sendSMS("test message", $SMSLIB["phone"]); // function which sends the message
?>
我最近不得不在我们的网站上实现用户发起的短信功能,并发现 www.dotgo.com 服务很有帮助。它是免费的......看起来它是由几个博士创建的,作为一种无状态的消息传递框架(想想 http 请求 - 响应模型)。
为了让它工作,你设置了一个“index.crml”文件(类似于 index.html、php 等)。我们的看起来像这样(抱歉,所有这些都放在一行中......在其他情况下显示有些问题):
<?xml version="1.0" encoding="UTF-8"?><cmrl xmlns:dotgo="http://dotgo.com/cmrl/1.0"><match pattern="*"><engine href="http://www.bulbstorm.com/sms/flashbulb.php"/></match></cmrl>
在我们的网站上,索引文件依次引用 /sms/flashbulb.php 文件,该文件(不包括打开和关闭 php 标记)如下所示:
$wordArray = explode(' ',$_REQUEST['sys_argument']);
$username = strip_tags($wordArray[0]);
$messageBody = str_replace($username.' ', '', $_REQUEST['sys_argument']);
require_once 'Database.php';
$dbh = new Database('bulbstorm');
$args = array($username, $messageBody);
$dbh->execMysqlProc('uspAddFlashbulb', $args);
print "<message><content>Bulb received and saved to your account</content></message>";
无论如何,我只包含代码以说明框架如何运行以及编写多少代码来获得功能。
有一些限制。最重要的是一切都是用户发起的。因此,如果您主要希望发送的传出消息之前没有您的用户向您的站点发送消息以“获取”响应消息,那么它可能不是您想要的。为我们正在做的事情工作。其中一位创始人甚至亲自回复了一个电子邮件问题,并且非常有帮助。
我们尚未使用但考虑过的功能之一是他们的订阅功能......用户可以在其中进行设置,以便 dotgo 系统定期轮询您网站上的页面,根据计划用户指定。再说一次,我没有走那么远,但认为它很有趣。
基本上,每个运营商都有一个电子邮件网关,您需要向其发送电子邮件。您需要提前了解运营商,以便知道发送 SMS 消息的电子邮件地址。
function sendSMS($number,$message) {
$request = message api link;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
return split(',',$response);
}
使用多网关解决方案是个好主意。我已经为我的目的创建了一个,但我认为它可能对任何想要轻松设置的人有用:https ://packagist.org/packages/orajo/sms-zilla
$smsSender = new SmsZilla\SmsSender(new SmsZilla\Adapter\MockAdapter());
$smsSender->setRecipient('605123456');
// adding more recipients (with and without country code)
$smsSender->setRecipient(['511654321', '48511654987', '+41751654987']);
$smsSender->setText("Message text");
$result = $smsSender->send();
目前这个库支持 5 个提供者,第 6 个正在开发中,其他的正在计划中。
但是,基本上,发送单个短信就像发送 HTTP POST 请求一样简单:
curl -X "POST" https://api.wavecell.com/sms/v1/amazing_hq/single \
-u amazing:1234512345 \
-H "Content-Type: application/json" \
-d $'{ "source": "AmazingDev", "destination": "+6512345678", "text": "Hello, World!" }'
amazing
您的帐户在哪里1234512345
- 密码(使用更强的密码!)并且amazing_hq
是您的子帐户。
有关在 PHP 中发送 HTTP 请求的详细信息包含在以下问题中:
我认为,这是这个主题中最古老的问题。主要回答- 付费网关的广告。但还有另一种方式 - 来自安卓设备(SIM 卡)、安卓网关的短信。我用简单的 API 创建了一个免费的开源应用程序:https ://github.com/pavelakafoks/SmsTransmitter Google play:https ://play.google.com/store/apps/details?id=info.ininfo.smstransmitter 你可以将我的应用程序用于您的网站或根据我的来源构建您自己的 android 应用程序。它比互联网短信网关更便宜。我希望它对某人有用。