短信签名和模板必须由企业主体备案,未备案则无法发送;PHP代码无需改动,但需确保调用时使用已审核的签名与模板,且内容格式严格匹配。

短信签名和模板必须备案,接口调用本身不需单独备案
国内所有短信服务(含验证码、通知类)都受工信部监管,**不备案=发不出去**。但备案主体不是“PHP接口代码”,而是你使用的短信签名和短信模板——这两项必须在短信服务商后台提交企业资质审核,通过后才能正式发送。
常见错误现象:4072(模板未审核)、4071(签名未审核)、4073(签名与模板归属不一致)。这些错误和你的PHP代码完全无关,改代码没用,必须回服务商后台补材料。
- 签名需提供营业执照+授权书(如用【XX科技】,执照名称须含“XX科技”)
- 模板内容不能含敏感词、不能随意替换变量位置(比如把
#code#写成验证码:#code#可能被拒) - 测试阶段可用系统默认签名
【互亿无线】和模板您的验证码是:1234。请不要把验证码泄露给其他人。,但上线前必须换自己的
PHP代码里根本看不到“备案”字段,但参数校验会拦截未备案项
你在PHP中调用接口时,account、password、mobile、content这些参数里没有“备案号”或“审核状态”字段。但服务商网关会在收到请求后,自动比对content是否匹配已审核模板、content末尾是否带已审核签名——不匹配就直接返回错误,不进发送队列。
使用场景:Laravel项目里封装了一个sendSms()方法,传入手机号和验证码,结果总返回msg="模板不匹配"。别急着查curl配置,先登录互亿无线/阿里云后台看模板状态是不是“审核通过”。
立即学习“PHP免费学习笔记(深入)”;
- 调试时若用自定义签名
【我的公司】,但模板里写的是【互亿无线】,必报4072 - 阿里云要求模板变量名严格一致,
#code#写成#code#:(多一个冒号)也会被拒 - 互亿无线的
content参数必须完整包含签名,例如您的验证码是:1234。【我的公司】,缺括号或空格都可能失败
企业实名认证是备案前置条件,个人开发者会被卡住
很多个人站长试了几次发现注册账号后无法申请签名,卡在“资质提交”页——因为工信部规定,**国内短信发送方必须为企业主体**。个人身份证、个体工商户执照(非“企业”类型)在多数主流服务商(互亿无线、阿里云、腾讯云)均不被接受。
性能 / 兼容性影响:这不是PHP版本或扩展问题,也跟curl设置无关。哪怕你用PHP 8.3 + ext-curl全开,只要认证类型不合规,后台连“提交审核”按钮都是灰色的。
- 阿里云明确要求“企业支付宝认证”或“对公账户打款认证”,不支持微信/个人支付宝
- 互亿无线接受营业执照扫描件,但需加盖公章,且经营范围需含“信息技术”“通信服务”等关键词
- 若暂无公司,可考虑用已备案企业的子签名(需签授权书),但主账号仍得是企业
备案通过后,PHP代码无需改动,但要注意模板ID和签名的硬编码风险
备案完成那一刻,你原来的测试代码(比如用【互亿无线】签名)依然能跑通,只是返回code=2的概率大幅提高。但上线前务必检查:是否把审核通过的签名和模板ID写死在config/sms.php或环境变量里?还是散落在各个sendSms()调用处?
容易踩的坑:env('SMS_SIGN', '【互亿无线】')这种写法看似灵活,但如果环境变量漏配,生产环境会悄悄退回到默认签名,导致用户收不到带品牌名的短信。
- ThinkPHP建议用
config('sms.sign')统一读取,避免多处'【我的公司】'硬编码 - Laravel推荐在
.env里设SMS_TEMPLATE_ID=123456,并在SmsServiceProvider中注入,防止模板ID变更时漏改 - 阿里云SDK里
$templateCode和$signName必须同步更新,不同步就会报InvalidTemplateParam










