首页 / 资讯中心 / 文章详情

Symfony Notifier 接入 Ring Central SMS 短信发送完整指南

Symfony Notifier 接入 Ring Central SMS 短信发送完整指南 ★ FEATURED ARTICLE
后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载导读本文讲解如何在 Symfony 项目中通过 Notifier 组件接入 Ring CentralRingCentral短信服务从ringcentral://DSN 的配置、OAuth 2 Token 与发送方号码的约定到使用RingCentralOptions为短信附加国家/地区等扩展参数再到底层传输实现与测试用例的验证逻辑。读完本文你将掌握一套可直接复制运行、可排查异常、可扩展参数的 Ring Central SMS 集成方案。本文基于 symfony 仓库中 RingCentral 桥接包 的官方 README并结合该目录下的传输、工厂、选项类源码与测试用例展开。一、Ring Central 桥接包概览src/Symfony/Component/Notifier/Bridge/RingCentral/目录提供了 Ring Central 短信服务的 Symfony Notifier 集成包名为symfony/ring-central-notifier类型为symfony-notifier-bridge见 composer.json。它属于 Notifier 组件体系中的“传输桥”Transport Bridge之一把 Ring Central 的 SMS API 包装成 Symfony 统一的Transport接口让你可以用与其他短信通道完全一致的方式发送短信。从 CHANGELOG.md 可以看到该桥接包的演进6.3首次加入该桥接包8.2新增sslDSN 选项允许通过明文 HTTP 发送请求用于本地调试等场景。注意该桥接包要求 PHP 8.4.1依赖symfony/http-client与symfony/notifier见 composer.json请确认项目环境满足版本前提。二、DSN 配置ringcentral://协议详解官方 README 给出的 DSN 格式如下RINGCENTRAL_DSNringcentral://API_TOKENdefault?fromFROM其中API_TOKEN你的 Ring Central OAuth 2 token不是账号密码而是通过 Ring Central 开发者平台 OAuth 流程签发的访问令牌FROM短信发送方号码即“发件人”标识default占位主机名表示使用桥接包内置的默认端点。在 Symfony 项目中将该 DSN 写入环境变量例如.env或.env.local并在config/packages/notifier.yaml中注册即可# config/packages/notifier.yaml framework: notifier: texter_transports: ringcentral: %env(RINGCENTRAL_DSN)%2.1 底层解析工厂如何消费 DSNDSN 的解析逻辑位于 RingCentralTransportFactory.phppublic function create(Dsn $dsn): RingCentralTransport { $scheme $dsn-getScheme(); if (self::TRANSPORT_SCHEME ! $scheme) { throw new UnsupportedSchemeException($dsn, self::TRANSPORT_SCHEME, $this-getSupportedSchemes()); } $apiKey $this-getUser($dsn); $from $dsn-getRequiredOption(from); $host default $dsn-getHost() ? null : $dsn-getHost(); $port $dsn-getPort(); return (new RingCentralTransport($apiKey, $from, $this-client, $this-dispatcher)) -setHost($host)-setPort($port)-setSsl($this-getSsl($dsn)); }从源码结构可以推断出以下几点约定token 取自 DSN 的 user 段ringcentral://API_TOKEN...即$dsn-getUser()缺失时会抛出IncompleteDsnException由基类 AbstractTransportFactory::getUser() 保证。from是必填选项使用getRequiredOption(from)读取缺少时直接报错。这一点在 RingCentralTransportFactoryTest.php 的missingRequiredOptionProvider中有明确用例ringcentral://apiTokendefault无from会被判为非法 DSN。default主机名会被替换为null随后RingCentralTransport使用类常量protected const HOST platform.ringcentral.com作为默认端点见 RingCentralTransport.php当然你也可以显式指定自定义主机与端口。ssl选项通过基类的 AbstractTransportFactory::getSsl() 解析支持?sslfalse关闭 HTTPS详见下文第四节。2.2 简化后的 DSN 表示RingCentralTransport::__toString()源码位置会输出不带凭据的传输标识格式为ringcentral://platform.ringcentral.com?fromFROMRingCentralTransportTest.php 的toStringProvider用例验证的正是这一形态。三、发送第一条短信配置好 DSN 后通过TexterInterface发送短信与其它短信通道完全一致。核心消息类是Symfony\Component\Notifier\Message\SmsMessage其构造函数签名见 SmsMessage.php为new SmsMessage(string $phone, string $subject, string $from , ?MessageOptionsInterface $options null)一个最小可运行示例use Symfony\Component\Notifier\TexterInterface; use Symfony\Component\Notifier\Message\SmsMessage; class SmsService { public function __construct(private TexterInterface $texter) { } public function sendWelcomeSms(): void { $sms new SmsMessage(1411111111, Welcome to our service!); $this-texter-send($sms); } }发送时RingCentralTransport会按以下规则组装请求体见 RingCentralTransport::doSend()若消息带有选项对象则取其toArray()结果作为基础参数text字段来自$message-getSubject()短信正文from.phoneNumber优先取$message-getFrom()为空时回退到 DSN 中配置的fromto[].phoneNumber来自$message-getPhone()接收方号码最终以POST方式请求{scheme}://{endpoint}/restapi/v1.0/account/~/extension/~/sms使用auth_bearer携带 OAuth 2 token请求体为过滤掉空值的 JSON。3.1 发送方号码必须是 E.164 格式doSend()内部有一个关键校验源码位置if (!preg_match(/^\[1-9]\d{1,14}$/, $options[from][phoneNumber] ?? )) { throw new InvalidArgumentException(\sprintf( The From number %s is not a valid phone number. Phone number must be in E.164 format., $options[from][phoneNumber] ?? )); }即发件人号码必须符合E.164 国际格式以开头首位不能是0总长度 215 位数字。对应的测试用例在 RingCentralTransportTest.php0首位为 0→ 抛InvalidArgumentException1过短→ 抛InvalidArgumentException而11到112345678912345的一系列合法号码均可正常发送validFromProvider。3.2 响应处理与 Message ID请求返回后doSend()会检查状态码若无法连接远端服务器发生传输层异常抛出TransportException错误信息为 “Could not reach the remote Ring Central server.”若状态码不是 200则解析错误响应体优先读取message、其次error_description、再次description字段组装异常信息成功时从响应 JSON 中取id字段作为SentMessage的消息 IDRingCentralTransportTest.php 中用MockHttpClient模拟返回{id: foo}并断言getMessageId() foo同时断言请求方法为POST、URL 为https://platform.ringcentral.com/restapi/v1.0/account/~/extension/~/sms。3.3 支持的消息类型RingCentralTransport::supports()源码位置只接受SmsMessage并且要求其携带的 options 要么为空、要么是RingCentralOptions实例。若传入ChatMessage等其他消息类型会在发送时抛出UnsupportedMessageTypeException测试用例见 RingCentralTransportTest.php。四、为短信附加扩展参数RingCentralOptions官方 README 重点展示了RingCentralOptions类的用法——它对应 Ring Central 官方 SMS APIcreateSMSMessage中的可选请求参数让消息可以携带国家/地区等附加信息。完整示例继承自 README 并补充了完整代码上下文use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Bridge\RingCentral\RingCentralOptions; $sms new SmsMessage(1411111111, My message); $options (new RingCentralOptions()) -country( test_country_id, // id国家/地区 ID country_iso_code, // isoCodeISO 国家代码 country_name, // name国家名称 country_uri, // uri国家资源 URI country_calling_code // callingCode国际区号 ) // ... 未来版本可继续链式追加其它选项 ; // 将自定义选项挂到短信消息上并发送 $sms-options($options); $texter-send($sms);4.1RingCentralOptions实现细节该类位于 RingCentralOptions.php实现了MessageOptionsInterface内部维护一个$options数组。当前版本提供的country()方法签名与内部行为如下public function country(string $id, ?string $isoCode null, ?string $name null, ?string $uri null, ?string $callingCode null): static { $this-options[country] [ id $id, isoCode $isoCode, name $name, uri $uri, callingCode $callingCode, ]; return $this; }可以看到除id外其余四个参数均可选null方法返回$this支持链式调用最终通过toArray()返回整个选项数组而getRecipientId()返回null接收方信息由SmsMessage本身携带。RingCentralOptionsTest.php 验证了country()的入参会被原样映射到toArray()的country子数组。4.2 选项如何进入请求体回顾第三节的doSend()逻辑$options $message-getOptions()?-toArray() ?? [];随后$options[text]、$options[from][phoneNumber]、$options[to][][phoneNumber]会被覆盖/追加最后整体以 JSON 形式 POST 到 SMS API。也就是说RingCentralOptions里的country等字段会与短信正文、收发方号码一起组成完整的 API 请求载荷。提示Ring Central 官方 API 的其余请求参数如优先级、消息过期时间等目前在该桥接包中尚无对应的链式方法如果需要可以仿照country()的写法自行扩展RingCentralOptions只要最终落到toArray()返回的数组即可被传输层透传。五、进阶配置ssl选项与自定义端点5.1 关闭 HTTPS 的ssl选项从 8.2 版本开始见 CHANGELOG.mdDSN 支持ssl选项可用于本地联调等需要明文 HTTP 的场景RINGCENTRAL_DSNringcentral://API_TOKENdefault?fromFROMsslfalse该选项由基类 AbstractTransportFactory::getSsl() 解析$dsn-getOption(ssl)为null时保持默认即 HTTPS否则按布尔值解析。工厂创建传输后调用setSsl()生效。生产环境请务必保持默认的 HTTPS不要关闭 SSL。5.2 自定义主机与端口如果出于代理或内网网关等原因需要覆盖默认端点platform.ringcentral.com可以显式指定 DSN 的主机与端口RINGCENTRAL_DSNringcentral://API_TOKENyour-proxy.example.com:8443?fromFROM此时工厂会跳过default占位符替换逻辑将自定义 host/port 直接传给传输对象。六、安装方式与依赖说明6.1 通过 Composer 安装composer require symfony/ring-central-notifier安装后即可在config/packages/notifier.yaml中按第二节方式配置RINGCENTRAL_DSN。桥接包的自动加载规则为Symfony\Component\Notifier\Bridge\RingCentral\命名空间映射到包根目录Tests/目录被排除在 classmap 之外见 composer.json。6.2 版本前提PHP 8.4.1symfony/http-client^7.4 或 ^8.0用于实际发送 HTTP 请求symfony/notifier^8.2提供SmsMessage、TexterInterface等核心抽象开发环境下还需要symfony/event-dispatcher用于RingCentralTransport构造器中的事件派发参数。七、验证与排错速查桥接包自带三组测试可对照排查问题测试文件验证内容RingCentralOptionsTest.phpcountry()各字段是否正确映射到toArray()RingCentralTransportTest.phpE.164 校验、请求 URL 与方法、成功响应的 Message ID、不支持的 message 类型RingCentralTransportFactoryTest.phpDSN scheme 校验、缺少 token / 缺少from时的异常、scheme 支持矩阵常见报错与对策“User is not set”ringcentral://default?...缺少 OAuth 2 token检查 DSN 的 user 段“The option from is required”DSN 缺少from查询参数“The From number ... is not a valid phone number”发件人号码不符合 E.164必须以开头、首位非 0、长度 215 位“Could not reach the remote Ring Central server.”网络不可达检查端点、端口或代理配置“Unable to send the SMS - ...“Ring Central API 返回非 200 状态码错误详情取自响应体中的message/error_description/description字段。八、相关资源桥接包官方 READMEsrc/Symfony/Component/Notifier/Bridge/RingCentral/README.mdNotifier 组件总览src/Symfony/Component/Notifier/README.md传输工厂基类getUser/getSsl的实现基础src/Symfony/Component/Notifier/Transport/AbstractTransportFactory.php消息抽象SmsMessagesrc/Symfony/Component/Notifier/Message/SmsMessage.php版本变更记录src/Symfony/Component/Notifier/Bridge/RingCentral/CHANGELOG.md若要在实际项目中使用请从 Ring Central 开发者平台申请 OAuth 2 应用并完成授权流程获取 token再按本文第二节的 DSN 格式完成配置。本文所有实现细节均以当前仓库 symfony 的源码与测试为准版本能力受限于该桥接包当前发布的版本。赞分享后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载相关推荐Symfony Notifier OrangeSms Bridge 实战指南接入 Orange SMS 发送短信Symfony Notifier OrangeSms Bridge 实战指南接入 Orange SMS 发送短信 本文以 Symfony Notifier 官后端Web框架Symfony Notifier 接入 Mailjet SMS 短信通道DSN 配置、发送原理与源码级解析Symfony Notifier 接入 Mailjet SMS 短信通道DSN 配置、发送原理与源码级解析 Mailjet Notifier Bridge后端Web框架Symfony Notifier 集成 Ring CentralDSN 配置、SMS 发送与 ssl 选项解析Symfony Notifier 集成 Ring CentralDSN 配置、SMS 发送与 ssl 选项解析 本篇技术指南以 src/Symfony/Com后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站