its / php-smpp
PHP SMPP 客户端库
Requires
- php: >=5.3.0
- ext-sockets: *
This package is not auto-updated.
Last update: 2024-09-28 15:03:45 UTC
README
这是一个简化的 SMPP 客户端库,用于通过 SMPP v3.4 发送或接收短信。
除了客户端,这个库还包含一个将 UTF-8 文本转换为 GSM 03.38 编码的编码器,以及一个套接字包装器。套接字包装器在 PHP 的套接字扩展之上提供了连接池、IPv6 和超时监控功能。
这个库需要 PHP 的 套接字 扩展,并且不支持 Windows 系统。还有一个兼容 Windows 的版本可供使用。
安装
php composer.phar require its/php-smpp:dev-master
基本使用示例
要发送短信,可以这样做
<?php require_once 'vendor/autoload.php'; use OnlineCity\Transport\SocketTransport; use OnlineCity\SMPP\SMPP; use OnlineCity\SMPP\SmppClient; use OnlineCity\SMPP\SmppAddress; use OnlineCity\Encoder\GsmEncoder; // 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 本地主机,请指定 "::1"。
实现说明
- 您不能以收发器身份连接,尽管 SMPP v.3.4 支持此操作。
- SMPP 的 SUBMIT_MULTI 操作,即向多个接收者发送短信,目前不受支持。您可以轻松地添加它。
- 套接字在 read() 超时时会返回 false(但不包括 readAll 或 write)。您可以使用此功能实现 enquire_link 策略。如果您需要每 30 秒发送一次 enquire_link,请将超时设置为 30 秒,并在 readSMS() 返回 false 后发送 enquire_link 命令。
- 上面的示例假设 SMSC 默认数据编码为 GSM 03.38。
- 如果您想获得投递回执,请记得激活已注册的投递(设置为 SMPP::REG_DELIVERY_SMSC_BOTH / 0x01)。
- SmppClient 和传输组件都支持一个调试回调,默认为 error_log 。使用此功能重定向调试信息。
常见问题解答
我无法发送超过 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秒超时。
为什么我会得到'读取命令回复失败:0x4'、'消息长度无效'或'可选部分错误'错误?
很可能是您的SMPP提供商不支持以NULL终止消息字段。关于这个问题规范不明确,所以有一个开关。设置SmppClient::$sms_null_terminate_octetstrings = false;并再次尝试。
'绑定失败'是什么意思?
这通常意味着您的SMPP提供商拒绝您的登录凭据,即您的用户名或密码。
我可以在没有SMPP服务器的情况下测试客户端库吗?
许多服务提供商可以为您提供演示账户,但您也可以使用logica opensmpp模拟器(java)或smsforum客户端测试工具(Linux可执行文件)。除了与多个真实SMPP服务器进行测试外,此库还对这些模拟器进行了测试。
我遇到了这里没有提到的其他问题,我该怎么办?
请获取完整的调试信息,并在GitHub上创建一个问题。请确保不要包含绑定发送器的发送PDU十六进制代码,因为它将包含您的用户名和密码。其他十六进制输出是可接受的,并且非常受欢迎。任何PHP警告或通知也可能很重要。请包括您连接到的SMPP服务器信息以及任何具体细节。