You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.0 KiB
86 lines
3.0 KiB
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);
|
|
}
|
|
// 业务逻辑结束-----------------------------------------------------------
|
|
return res;
|
|
}
|
|
}
|