必须通过uniCloud云函数调用短信服务,因前端直连会暴露密钥且受跨域、签名等限制;云函数可安全读取环境变量完成合法签名,推荐使用DCloud官方短信服务并注意模板审核、防刷及定时器清理。

不能在前端直接调用短信 API,必须走 uniCloud 云函数或自有后端——这是唯一安全、可用的路径。
为什么 uni.request 直连阿里云/腾讯云 SMS 会失败
所有主流短信平台(阿里云 SMS、腾讯云 SMS、容联云)都强制服务端签名鉴权:secretKey 绝对不可出现在前端代码里。uni-app 打包后源码可被反编译,硬塞密钥等于公开送钥匙。
- 常见错误现象:
uni.request直连第三方 API,控制台无报错但短信永不抵达;开发工具里“发送成功”,真机却静默失败 - 根本原因:H5/App/小程序三端均无法绕过跨域、CORS、Referer 校验、签名白名单等服务端强制拦截机制
- uniCloud 云函数天然运行在服务端,能安全读取环境变量中的
smsSecret,完成合法签名
uniCloud 云函数中如何调用短信服务
推荐使用 DCloud 官方短信服务(已集成阿里云/腾讯云通道),而非自己封装 SDK——省去证书、签名、重试、限流等细节,且凭证自动注入。
- 开通后会在云函数环境变量中自动注入
smsKey和smsSecret,无需手动配置 - 云函数内调用
uniCloud.sendSms,传入phone、templateId、data即可 - 注意:
templateId必须已在 DCloud 短信后台完成模板审核,且状态为“已启用” - 示例代码(云函数
send-sms的index.js):
exports.main = async (event, context) => {
const { phone, templateId, data } = event
try {
await uniCloud.sendSms({
phone,
templateId,
data
})
return { code: 0, msg: '发送成功' }
} catch (err) {
console.error('短信发送失败', err)
return { code: -1, msg: err.message || '发送失败' }
}
}
前端调用时必须处理的三个关键点
前端不是“发不发”的问题,而是“怎么发才不崩、不重、不错乱”。
- 倒计时必须绑定页面生命周期:
onUnload中清除setInterval,否则切后台再切回,定时器会叠加或卡死 - 手机号格式校验必须双端做:前端用
/^1[3-9]\d{9}$/过滤明显错误,服务端仍需二次校验(防绕过) - 防刷逻辑必须落在服务端:用
redis或uniCloud.database记录sms:138xxxx1234+ 过期时间,60 秒内拒绝重复请求 - 调用云函数用
uniCloud.callFunction,别用uni.request走自建接口(除非你明确需要自定义网关逻辑)
最容易被忽略的是服务端防刷和前端定时器清理——这两个点不出问题时一切正常,一出就是批量重发、用户投诉、短信费用激增。别等上线后再补。











