.env文件只存aliyun_access_key_id和secret等敏感凭证,template_code、sign_name等业务配置应统一收口至config/sms.php,避免环境混用或密钥泄露。

Env 文件里只放敏感凭证,不放模板和签名
阿里云短信的 access_key_id 和 access_key_secret 必须从 .env 读取,绝不能硬编码在 PHP 文件里。其他如 template_code、sign_name 属于业务配置,应放在框架配置文件(如 config/sms.php)中,和环境解耦。
常见错误现象:access_key_secret 被提交到 Git,导致短信账户被盗刷;或把 sign_name 写死在 .env 里,测试/生产环境共用同一签名,上线后因签名未审核通过直接失败。
-
.env中只保留:
ALIYUN_ACCESS_KEY_ID=your_real_id ALIYUN_ACCESS_KEY_SECRET=your_real_secret
- 模板 CODE、签名名称、区域等,统一收口到
config/sms.php,便于多环境差异化配置 - TP6+ 推荐用
Env::get('ALIYUN_ACCESS_KEY_ID')读取,TP5 用env('ALIYUN_ACCESS_KEY_ID')
config/sms.php 怎么组织参数结构
模板 CODE 和签名必须和阿里云控制台“已通过”状态的完全一致(大小写、全角括号【】都不能错),所以 config/sms.php 要能清晰区分环境。
示例(TP6):
return [
'default' => env('SMS_DRIVER', 'aliyun'),
'aliyun' => [
'access_key_id' => env('ALIYUN_ACCESS_KEY_ID'),
'access_key_secret' => env('ALIYUN_ACCESS_KEY_SECRET'),
'region_id' => 'cn-hangzhou',
'template_code' => env('ALIYUN_TEMPLATE_CODE', 'SMS_123456789'),
'sign_name' => env('ALIYUN_SIGN_NAME', '【山水优品】'),
],
];
-
template_code和sign_name允许通过env()覆盖,方便不同环境用不同模板(比如测试用SMS_TEST_XXX) - 不要在配置里拼接 JSON 字符串,
templateParam的键名映射逻辑留在业务层处理 - 如果项目有多个短信通道(如阿里云 + 腾讯云),建议按驱动拆分配置,避免混在一起
为什么不能把 templateParam 结构也塞进 env
templateParam 是运行时动态值(比如验证码 code、用户名 name),不是静态配置。把它写进 .env 就等于把业务逻辑常量化,会导致:
- 每次发不同验证码都要改
.env并重载配置——不可能 - 模板变量名(如
code)和模板内容里的${code}脱节,调试时根本看不出哪边错了 - JSON 格式校验被绕过:env 值是字符串,
json_encode(['code' => '1234'])才是合法输入,硬塞进去容易漏转义
正确做法:在调用发送方法时,传入 PHP 数组,由 SDK 或封装类内部做 json_encode()。例如:
$params = ['code' => $verifyCode, 'product' => '山水优品']; SmsService::send($mobile, $params); // 内部自动 json_encode
TP6 使用 overtrue/easy-sms 时的配置衔接点
如果你用 overtrue/easy-sms,它的配置入口是 config/sms.php,但注意它默认不读 .env 里的 key,需手动桥接。
关键操作:
- 确保
config/sms.php中的aliyun驱动项里,key和secret字段明确指向env()变量 -
template字段填的是模板 CODE(如SMS_123456789),不是模板内容 -
sign字段必须带全角括号,如【山水优品】,少一个字符就报SignNameNotExists
最容易被忽略的是:TP6 的 easy-sms 配置加载时机早于中间件,所以 env() 函数必须在配置文件中可用——确认你的 config/sms.php 没有被提前 require 或命名空间污染。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











