应使用overtrue/easy-sms对接阿里云短信服务,配置凭证与模板码,严格匹配变量名;手写curl需按签名规则处理参数并正确编码;验证码须6位纯数字、校验手机号、缓存限制频次,发送后校验code字段。

要在PHP框架中安全、稳定地拼接并发送短信验证码给用户,必须避开手动拼URL、硬编码签名逻辑、忽略模板变量格式等常见雷区,否则会直接触发阿里云返回InvalidParameter或isv.BUSINESS_LIMIT_CONTROL错误。
用 overtrue/easy-sms 快速对接阿里云(推荐路径)
这一步操作起来很简单,直接把扩展包装进项目就行。
执行 composer require overtrue/easy-sms -vvv 安装扩展包。
在 config/sms.php 中填入阿里云凭证:access_key_id、access_key_secret、sign_name 和 template(注意不是模板内容,是控制台生成的 【TEMPLATE_CODE】)。
发送时只传手机号和变量数组,比如 ['code' => '123456'],变量名必须和你在阿里云模板里写的 ${code} 严格一致——大小写、下划线、括号都不能错。
手写 cURL 调用阿里云 API(不建议,仅作理解)
如果你坚持不用 SDK,必须按阿里云签名规则逐项处理:所有请求参数要按字典序排序 → 拼接成字符串 → SHA256-HMAC 签名 → URL 编码 → 构造最终请求地址。
漏掉任意一步都会返回 SignatureDoesNotMatch,而且 PHP 的 urlencode() 和 rawurlencode() 行为不同,用错会导致签名失败。
TemplateParam 必须传 JSON 字符串,不是 PHP 数组——传数组会签名失败,返回 InvalidParameter。
regionId 固定为 cn-hangzhou,endpoint 地址必须是 https://dysmsapi.aliyuncs.com/,少一个斜杠或协议写成 http 都会报错。
验证码生成与存储必须同步设计
第一步:用 str_pad(random_int(1, 999999), 6, '0', STR_PAD_LEFT) 生成 6 位纯数字验证码,避免 rand() 在某些 PHP 版本下可预测。
第二步:校验手机号格式,执行 preg_match('/^1[3-9]\d{9}$/', $mobile),不校验会触发限流,且阿里云拒绝非大陆手机号(除非你开通了国际短信)。
第三步:把验证码存入缓存,键名为 sms:verify:{$mobile},过期时间设为 5 分钟,同时设置单手机号 1 小时内最多 5 次请求——这是阿里云默认阈值,超频直接返回 isv.BUSINESS_LIMIT_CONTROL。
第四步:调用发送逻辑后,检查返回结果中的 Code === 'OK',其他任何返回都视为失败,不要只看 HTTP 状态码 200。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











