Laravel 8 动态配置nexmo.sms_from实现国际短信合规发送
动态切换Vonage短信发件ID实现方案
你当前使用的2.5.1版本扩展包原生支持动态指定发件人,不需要修改全局配置、不需要改动vendor源码,直接按以下步骤实现即可:
1. 补充配置项
打开config/services.php,在原有nexmo配置段中新增美国专用发件号配置,保留原有非美地区的默认发件ID:
'nexmo' => [ 'sms_from' => 'DomainMonit', // 原有英国及其他非美地区使用的字母发件ID 'sms_from_us' => '+1XXXXXXXXXX', // 替换为你采购的已完成合规审批的美国toll-free号码,必须带+1国家前缀 ],
2. 单通知场景实现(通知类数量少的时候用)
在每个需要发送短信的通知类的toNexmo方法中,根据$notifiable模型上存储的国家字段动态传入发件人,调用from方法传入的值优先级高于全局配置,会直接覆盖默认值:
public function toNexmo($notifiable) { // 这里判断逻辑根据你实际存储的国家字段规则调整,建议用ISO两位国家码匹配US $senderId = $notifiable->country_code === 'US' ? config('services.nexmo.sms_from_us') : config('services.nexmo.sms_from'); return (new NexmoMessage) ->content('你的短信内容,比如域名监控告警通知') ->from($senderId); }
3. 全局统一实现(通知类数量多的时候用,无侵入)
如果项目里短信通知类很多,逐个修改重复代码太冗余,可以自定义通道类统一处理发件人判断逻辑,原有业务代码不需要任何改动:
- 第一步:新建自定义通道类
app/Channels/CustomNexmoChannel.php
namespace App\Channels; use Illuminate\Notifications\Channels\NexmoChannel; use Illuminate\Notifications\Notification; class CustomNexmoChannel extends NexmoChannel { public function send($notifiable, Notification $notification) { $message = $notification->toNexmo($notifiable); // 仅当通知没有手动指定发件人时,才自动按国家切换 if (!$message->from) { $message->from( $notifiable->country_code === 'US' ? config('services.nexmo.sms_from_us') : config('services.nexmo.sms_from') ); } return parent::send($notifiable, $notification); } }
- 第二步:在
app/Providers/AppServiceProvider.php的boot方法中绑定替换原通道实例:
public function boot() { $this->app->bind(NexmoChannel::class, CustomNexmoChannel::class); }
注意点
- 国家判断逻辑建议统一使用ISO 3166-1两位国家码匹配,避免因存储的国家名称大小写、翻译差异导致判断失效
- 美国toll-free号码必须在Vonage后台完成合规审批、绑定到当前账户后再使用,未审批的号码发往美国会被直接拦截
- 配置美国号码时必须携带
+1国家前缀,仅填写10位本地号码会导致发送失败 - 以上实现完全兼容laravel/nexmo-notification-channel 2.5.1版本,不需要升级包版本
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

