terox/php-smpp

此软件包已被弃用且不再维护。未建议替代软件包。

PHP SMPP 客户端库

1.1.1 2017-04-08 12:39 UTC

This package is not auto-updated.

Last update: 2022-02-01 13:04:14 UTC


README

这是一个简化版的 SMPP 客户端库,用于通过 SMPP v3.4 发送或接收短信。

除了客户端,此库还包含一个将 UTF-8 文本转换为 GSM 03.38 编码的编码器,以及一个套接字包装器。套接字包装器在 PHP 的套接字扩展之上提供了连接池、IPv6 和超时监控功能。

此库需要 sockets PHP 扩展,不支持 Windows。还有一个兼容 Windows 的版本:windows-compatible

安装

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 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。使用此功能来重定向调试信息。

F.A.Q.

我无法发送超过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地址,但我仍然收到'Could not connect to any of the specified hosts'错误?
这可能是一个阻止您连接的防火墙问题,或者完全是其他问题。请确保启用并显示调试输出。如果您看到类似于'Socket connect to 1.2.3.4:2775 failed; Operation timed out'的信息,这意味着无法建立连接。如果不是防火墙问题,您可以尝试增加连接超时。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上打开一个问题。请确保不要包括绑定发送者的发送PDU十六进制代码,因为它将包含您的用户名和密码。其他十六进制输出是可以的,并且非常受欢迎。任何PHP警告或通知也可能很重要。请包括您连接的SMPP服务器信息以及任何具体细节。