seasonsolution / phpsmpp
PHPSMPP 是一个功能齐全的 PHP 短信创建、传输和接收类
Requires
- php: >=5.3.3
- ext-mbstring: *
- ext-sockets: *
This package is auto-updated.
Last update: 2024-09-24 05:15:54 UTC
README
本库基于 Onlinecity 开发,并针对 MVC 标准项目进行了改进。
这是一个用于通过 SMPP v3.4 发送或接收短信的简化版 SMPP 客户端库。
除了客户端外,此库还包含一个将 UTF-8 文本转换为 GSM 03.38 编码的编码器,以及一个套接字包装器。套接字包装器在 PHP 的套接字扩展之上提供了连接池、IPv6 和超时监控功能。
此库需要 PHP 的 sockets 扩展,不支持 Windows 系统。也提供了 Windows 兼容版本。
类功能
- 无法以接收器身份连接,尽管 SMPP v.3.4 支持
- SMPP 的 SUBMIT_MULTI 操作,用于向多个收件人发送短信,目前不支持。但可以轻松添加它
- 套接字在 read() 超时后会返回 false(但不包括 readAll 或 write)。您可以使用此功能来实现 enquire_link 策略。如果需要每 30 秒发送一次 enquire_link,请设置 30 秒的超时,并在
$smpp -> read()返回 false 后发送 enquire_link 命令 - 为不支持 HTML 电子邮件的邮件客户端提供多部分/替代电子邮件
- 添加附件,包括内联附件
- 支持 UTF-8 内容和 8bit、base64、binary 和 quoted-printable 编码
- 通过套接字传输使用 Sockets 的 LOGIN 机制进行 SMPP 认证
- 防止头注入攻击
- 与 PHP 5.5 及以上版本兼容
- 命名空间以防止名称冲突
许可证
本软件根据 LGPL 2.1 许可证进行分发,并附带 GPL 合作承诺。请阅读 LICENSE 以了解软件的可用性和分发信息。
安装与加载
PHPSMPP 可在 Packagist 上找到(使用语义版本控制),并通过 Composer 安装 PHPSMPP 是推荐的安装方法。只需将以下行添加到您的 composer.json 文件中
"seasonsolution/phpsmpp": "*.*"
或运行
composer require seasonsolution/phpsmpp
请注意,由 Composer 生成的 vendor 文件夹和 vendor/autoload.php 脚本不是 PHPSMPP 的一部分。
基本使用示例
要发送短信,您可以这样做
<?php // Import PHPSMPP classes into the global namespace // These must be at the top of your script, not inside a function use seasonsolution\phpsmpp\smpplib; use seasonsolution\phpsmpp\smppclient; use seasonsolution\phpsmpp\gsmencoder; use seasonsolution\phpsmpp\sockettransport; //Load Composer's autoloader require 'vendor/autoload.php'; $smpp = new smpplib(); // Server settings $smpp -> host = 'smsc-sim.smscarrier.com'; // Specify main SMPP server $smpp -> port = 2775; // SMPP port to connect to $smpp -> username = 'test'; // SMPP username $smpp -> password = 'test'; // SMPP password $smpp -> timeout = 10000; // By default value, it is optional. $smpp -> debug = true; // Enable verbose debug output // Recipient $smpp -> datacoding = 'SMPP Test'; $smpp -> numberTo = '+15417543010'; // Content $smpp -> message = 'H€llo world, this is my sms message.'; $smsConfirm = $smpp -> send(); // Code to confirmation sent sms // Print a SMS confirm sent echo $smsConfirm;
要接收短信(或投递回执)
<?php // Import PHPSMPP classes into the global namespace // These must be at the top of your script, not inside a function use seasonsolution\phpsmpp\smpplib; use seasonsolution\phpsmpp\smppclient; use seasonsolution\phpsmpp\sockettransport; //Load Composer's autoloader require 'vendor/autoload.php'; $smpp = new smpplib(); // Server settings $smpp -> host = 'smsc-sim.smscarrier.com'; // Specify main SMPP server $smpp -> port = 2775; // SMPP port to connect to $smpp -> username = 'test'; // SMPP username $smpp -> password = 'test'; // SMPP password $smpp -> timeoutReceive = 60000; // By default value, it is optional. $smpp -> debug = true; // Enable verbose debug output // Read SMS and output $sms = $smpp -> read();
连接池
您可以指定一个连接列表,让 SocketTransport 依次或随机尝试每个连接。如果您提供一个具有多个 A/AAAA 记录的主机名,它将尝试每个记录。如果想要监控 DNS 查询,请在构造传输之前将 defaultDebug 设置为 true。
(可配置的)发送超时控制它将等待每个服务器超时的时间。尝试长列表的服务器可能需要很长时间,这取决于超时时间。您可以在连接尝试之前和之后更改超时。
传输支持 IPv6,并在可用时优先使用 IPv6 地址。您可以通过设置 forceIpv6 或 forceIpv4 来修改此功能,以强制仅使用 IPv6 或 IPv4。
除了DNS查询外,它还会使用gethostbyname()查找本地IPv4地址,因此“localhost”对IPv4有效。对于IPv6,localhost指定为“::1”。
常见问题解答(F.A.Q)
我可以用这个从我的网站发送消息吗?
不行。PHP处理完网站上的请求后,会关闭所有连接。大多数SMPP提供商不希望您打开和关闭连接,您应该保持它们活跃并定期发送enquire_link命令。这意味着您可能需要一个长期运行的过程,例如使用进程控制函数,并实现一种队列系统,您可以从网站推送。这需要服务器的shell级别访问和Unix进程的知识。
我如何接收投递回执或短信?
要接收投递回执或短信,您必须连接一个接收器,而不仅仅是发送器。这个接收器必须等待投递回执到达,这意味着您可能需要使用进程控制函数。
我们在php-smpp-worker有一个开源实现,您可以从中获得灵感,但我们无法帮助您创建自己的。也许您应该调查您的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服务提供商不支持消息字段以空字符终止。关于这个问题规范并不明确,所以有一个切换选项。将SmppClient::$sms_null_terminate_octetstrings = false;设置为false,然后再次尝试。
"绑定失败"是什么意思?
这通常意味着您的SMPP服务提供商拒绝了您的登录凭据,即您的用户名或密码。
我可以在没有SMPP服务器的情况下测试客户端库吗?
SMSCarrier提供了一项在线服务以测试发送短信。使用此服务在您的应用程序上测试,请参阅SMSCarrier。
这里没有提到我的问题,我该怎么办?
请获取完整的调试信息,并在GitHub上创建一个问题。确保不要包括绑定发送器调用中的发送PDU十六进制代码,因为它将包含您的用户名和密码。其他十六进制输出是正常的,并且非常受欢迎。任何PHP警告或通知也可能很重要。请包括您连接到的SMPP服务器信息以及任何具体细节。
贡献
请将错误报告、建议和拉取请求提交到GitHub问题跟踪器。
我们正在努力实现调试器的翻译以及自动验证手机号码。
我们特别感兴趣于修复边缘情况,扩大测试覆盖率。
如果您在文档中发现了错误或想要添加内容,请继续修改wiki - 任何人都可以编辑它。
如果您从转移到PHPSMPP GitHub组织之前克隆了git,您需要使用以下命令在您的克隆中更新任何引用旧GitHub位置的远程URL
git remote set-url upstream https://github.com/seasonsolution/phpsmpp.git