ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Symfony SMSBOX Notifier Bridge 实战指南:从 DSN 配置、消息选项到 Webhook 回执解析

Symfony SMSBOX Notifier Bridge 实战指南:从 DSN 配置、消息选项到 Webhook 回执解析 后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载SMSBOX 是一家法国的 SMS 服务提供商Symfony 通过 smsbox-notifier 桥接包将其接入 Notifier 组件使开发者可以用标准的SmsMessage与TexterInterface发送短信。本文以 Smsbox CHANGELOG 为主线结合桥接包源码系统讲解 SMSBOX DSN 的完整格式与ssl选项、SmsboxOptions的每一项消息参数含取值范围与校验逻辑以及 Webhook 回执解析与发送失败排查帮助你快速在 Symfony 应用中落地 SMSBOX 短信能力。一、桥接包是什么一条 CHANGELOG 背后的完整功能Smsbox CHANGELOG 全文虽短却精确划定了该桥接包的两大能力演进7.1Add the bridge—— 桥接包首次加入提供smsbox://传输方案覆盖基础短信发送8.2Add the ssl DSN option to send requests over plain HTTP—— 新增sslDSN 选项允许调用方决定通过 HTTPS默认还是明文 HTTP 发送请求。在仓库中桥接包由以下文件构成均为Symfony\Component\Notifier\Bridge\Smsbox命名空间SmsboxTransport.php核心传输类负责组装请求、调用 SMSBOX API、解析响应SmsboxTransportFactory.php从 DSN 字符串解析出传输实例SmsboxOptions.php消息选项构建器对应 SMSBOX 平台的开发者接口参数Webhook/SmsboxRequestParser.phpWebhook 回执解析器把 SMSBOX 的送达报告转换为SmsEventEnum/目录下 6 个枚举类Mode、Strategy、Encoding、Charset、Day、Udh为选项提供强类型约束。值得注意的是在SmsboxTransport中默认请求地址为api.smsbox.pro最终端点为{scheme}://{host}/1.1/api.php且所有请求都以application/x-www-form-urlencoded表单形式提交。二、安装与 DSN 配置从 APIKEY 到 ssl 选项2.1 安装桥接包桥接包是独立的 Composer 包symfony/smsbox-notifier按 composer.json 的依赖约束需要php 8.4.1、symfony/notifier ^8.2并依赖symfony/clock与symfony/http-client。Webhook 支持需要额外启用symfony/webhookrequire-dev 中为^7.4|^8.0。安装后通过框架的 Notifier 集成自动注册smsbox方案。2.2 DSN 完整格式SMSBOX 桥接包的核心入口是 DSN格式如下SMSBOX_DSNsmsbox://APIKEYdefault?modeMODEstrategySTRATEGYsenderSENDER各组成部分的含义依据 README.md 与SmsboxTransportFactory::create()DSN 片段含义说明APIKEYSMSBOX API 密钥作为 DSN 的用户名部分传入见$this-getUser($dsn)default默认主机占位符主机为default时不覆盖默认地址api.smsbox.pro否则setHost()使用自定义主机mode发送模式必填对应Mode枚举取Standard/Expert/Reponse之一见 Mode.phpstrategy消息类型必填对应Strategy枚举取值 14见 Strategy.phpsender发送方名称普通模式可选Expert 模式下为必填缺少时getRequiredOption(sender)直接抛异常ssl传输协议开关8.2 新增布尔选项默认走 HTTPS设为0/false时使用明文 HTTP 发送请求关于 8.2 新增的ssl选项从 SmsboxTransportFactory.php 可以看到它最终通过$this-getSsl($dsn)解析再经由AbstractTransport::setSsl()影响SmsboxTransport中的getHttpScheme()返回值从而决定端点是https://api.smsbox.pro/1.1/api.php还是http://api.smsbox.pro/1.1/api.php。生产环境应保持默认的 HTTPS仅在调试、内网网关等确需明文传输的场景才显式关闭。2.3 传输对象的 DSN 序列化细节在 SmsboxTransport.php 的__toString()中可以看到序列化逻辑默认输出smsbox://host?mode...strategy...只有Mode::Expert模式下才追加sender参数。这从源码层面印证了“Expert 模式必须指定发送方”这一约束。三、SmsboxOptions一条短信的完整消息选项README 强调“You can add numerous options to a message”即通过SmsboxOptions的链式 setter 为每条消息补充 SMSBOX 平台支持的参数。这些 setter 在 SmsboxOptions.php 中均有实现且带有严格校验。下表汇总全部选项及其取值约束未标注默认值的选项按需设置即可setter对应 API 参数取值 / 校验规则mode(Mode $mode)modeStandard/Expert/Reponsestrategy(Strategy $strategy)strategy1私人、2通知、3非营销群发、4营销Strategy.phpsender(string)sender发送方名称Expert 模式下会转写为originedate(DD/MM/YYYY)date必须符合d/m/Y格式否则抛DateMalformedStringException与dateTime()互斥hour(HH:MM)heure必须符合H:i格式与dateTime()互斥dateTime(\DateTimeImmutable)dateheure必须晚于当前时间由symfony/clock提供时钟自动转为Europe/Paris时区并拆分出日期与小时coding(Encoding)codingdefault/unicode/autoEncoding.phpcharset(Charset)charsetiso-8859-1/iso-8859-15/utf-8Charset.phpudh(Udh)udh0禁用拼接、16 字节、27 字节Udh.phpcallback(bool)callback是否启用回调WebhookallowVocal(bool)allow_vocal是否允许语音回退maxParts(int)max_parts必须为 18 之间的整数否则抛InvalidArgumentExceptionvalidity(int)validity消息有效期分钟必须为 51440否则抛异常daysMinMax(Day $min, Day $max)day_min/day_max发送日窗口min必须在max之前或相同见 Day.phphoursMinMax(int, int)hour_min/hour_max发送小时窗口min需 0 且 maxmax需 23variable(array)variablepersonnalise个性化变量数组与消息正文中的%1%、%2%占位符一一对应调用后自动置personnalise1destIso(string)dest_isoISO 3166-1 国家码经symfony/intl的Countries::exists()校验非法代码抛异常3.1 完整使用示例use Symfony\Component\Notifier\Bridge\Smsbox\Enum\Charset; use Symfony\Component\Notifier\Bridge\Smsbox\Enum\Day; use Symfony\Component\Notifier\Bridge\Smsbox\Enum\Encoding; use Symfony\Component\Notifier\Bridge\Smsbox\Enum\Mode; use Symfony\Component\Notifier\Bridge\Smsbox\Enum\Strategy; use Symfony\Component\Notifier\Bridge\Smsbox\Enum\Udh; use Symfony\Component\Notifier\Bridge\Smsbox\SmsboxOptions; use Symfony\Component\Notifier\Message\SmsMessage; $sms new SmsMessage(33123456789, Your %1% message %2%); $options (new SmsboxOptions()) -mode(Mode::Expert) -strategy(Strategy::NotMarketingGroup) -sender(Your sender) -date(DD/MM/YYYY) -hour(HH:MM) -coding(Encoding::Unicode) -charset(Charset::Iso1) -udh(Udh::DisabledConcat) -callback(true) -allowVocal(true) -maxParts(2) -validity(100) -daysMinMax(min: Day::Tuesday, max: Day::Friday) -hoursMinMax(min: 8, max: 10) -variable([variable1, variable2]) -dateTime(new \DateTime()) -destIso(FR); $sms-options($options); $texter-send($sms);注意示例中date()/hour()与dateTime()都出现了但源码规定二者不可同时使用——先调用dateTime()后再调用date()/hour()或反之会直接抛出InvalidArgumentException。实际项目中请选择其一要么用date()hour()精确指定发送日期与时刻要么用dateTime()一次传入完整时间点。3.2 发送前的参数整理逻辑SmsboxTransport::doSend()会统一加工选项详见 SmsboxTransport.php自动注入dest清洗后的手机号、msg消息正文、id1、usagesymfony若选项未指定mode/strategy回退使用 DSN 中的默认值??语法Expert 模式下把sender转写为origine然后移除sender字段daysMinMax拆分为day_min/day_maxhoursMinMax拆分为hour_min/hour_maxdateTime拆分为dated/m/Y与heureH:i若设置了variable解析消息正文中的所有%N%占位符校验占位符最大序号必须等于变量数组元素个数随后将变量以;连接追加到dest后并置personnalise1。手机号在发送前会先经preg_replace(/[^0-9]/, , ...)清洗再用/^(\|)[0-9]{7,14}$/校验不符合即抛出InvalidArgumentException(Invalid phone number.)。四、Webhook 回执把送达状态变成 SmsEventREADME 特别注明“Smsbox notifier also provides Webhooks support”实现位于 Webhook/SmsboxRequestParser.php。4.1 请求匹配与安全校验解析器对进入的 Webhook 请求做双重校验HTTP 方法必须是GETMethodRequestMatcher([GET])来源 IP必须在PROVIDER_IPS白名单内默认包含 SMSBOX 官方的 6 个回执 IP37.59.198.135、178.33.185.51、54.36.93.79、54.36.93.80、62.4.31.47、62.4.31.48可通过构造函数注入自定义$allowedIPs。两者通过ChainRequestMatcher组合任一不满足即拒绝。4.2 回执状态码映射SMSBOX 的回执参数来自请求查询串需要同时包含numero号码、reference消息引用、accuse状态码、ts时间戳缺失任一字段都会以 HTTP 406 拒绝RejectWebhookException(Payload is malformed.)。accuse状态码到SmsEvent的映射规则依据doParse()的match分支accuse 码SmsEvent 事件含义0DELIVERED已送达-3,18FAILED失败含被拒、格式错误等各类错误-1,9,10null未归类为明确成功/失败的状态其他值抛RejectWebhookException(406)未知状态码直接拒绝最终事件通过new SmsEvent($name, $payload[reference], $payload)创建并调用setRecipientPhone($payload[numero])设置接收方号码。对应测试 Webhook/SmsboxRequestParserTest.php 与 Fixturesdelivred.php/delivred.txt覆盖了送达场景的解析行为。五、响应解析与常见失败排查SmsboxTransport::doSend()对 SMSBOX API 响应做了三层判定这构成了排查发送失败的抓手网络层HttpClient请求抛TransportExceptionInterface时抛出TransportException(Could not reach the remote Smsbox server., ...)——检查 DNS、防火墙、ssl选项是否与网络环境匹配HTTP 层状态码非 200 时从响应体读取description与code并拼入异常消息业务层响应体不以OK开头时判定失败只有匹配/^OK (\d)/才能提取出 SMSBOX 返回的消息引用 ID作为SentMessage的 messageId 返回。对应测试 SmsboxTransportTest.php 与 SmsboxOptionsTest.php、SmsboxTransportFactoryTest.php 分别覆盖了传输、选项校验与 DSN 解析三条链路可作为学习与回归验证的参考。六、小结通过 CHANGELOG 梳理的两条演进线可以把 SMSBOX 桥接包的能力归纳为7.1 引入的基础短信发送DSN SmsboxOptions全参数支持 响应解析与8.2 引入的sslDSN 选项灵活控制 HTTPS/HTTP。在实战中你只需四步即可接入配置SMSBOX_DSN环境变量记得mode、strategy必填Expert 模式必填sender→ 注入TexterInterface→ 构造带SmsboxOptions的SmsMessage→ 调用send()随后按需启用 Webhook 解析器接收送达回执。若需深入参数语义或排查失败可直接阅读本仓库中的 SmsboxOptions.php、SmsboxTransport.php 及 Tests 目录下的测试用例。赞分享后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载相关推荐Symfony Pushy Notifier Bridge 完整指南DSN 配置、ssl 选项与推送消息定制Symfony Pushy Notifier Bridge 完整指南DSN 配置、ssl 选项与推送消息定制 导读 本文基于 Pushy Bridge 的 C后端Web框架Symfony Notifier MessageMedia Bridge 演进史从 DSN 接入到 SSL 与消息选项的完整实战指南Symfony Notifier MessageMedia Bridge 演进史从 DSN 接入到 SSL 与消息选项的完整实战指南 导读 本文以 Symfo后端Web框架Symfony 8.2 Engagespot Notifier Bridge 实战指南DSN 配置、Push 推送与 ssl 选项解析Symfony 8.2 Engagespot Notifier Bridge 实战指南DSN 配置、Push 推送与 ssl 选项解析 本文聚焦 Symfon后端Web框架上一篇LX Music音源终极配置指南3分钟解锁全网无损音乐下一篇终极解决方案如何在3分钟内搞定Windows安卓设备连接难题的万能ADB驱动创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表