营销短信在php中必须通过资质平台发送,禁用curl或file_get_contents直连;需审核模板与签名,使用阿里云sdk并确保白名单、标点、真实号码等合规。

营销短信在 PHP 中不能直接用普通 HTTP 请求发出去——运营商要求必须通过具备资质的第三方平台,且内容需提前报备、模板审核通过。私自调用未认证接口或绕过模板发送营销信息,轻则被拦截,重则触发账号封禁、IP 拉黑。
为什么 file_get_contents() 或 curl_init() 直接请求失败
多数人一开始会尝试用 curl 模拟 POST 发送短信,但几乎都卡在 403、401 或返回 "template_not_approved"。这不是代码写错了,而是底层逻辑不匹配:
- 营销短信强制使用「模板 ID + 变量替换」方式,不能拼接自由文本
- 所有通道(如阿里云、腾讯云、容联云)都要求先在控制台提交模板,等人工审核通过后才能拿到
template_id - 签名也必须提前报备,且和企业主体一致,
sign_name填错一个字都会返回"sign_not_exist" - 部分平台还校验
from(发送号码)、extend(扩展码)等字段,漏填即拒收
怎么调通阿里云 SMS 的 PHP SDK(v20170525)
阿里云是当前国内最常用、文档最全的营销短信通道,其 PHP SDK 封装了签名生成、时间戳、签名加密等细节,比手写 curl 稳定得多:
- 必须用官方最新版 SDK(
alibabacloud/pop-core+alibabacloud/aliyun-openapi-php-sdk),旧版 v20160927 不支持新签名算法 -
AccessKeyId和AccessKeySecret要从 RAM 子账号获取,别用主账号密钥,否则权限过大有风险 - 发送时
TemplateCode必须是审核通过的模板 ID,形如SMST_123456789;TemplateParam是 JSON 字符串,不是数组:{"code":"1234","product":"XX服务"} - 注意时区:SDK 默认用本地时区生成
X-ACS-Timestamp,若服务器时间不准,会返回"InvalidTimeStamp.Expired"
测试阶段最容易被忽略的三个点
即使代码跑通、返回 "MessageId":"SMS123456789",也不代表用户真能收到。以下三点常被跳过,却直接决定上线成败:
立即学习“PHP免费学习笔记(深入)”;
- 测试手机号必须加在阿里云「短信签名」的白名单里,否则只对白名单号码生效,且每天限 10 条
- 模板变量里的中文标点要和审核时完全一致,比如审核的是「您的验证码是{code},10分钟内有效。」,你传参时写成「您的验证码是{code},10 分钟内有效!」就会触发
"TemplateParamFormatError" - 不要用
13800138000这类虚拟号测试,运营商会直接过滤;用真实手机号,且确认该号码没被拉入平台黑名单(查QuerySendDetails接口可看到失败原因)
模板审核周期通常 1–3 个工作日,别卡在上线前两天才提;签名和模板一旦驳回,修改后要重新排队,不是即时重审。真正麻烦的从来不是 PHP 怎么写,而是材料准备和平台规则对齐。











