PHP短信接口支持国际短信吗_国际短信发送方法【解答】

2次阅读

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

PHP短信接口支持国际短信吗_国际短信发送方法【解答】

PHP短信接口默认不支持国际短信

绝大多数国内厂商提供的 PHP 短信 SDK(比如阿里云 AlibabaCloudTeaExceptionTeaException、腾讯云 SmsClient、容联云 CcpRestSmsSDK)在默认配置和文档示例中,只开通并适配中国大陆手机号(+86),直接传入 +14155550123447911123456 会返回错误,不是代码写错了,是服务端根本没开权限。

开通国际短信要单独申请+改参数

不是换几行 PHP 代码就能发,得走平台侧流程:

  • 登录对应云服务商控制台(如阿里云「短信服务」→「国际/港澳台短信」),提交资质审核(企业营业执照、业务场景说明、目标国家列表)
  • 审核通过后,在控制台开通「国际短信」功能,并为每个目标国家单独购买套餐包(比如「美国 1000 条」、「日本 500 条」)
  • 调用时必须显式传入国家码:$request->setPhoneNumberSet(['+14155550123']);,不能只传 14155550123;部分 SDK 还要求设置 $request->setSignName('YourGlobalSign') —— 国际签名需单独报备,不能复用国内签名
  • 注意:阿里云国际短信的 TemplateCode 和国内不通用,必须用国际模板 ID,且模板内容需通过多语言审核

PHP 发送时容易忽略的格式细节

哪怕开通了权限,下面这些点一错就返回 InvalidParameter.PhoneNumberBusinessFailed

  • 手机号必须带国家前缀,且不能有空格、横线、括号:✅ +447911123456,❌ 44-7911-123456、❌ (44) 7911 123456
  • 国家码和号码之间不能加空格或 + 号以外的字符;有些 SDK 会自动 trim,但阿里云 SendSmsRequest 严格校验格式
  • 使用 urlencode() 处理模板变量值(比如用户昵称含中文或特殊符号),否则可能触发签名验证失败
  • 国际短信的 RegionId 常被忽略:腾讯云需设为 ap-singaporeus-east-1,不是默认的 cn-shanghai

测试阶段别只用自己手机

很多开发者用国内手机号加 +86 测试,看似成功,其实走的是国内通道,完全没验证国际逻辑。真实踩坑点:

立即学习PHP免费学习笔记(深入)”;

  • 用真实海外号码(如朋友的美国/日本号码)收不到?先查控制台「发送记录」里状态是否为 success,再确认该号码所在国家是否在你已购套餐覆盖范围内
  • 部分国家(如印度、印尼)对短信内容敏感,含链接、数字组合(如“验证码123456”)可能被运营商拦截,建议先发纯文本测试
  • 时区影响小但存在:阿里云国际短信的 SendDate 参数若填 UTC 时间但没声明时区,可能延迟投递

国际短信不是把 +86 换成 +1 就完事,从资质、套餐、签名、模板、号码格式到区域配置,漏一个环节都会静默失败。最常卡在控制台没开权限,或者用了国内模板 ID 去发国际号。

text=ZqhQzanResources