ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Symfony Notifier 集成 LightSms:DSN 配置、短信发送原理与签名机制实战指南

Symfony Notifier 集成 LightSms:DSN 配置、短信发送原理与签名机制实战指南 后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载本篇指南以 Symfony 官方仓库中 LightSms Notifier Bridge 的 README 为骨架系统讲解如何在 Symfony Notifier 中接入 LightSms 短信服务。文章会覆盖 DSN 的完整写法与参数含义、传输层的请求构造、签名算法、错误码对照以及测试验证方式读者读完可以独立配置并在项目中发送带签名的 LightSms 短信。一、LightSms Bridge 是什么LightSms 是立陶宛的一家短信网关服务商提供国际短信发送能力。Symfony 官方在src/Symfony/Component/Notifier/Bridge/LightSms/目录下维护了一个 Notifier Bridge把 LightSms 的 HTTP 发送接口封装为 Symfony Notifier 的标准传输层Transport。该 Bridge 的核心组成非常精简LightSmsTransport.php传输实现负责构造请求、生成签名、解析响应LightSmsTransportFactory.php传输工厂负责从 DSN 解析出登录名、Token、发送方号码等参数Tests/LightSmsTransportTest.php 与 Tests/LightSmsTransportFactoryTest.php对传输层与工厂层的单元测试。从 composer.json 可以看到该包名为symfony/light-sms-notifier类型为symfony-notifier-bridge运行要求 PHP 8.4.1依赖symfony/http-client^7.4|^8.0与symfony/notifier^8.2。根据 CHANGELOG.md 的记录该 Bridge 自 Symfony 5.3 引入6.2 起支持使用SmsMessage-from覆盖默认发送方8.2 起新增sslDSN 选项。二、DSN 配置完整写法与参数说明原文档给出的 DSN 示例为LIGHTSMS_DSNlightsms://LOGIN:TOKENdefault?fromPHONE其中三个关键占位符的含义如下占位符含义说明LOGINLightSms 账户登录名在 LightSms 账户的客户端 API 页面可见TOKEN账户 Token同样显示在账户信息中用于请求签名PHONELightSms 发送方手机号需为已在 LightSms 注册并审核通过的发送号码sender账户信息在 LightSms 官网的客户端 API 栏目路径/external/client/api/中查看。2.1 各组成部分的解析逻辑结合 LightSmsTransportFactory::create() 的源码DSN 的解析规则如下scheme必须是lightsms否则工厂会抛出UnsupportedSchemeException用户信息部分拆分为LOGIN与TOKENlogin来自 DSN 的 user 段token来自 password 段from是必填选项通过$dsn-getRequiredOption(from)读取缺失时 DSN 解析失败测试中的unsupportedSchemeProvider明确覆盖了“缺少 from”的情况host为default时会被视为空值最终回落为传输类内置的默认主机www.lightsms.com见LightSmsTransport::HOST常量其他值可自定义网关主机port与ssl为可选配置ssl选项通过基类 AbstractTransportFactory::getSsl() 解析为布尔值用于控制走 HTTPS 还是明文 HTTP。2.2 在框架项目中使用在基于 Symfony Framework 的项目中将 DSN 写入环境变量文件.envLIGHTSMS_DSNlightsms://my_login:my_tokendefault?from8613800138000Notifier 组件会通过TransportFactoryInterface机制自动识别lightsmsscheme 并实例化对应传输。从工厂测试 LightSmsTransportFactoryTest.php 可以看出lightsms://login:tokendefault?from37061234567会被判定为受支持的 DSN而其他 scheme如somethingElse://...则被拒绝。三、发送短信从 SmsMessage 到网关请求LightSms 传输层只接受SmsMessage类型的消息。在 LightSmsTransport::supports() 中只对SmsMessage返回true若向该传输传入ChatMessage等其它消息类型doSend()会抛出UnsupportedMessageTypeException——这一点在测试的supportedMessagesProvider/unsupportedMessagesProvider中均有覆盖。3.1 构造 SmsMessageuse Symfony\Component\Notifier\Message\SmsMessage; $sms new SmsMessage(37061234567, Hello from Symfony Notifier!); // 可选指定发送方号码覆盖 DSN 中的 from $sms-from(37061234567);从 SmsMessage 的构造函数可以看到其参数依次为phone、subject、from与options其中from默认为空字符串。传输层在发送时遵循 CHANGELOG 6.2 引入的规则若SmsMessage已设置from则优先使用消息自身的发送方否则回落为 DSN 中的from见 doSend() 中的 sender 取值。3.2 底层请求的构造doSend()是真正的发送逻辑位于 LightSmsTransport.php。发送过程可以归纳为四步组装请求数据包含login、phone、sender、text与timestamp。其中phone会经过escapePhoneNumber()处理把国际号码中的前缀替换为00例如37061234567变为0037061234567这是 LightSms 网关对国际号码的格式要求text取自SmsMessage的 subject。生成签名调用generateSignature()计算 MD5 签名见下文。发起 HTTP 请求请求端点格式为{scheme}://{host}/external/get/send.php使用 HTTP GET 方法上述数据全部放在 query 字符串中。校验并解析响应网络异常或非 200 状态码都会抛出TransportException响应 JSON 中携带错误码只有错误码为 0 才视为成功。3.3 签名算法核心机制LightSms 要求每次请求附带signature参数用于服务端校验请求合法性。签名生成逻辑位于 generateSignature()对除signature外的全部请求参数按键名做ksort升序排序取出所有值并按排序顺序拼接成一个连续字符串在该字符串末尾追加账户 Token即 DSN 中的TOKEN对最终字符串计算md5结果即为签名值。正因为签名覆盖了timestamp当前 Unix 时间戳请求具备时效性Token 泄露后也无法被无限重放。发送方号码、文本内容、接收号码等任一字段变化都会导致签名不同。四、响应解析与错误码请求发送后传输层将响应解析为数组并按下述优先级提取错误码doSend() 中第 126 行顶层error字段空键下的error字段以接收号码$phone为键的分组中的error字段。错误码为0表示发送成功此时会构造SentMessage并在响应中存在id_sms字段时把该值设置为消息 ID便于后续对账查询。错误码非 0 时抛出TransportException并附带人类可读的错误说明。LightSmsTransport 中定义了完整的错误码映射表常见的包括错误码含义1Missing Signature缺少签名4Phone number not specified未指定手机号6Invalid signature签名无效7Invalid login登录名无效9Sender name not registered发送方未注册10Sender name not approved发送方未审核通过11There are forbidden words in the text文本含禁用词12Error in SMS sending短信发送出错13Phone number is in the blacklist号码在黑名单14More than 50 numbers in the request单次请求超过 50 个号码16Invalid phone number手机号无效32 / 35Not enough money余额不足999Unknown Error未知错误未知错误码统一映射为999对应的 “Unknown Error” 文案。五、测试与验证该 Bridge 自带两层单元测试是理解其行为契约的捷径LightSmsTransportTest.php 验证默认传输的字符串表示为lightsms://www.lightsms.com?fromfrom仅支持SmsMessage拒绝ChatMessage与DummyMessage。LightSmsTransportFactoryTest.php 验证合法 DSN 可成功创建传输lightsms之外的 scheme 不受支持缺少登录名或 Token 的 DSN 会被判定为不完整IncompleteDsnException。这些测试也提示了集成排错的方向若工厂层报错优先检查 DSN 是否完整LOGIN:TOKEN与from若传输层报错则对照错误码表检查签名、发送方审核状态或余额。六、小结与排错清单接入 LightSms Notifier Bridge 的完整路径是composer require symfony/light-sms-notifier对应 composer.json 中的包名→ 在环境变量中配置LIGHTSMS_DSN→ 构造SmsMessage并通过 Notifier 发送。常见排错清单签名无效错误码 6确认 DSN 中的TOKEN与账户实际 Token 完全一致注意签名算法要求参数先排序再拼接发送方未审核错误码 10确认 DSN 的from号码已在 LightSms 完成注册与审核或改用SmsMessage::from()指定已审核号码手机号无效错误码 16确认号码格式传输层会自动把转成00号码本身需符合国际格式明文 HTTP非 8.2 的默认行为默认走 HTTPS如需明文请求可显式配置ssl0该选项自 Symfony 8.2 起支持见 CHANGELOG.md。对传输层更深入的实现细节可直接阅读 LightSmsTransport.php 与 LightSmsTransportFactory.php两份文件合计不足两百行是学习 Symfony Notifier 自定义传输桥接的最佳样例之一。赞分享后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载相关推荐QuickRecorder 教程5 分钟用好这款不足 10MB 的 macOS 录屏工具免虚拟声卡内录系统音QuickRecorder 教程5 分钟用好这款不足 10MB 的 macOS 录屏工具免虚拟声卡内录系统音 QuickRecorder 是一款轻量 mac后端Web框架Dagger TypeScript SDK 中 FunctionCallArgValueID 类型别名解析对象唯一标识符的声明与实现Dagger TypeScript SDK 中 FunctionCallArgValueID 类型别名解析对象唯一标识符的声明与实现 FunctionCall后端Web框架Symfony Notifier 集成 BandwidthDSN 配置、SmsMessage 发送与 BandwidthOptions 完整实战指南Symfony Notifier 集成 BandwidthDSN 配置、SmsMessage 发送与 BandwidthOptions 完整实战指南 Symf后端Web框架上一篇ProxyPin自定义请求头模拟不同客户端环境的测试方法下一篇SpaceX-API后端日志最佳实践结构化日志与日志级别创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表