yoqut/smpp

基于PHP的SMPP客户端库

该软件包的官方仓库似乎已消失,因此软件包已被冻结。

v1.1 2015-01-26 10:59 UTC

This package is not auto-updated.

Last update: 2020-02-25 11:29:48 UTC


README

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

除了客户端,这个库还包含一个编码器,用于将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()超时时将返回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。使用此功能重定向调试信息。

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() failed'或'Could not connect to any of the specified hosts'错误?
您的提供商的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上创建一个新问题。请确保不要包括 BindTransmitter 调用的发送 PDU十六进制代码,因为它将包含您的用户名和密码。其他十六进制输出是可以的,并且非常感谢。任何PHP警告或通知也可能很重要。请包括您连接到的SMPP服务器信息以及任何具体细节。