php短信接口默认不支持国际短信,需在云平台单独申请资质、开通功能、购买套餐包,并严格使用带国家前缀的号码、国际签名、国际模板id及对应regionid。

PHP短信接口默认不支持国际短信
绝大多数国内厂商提供的 PHP 短信 SDK(比如阿里云 AlibabaCloud\Tea\Exception\TeaException、腾讯云 SmsClient、容联云 CcpRestSmsSDK)在默认配置和文档示例中,只开通并适配中国大陆手机号(+86),直接传入 +14155550123 或 447911123456 会返回错误,不是代码写错了,是服务端根本没开权限。
开通国际短信要单独申请+改参数
不是换几行 PHP 代码就能发,得走平台侧流程:
- 登录对应云服务商控制台(如阿里云「短信服务」→「国际/港澳台短信」),提交资质审核(企业营业执照、业务场景说明、目标国家列表)
- 审核通过后,在控制台开通「国际短信」功能,并为每个目标国家单独购买套餐包(比如「美国 1000 条」、「日本 500 条」)
- 调用时必须显式传入国家码:
$request->setPhoneNumberSet(['+14155550123']);,不能只传14155550123;部分 SDK 还要求设置$request->setSignName('YourGlobalSign')—— 国际签名需单独报备,不能复用国内签名 - 注意:阿里云国际短信的
TemplateCode和国内不通用,必须用国际模板 ID,且模板内容需通过多语言审核
PHP 发送时容易忽略的格式细节
哪怕开通了权限,下面这些点一错就返回 InvalidParameter.PhoneNumber 或 BusinessFailed:
- 手机号必须带国家前缀,且不能有空格、横线、括号:✅
+447911123456,❌44-7911-123456、❌(44) 7911 123456 - 国家码和号码之间不能加空格或 + 号以外的字符;有些 SDK 会自动 trim,但阿里云
SendSmsRequest严格校验格式 - 使用
urlencode()处理模板变量值(比如用户昵称含中文或特殊符号),否则可能触发签名验证失败 - 国际短信的
RegionId常被忽略:腾讯云需设为ap-singapore或us-east-1,不是默认的cn-shanghai
测试阶段别只用自己手机
很多开发者用国内手机号加 +86 测试,看似成功,其实走的是国内通道,完全没验证国际逻辑。真实踩坑点:
立即学习“PHP免费学习笔记(深入)”;
- 用真实海外号码(如朋友的美国/日本号码)收不到?先查控制台「发送记录」里状态是否为
success,再确认该号码所在国家是否在你已购套餐覆盖范围内 - 部分国家(如印度、印尼)对短信内容敏感,含链接、数字组合(如“验证码123456”)可能被运营商拦截,建议先发纯文本测试
- 时区影响小但存在:阿里云国际短信的
SendDate参数若填 UTC 时间但没声明时区,可能延迟投递
国际短信不是把 +86 换成 +1 就完事,从资质、套餐、签名、模板、号码格式到区域配置,漏一个环节都会静默失败。最常卡在控制台没开权限,或者用了国内模板 ID 去发国际号。











