必须通过后端或unicloud云函数中转发送短信验证码,前端直调会失败;报“缺少smskey”或“undefined is not a function”是因未关联uni-cloud-sms扩展库,需右键云函数目录→关联扩展库→勾选并确认package.json含该依赖。

不能在 uni-app 前端直接调用短信平台 API 发送验证码,必须走自有后端或 uniCloud 云函数中转——这是硬性前提,跳过就收不到验证码。
uniCloud.sendSms 报错“缺少 smsKey”或“undefined is not a function”
这说明你没正确关联 uni-cloud-sms 扩展库。自 HBuilderX 3.4.0 起,短信能力已剥离为独立扩展库,不手动关联就无法使用 uniCloud.sendSms。
- 右键云函数目录 →「关联扩展库」→ 搜索并勾选
uni-cloud-sms - 检查云函数根目录下的
package.json,确认存在类似"uni-cloud-sms": "^1.0.0"的依赖项 - 旧版
uni-id-pages(smsKey/smsSecret,必须升级 - 关联后无需
import,但若本地调试报错,需重启 HBuilderX 并重新部署云函数
云函数里 uniCloud.sendSms 参数填错导致“发送成功”但手机没响
参数不是“能不能发”,而是“发给谁、用哪个模板、填什么变量”。错一个,短信就卡在审核链路里。
-
phone或phoneList二选一:单个用phone: "13812345678";批量最多 50 个,用phoneList: ["13812345678"] -
templateId必须是已通过审核的模板 ID,形如SMS_123456789,不是模板名称或内容 -
data是对象,字段名必须和模板中${xxx}完全一致,比如模板含${code}和${expMinute},就传{ code: "123456", expMinute: "5" } -
appid取自项目manifest.json中的name字段值(不是包名、不是应用显示名)
前端调用云函数后控制台显示 success,但真机没收到短信
问题大概率不在云函数本身,而在前端链路或配置环节——这三个地方错一个,就永远停在“假成功”里。
- 没做手机号格式校验:
/^1[3-9]\d{9}$/必须在前端先拦住非法输入,否则云函数可能静默失败 - 没绑定页面生命周期:倒计时用
setInterval启动后,必须在onUnload或onHide里clearInterval(timer),否则切后台再回来会卡死或叠加 - 没处理云函数错误码:
uniCloud.callFunction成功只代表请求发出去了,要检查e.result.errCode,常见如40001(模板未报备)、40002(签名不匹配)、40003(变量缺失)
为什么不能用 uni.request 直连阿里云/腾讯云短信 API
因为所有主流短信平台都强制要求服务端签名鉴权,secretKey 绝对不可出现在前端代码里。uni-app 打包后源码可被反编译,硬塞密钥等于公开送钥匙。
- 常见错误现象:
uni.request直连短信平台 API,开发工具里“发送成功”,真机却静默失败 - 实操唯一合规路径:要么部署自己的 Node.js / PHP / Java 后端提供
/api/send-sms接口;要么用uniCloud云函数,把密钥存在环境变量或云函数配置中 - 务必在服务端做手机号格式校验、60 秒防刷(Redis 存
sms:138xxxx1234+ 过期时间)、错误日志落盘——前端无法替代这些逻辑
真正卡点不在代码长短,而在密钥存哪、模板报备是否通过、以及云函数里 data 字段名和模板占位符是否一字不差——这三个地方最容易被忽略,也最难排查。











