CMS对接短信平台,表单提交发送验证码
很多CMS站点在用户注册或留言时,需要给提交表单的手机号发送验证码。
这需要将CMS与第三方短信平台对接,本文用零基础也能看懂的方式,讲清从选短信平台到表单验证码成功发送的全部步骤。
一、对接前需要准备什么
动手改代码前,先把下面几项准备好,避免中途卡住。
- 一个可用的短信平台账号:阿里云、腾讯云、华为云等主流服务商都提供短信服务,注册后完成实名认证。
- 短信签名和模板:在短信平台控制台申请签名(如“XX网站”)和验证码模板(如“您的验证码是{code},5分钟内有效”)。签名和模板需要审核,建议提前1-2个工作日提交。
- CMS后台或数据库权限:需要能修改表单提交逻辑,或者能编辑模板文件、添加PHP/Java等后端脚本。
- 服务器外网访问权限:服务器必须能访问短信平台的API地址,如果有限制需要在防火墙放行。
短信平台审核通过后,务必记录好API密钥(AccessKey ID和AccessKey Secret),后续配置要用。
二、分步操作:从短信平台到CMS表单
1. 在短信平台获取API凭证
以阿里云为例,登录控制台,进入“短信服务”->“AccessKey管理”,创建或查看AccessKey。AccessKey Secret只在创建时显示一次,请立即保存。
同时记下短信服务的API发送地址(通常形如https://dysmsapi.aliyuncs.com)。
2. 安装短信SDK或编写请求代码
大多数CMS使用PHP,推荐通过Composer安装官方SDK:
composer require alibabacloud/dysmsapi-20170525
如果不想用SDK,也可以直接用cURL发送HTTP请求。
参考请求参数如下:
$params = [
'PhoneNumbers' => $phone,
'SignName' => '你的签名',
'TemplateCode' => 'SMS_123456789',
'TemplateParam' => json_encode(['code' => $code])
];
3. 修改CMS表单提交逻辑
找到处理表单提交的文件(常见位置:/app/controller/UserController.php 或 /include/form.php)。
在接收手机号后、写入数据库前,插入发送验证码的代码。
关键逻辑顺序:
- 验证手机号格式(正则表达式)。
- 生成6位随机数字作为验证码,存入Session或缓存(如Redis),设置5分钟过期。
- 调用短信API发送验证码。
- 如果发送成功,返回“验证码已发送”;失败则记录错误日志并返回提示。
4. 宝塔面板操作路径(适合无代码经验)
如果使用宝塔面板,可以安装“短信插件”或通过“计划任务”调用API。
以宝塔的“网站”->“站点设置”->“配置文件”为例,可以在PHP配置中增加自定义函数文件,然后通过表单提交触发。
注意:不同CMS的表单位置不同,请先找到表单对应的提交地址(通常通过浏览器F12查看Network中的请求URL)。
三、避坑指南:常见错误与解决
- 签名或模板未审核通过:短信平台会返回错误码
isv.SMS_SIGNATURE_ILLEGAL。请检查签名和模板状态,审核通过后再试。 - 手机号格式错误:确保传入的是11位数字,不带+86或空格。
- AccessKey权限不足:子账号需要授予
AliyunDysmsFullAccess权限。 - 发送频率超限:同一个手机号1分钟内只能发1条,1小时内最多5条。建议在代码里加频率限制。
- 服务器时间不准:短信API要求请求时间与服务器时间误差不超过15分钟,请用
ntpdate同步时间。 - 验证码泄露:不要在前端返回验证码,只返回“发送成功”状态。
四、验证是否发送成功
配置完成后,按以下步骤验证:
- 在表单输入自己的手机号,点击“获取验证码”。
- 查看浏览器控制台Network,确认请求返回
{"code":"OK"}或类似成功状态。 - 检查手机是否收到短信,记录收到时间。
- 在短信平台控制台查看发送记录,确认状态为“发送成功”。
- 输入错误的验证码,确认表单会提示验证失败。
如果手机未收到短信,先检查短信平台余额和发送记录,再排查服务器日志中的API返回信息。
五、常见疑问
问:验证码存Session还是Redis?
答:单机站点用Session即可;多台服务器负载均衡时建议用Redis,保证验证码共享。
问:短信平台每天有免费额度吗?
答:不同服务商政策不同,部分平台提供每月100条免费额度,具体以官方控制台显示为准。
问:可以同时对接多个短信平台吗?
答:可以,但需要写多个发送函数,并按优先级或故障转移逻辑调用。建议初期先用一家,稳定后再考虑冗余。
问:表单提交后没收到短信,但API返回成功?
答:可能是手机号归属地运营商拦截,或者短信平台通道延迟。请等待1-2分钟,或联系短信平台客服查询通道状态。
按照以上步骤操作,大多数CMS都能在半小时内完成短信验证码对接。
如果遇到报错,优先查看短信平台返回的错误码和服务器日志,通常能快速定位问题。