Files
jjx-web/uniCloud-tcb/cloudfunctions/router/service/user/pub/sendSmsCode.js
T
2026-10-08 18:18:21 +08:00

87 lines
3.7 KiB
JavaScript

var everyDaylimit = 12; // 限制同一个手机号每天次数
module.exports = {
/**
* 发送短信的验证码
* @url user/pub/sendSmsCode 前端调用的url参数地址
* @description 发送验证码
* data 请求参数 说明
* @param {String} mobile 手机号
* @param {String} type 验证码类型
* @param {Boolean|String} checkUserExist 是否需要检测手机号对应的账号是否存在或不存在,默认不检测,若为exists代表手机号必须已注册,若为!exists代表手机号必须未注册
*
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
* @param {Object} requestRes 原始返回数据
* @param {Object} requestParam 包含服务供应商和发送的手机号
*/
main: async (event) => {
let {data = {}, userInfo, util, originalParam} = event;
let {uniID, config, pubFun, vk, db, _} = util;
let {uid} = data;
let res = {code: 0, msg: ''};
// 业务逻辑开始-----------------------------------------------------------
let {
mobile,
type,
checkUserExist = false
} = data;
if (vk.pubfn.isNull(mobile)) {
return {code: -1, msg: '手机号不能为空'};
}
if (!vk.pubfn.test(mobile, 'mobile')) {
return {code: -1, msg: "手机号格式错误"};
}
if (checkUserExist) {
let dcloud_appid = originalParam.context.appId;
// 检测手机号对应的账号是否存在
let num = await vk.daoCenter.userDao.count({
mobile,
// dcloud_appid: _.or(_.eq(dcloud_appid), _.exists(false))
});
if (checkUserExist === true || checkUserExist === "exists") {
// 手机号必须已注册用户,如果手机号未注册,则不发短信
if (num === 0) {
return {code: -1, msg: `手机号:${mobile} 未注册`, notExists: true};
}
} else if (checkUserExist === "!exists") {
// 手机号必须未注册用户,如果手机号已注册,则不发短信
if (num > 0) {
return {code: -1, msg: `手机号:${mobile} 已注册`, exists: true};
}
}
}
// 针对同一个手机号,发送验证码每天有次数限制
const cacheKey = `sys.sendSmsCode.everyDaylimit-${mobile}`;
let currNum = await vk.globalDataCache.get(cacheKey);
if (!currNum) currNum = 0;
if (currNum >= everyDaylimit) {
return {code: -1, msg: "此手机号今日已超最大次数限制,请明日再试"};
}
let code = vk.pubfn.random(6, "0123456789");
let provider = "unicloud";
if (vk.pubfn.getData(config, "vk.service.sms.aliyun.enable")) {
provider = "aliyun";
}
res = await vk.system.smsUtil.sendSmsVerifyCode({
provider,
code,
type,
phone: mobile,
expiresIn: 180, // 验证码实际有效时间,必须是60的倍数
});
if (res.code == 0) {
currNum++;
let {startTime} = vk.pubfn.getDayOffsetStartAndEnd(1, new Date());
let second = vk.pubfn.toDecimal((startTime - Date.now()) / 1000, 0)
await vk.globalDataCache.set(cacheKey, currNum, second);
await vk.globalDataCache.set(`${type}-${mobile}-code`, code, 180)
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}