markovesic / php-smpp
基于PHP的SMPP客户端库
Requires
- php: >=5.3.3
- ext-mbstring: *
- ext-sockets: *
This package is auto-updated.
Last update: 2024-09-14 07:40:15 UTC
README
这是一个用于通过SMPP v3.4发送或接收短信的简化SMPP客户端库。
除了客户端,这个库还包含一个将UTF-8文本转换为GSM 03.38编码的编码器,以及一个套接字封装器。套接字封装器在PHP的套接字扩展之上提供了连接池、IPv6和超时监控功能。
这个库与其第一个版本相比变化很大,那个版本需要命名空间并包含一些工作组件。您可以在1.0.1-namespaced中找到那个版本。
这个库需要sockets PHP扩展,并且不支持Windows。还有一个Windows兼容版本。
基本用法示例
要发送短信,您可以这样做
<?php require_once 'smppclient.class.php'; require_once 'gsmencoder.class.php'; require_once 'sockettransport.class.php'; // Construct transport and client $transport = new SocketTransport(array('smpp.provider.com'),2775); $transport->setRecvTimeout(10000); $smpp = new SmppClient($transport); // Activate binary hex-output of server interaction $smpp->debug = true; $transport->debug = true; // Open the connection $transport->open(); $smpp->bindTransmitter("USERNAME","PASSWORD"); // Optional connection specific overrides //SmppClient::$sms_null_terminate_octetstrings = false; //SmppClient::$csms_method = SmppClient::CSMS_PAYLOAD; //SmppClient::$sms_registered_delivery_flag = SMPP::REG_DELIVERY_SMSC_BOTH; // Prepare message $message = 'H€llo world'; $encodedMessage = GsmEncoder::utf8_to_gsm0338($message); $from = new SmppAddress('SMPP Test',SMPP::TON_ALPHANUMERIC); $to = new SmppAddress(4512345678,SMPP::TON_INTERNATIONAL,SMPP::NPI_E164); // Send $smpp->sendSMS($from,$to,$encodedMessage,$tags); // Close connection $smpp->close();
要接收短信(或投递回执)
<?php require_once 'smppclient.class.php'; require_once 'sockettransport.class.php'; // Construct transport and client $transport = new SocketTransport(array('smpp.provider.com'),3600); $transport->setRecvTimeout(60000); // for this example wait up to 60 seconds for data $smpp = new SmppClient($transport); // Activate binary hex-output of server interaction $smpp->debug = true; $transport->debug = true; // Open the connection $transport->open(); $smpp->bindReceiver("USERNAME","PASSWORD"); // Read SMS and output $sms = $smpp->readSMS(); echo "SMS:\n"; var_dump($sms); // Close connection $smpp->close();
连接池
您可以指定一系列连接,让SocketTransport依次或随机尝试每个连接。如果您提供了一个具有多个A/AAAA记录的主机名,它也会尝试每个记录。如果您想监控DNS查找,请在构造传输之前将defaultDebug设置为true。
(可配置的)发送超时控制了它将等待每个服务器超时多长时间。尝试长长的服务器列表可能需要很长时间,这取决于超时时间。您可以在连接尝试之前和之后更改超时时间。
传输支持IPv6,并且当可用时会优先使用IPv6地址。您可以通过设置forceIpv6或forceIpv4来修改此功能,使其仅使用IPv6或IPv4。
除了DNS查找,它还会使用gethostbyname()查找本地IPv4地址,因此"localhost"适用于IPv4。对于IPv6 localhost,指定"::1"。
实现说明
- 您不能以接收器的身份连接,尽管SMPP v.3.4支持这样做
- SMPP的SUBMIT_MULTI操作,它将短信发送到一组接收者,目前不支持。您可以轻松地添加它。
- 套接字在read()(但不包括readAll或write)超时时会返回false。您可以使用此功能来实现enquire_link策略。如果您需要每30秒发送一次enquire_link,则将超时设置为30秒,并在readSMS()返回false后发送enquire_link命令。
- 上面的示例假设SMSC默认数据编码为GSM 03.38。
- 如果您想获取投递回执,请记得激活已注册的投递(设置为SMPP::REG_DELIVERY_SMSC_BOTH / 0x01)。
- SmppClient和传输组件都支持一个调试回调,默认为error_log。使用此功能来重定向调试信息。
常见问题解答
我可以用这个从我的网站发送消息吗?
不单独使用。在PHP处理网站上的请求后,它会关闭所有连接。大多数SMPP提供商不希望您打开和关闭连接,您应该保持它们处于活跃状态,并定期发送enquire_link命令。这意味着您可能需要获取某种长运行进程,例如,使用进程控制函数,并实现一种队列系统,您可以从网站推送。这需要服务器级别的shell访问权限,以及了解Unix进程。
我如何接收投递回执或短信?
要接收投递回执或短信,您必须连接一个接收器,除了发射器。该接收器必须等待投递回执到达,这意味着您可能需要使用进程控制函数。
我们有一个开源实现,您可以从中获得灵感,但无法帮助您创建自己的实现。也许您应该考虑您的SMSC提供商是否可以为您提供基于HTTP的API或使用如kannel的现成软件,该项目仅提供协议实现和基本的套接字封装。
我无法发送超过160个字符。
有三种内置方法发送连接短信(csms):CSMS_16BIT_TAGS、CSMS_PAYLOAD、CSMS_8BIT_UDH。CSMS_16BIT_TAGS是默认选项,如果不起作用,请尝试另一个。
这个库与PHP 5.2.x兼容吗?
它在PHP 5.3上进行了测试,但已知与5.2也兼容。
它能在Windows上运行吗?
它需要套接字扩展,该扩展在Windows上可用,但并不完整。请使用兼容Windows的版本,它使用fsockopen和流函数。
为什么我没有看到任何调试输出?
请记住为SocketTransport和SmppClient实现一个调试回调。否则,它们默认使用error_log,它可能或可能不会打印到屏幕。
为什么我会收到'res_nsend()失败'或'无法连接到指定的任何主机'的错误?
您的提供商的DNS服务器可能存在IPv6地址(AAAA记录)的问题。尝试设置SocketTransport::$forceIpv4=true;
。您还可以尝试指定IP地址(或IP地址列表)。在构造传输之前设置SocketTransport:$defaultDebug=true;
也有助于解决连接问题。
我尝试了强制使用IPv4和/或指定IP地址,但我仍然收到'无法连接到指定的任何主机'?
这可能是防火墙阻止了您的连接,或者完全是其他问题。确保已启用并显示调试输出。如果您看到类似'Socket连接到1.2.3.4:2775失败;超时'的消息,这意味着无法建立连接。如果不是防火墙问题,您可以尝试增加连接超时。sendTimeout也指定了连接超时,调用$transport->setSendTimeout(10000);
设置10秒超时。
为什么我会收到'Failed to read reply to command: 0x4'、'Message Length is invalid'或'Error in optional part'错误?
最有可能的是您的SMPP提供商不支持以NULL终止的消息字段。规范对此问题不明确,因此存在一个切换。设置SmppClient::$sms_null_terminate_octetstrings = false;
并再次尝试。
'绑定失败'是什么意思?
通常这意味着您的SMPP提供商拒绝了您的登录凭证,即您的用户名或密码。
我可以在没有SMPP服务器的情况下测试客户端库吗?
许多服务提供商可以为您提供演示账户,您还可以使用 logica opensmpp 模拟器(Java)或 smsforum 客户端测试工具(Linux 可执行文件)。除了对多个现实生活中的 SMPP 服务器进行测试外,这个库还对这些模拟器进行了测试。
这里没有提到我的问题,我该怎么办?
请获取完整的调试信息,并在 GitHub 上创建一个问题。请确保不要包含 BindTransmitter 调用的发送 PDU 的十六进制代码,因为它将包含您的用户名和密码。其他十六进制输出是可接受的,并且非常受欢迎。任何 PHP 警告或通知也可能很重要。请包括您连接的 SMPP 服务器信息以及任何具体细节。