94 lines
2.5 KiB
TypeScript
94 lines
2.5 KiB
TypeScript
import { PrismaClient } from "@prisma/client";
|
||
import qmAPI from "quanmsms";
|
||
|
||
const config = useRuntimeConfig();
|
||
const smsApi = new qmAPI(config.apiOpenid.toString(), {
|
||
sms: {
|
||
apiKey: config.apiApikey,
|
||
},
|
||
});
|
||
const db = new PrismaClient();
|
||
function generateRandomCode(length: number) {
|
||
let code = "";
|
||
//const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';复杂验证码
|
||
const possible = "0123456789";
|
||
for (let i = 0; i < length; i++) {
|
||
code += possible.charAt(Math.floor(Math.random() * possible.length));
|
||
}
|
||
return code;
|
||
}
|
||
function generateDeadline() {
|
||
const now = new Date(); // 获取当前时间
|
||
const threeMinutesLater = new Date(now.getTime() + 3.5 * 60 * 1000); // 加上3分钟
|
||
return threeMinutesLater.toISOString(); // 转换为ISO格式字符串
|
||
}
|
||
|
||
function send(telstr: string) {
|
||
let tel = parseInt(telstr);
|
||
const code = generateRandomCode(6);
|
||
let param = {
|
||
tel: tel,
|
||
model_id: config.apiSmsId.toString(),
|
||
model_args: {
|
||
//模板id对应的变量key值,object格式,内部自动处理成平台要求的str
|
||
code: code,
|
||
// 如果你的模板没变量,该值可为空
|
||
},
|
||
};
|
||
return smsApi
|
||
.sendSMS(param)
|
||
.then((response: { code: number; state: number }) => {
|
||
if (response.state == 200) {
|
||
db.register
|
||
.create({
|
||
data: {
|
||
phone: telstr,
|
||
deadline: generateDeadline(),
|
||
code: code,
|
||
},
|
||
})
|
||
.then((reg) => {
|
||
if (reg.phone == telstr) {
|
||
console.info(telstr + "发送成功");
|
||
}
|
||
});
|
||
return { code: 1, msg: "发送成功" };
|
||
} else {
|
||
console.info(tel);
|
||
return { code: 0, msg: "发送失败", error: response };
|
||
}
|
||
// 你的业务代码
|
||
});
|
||
}
|
||
|
||
export default defineEventHandler(async (event) => {
|
||
const body = await readBody(event);
|
||
let isSend =
|
||
(await db.register.findFirst({
|
||
where: {
|
||
phone: body.phone,
|
||
},
|
||
})) != null;
|
||
if (isSend) {
|
||
const register = (await db.register.findFirst({
|
||
where: {
|
||
phone: body.phone,
|
||
},
|
||
orderBy: {
|
||
deadline: "desc", // 'asc' 表示升序,'desc' 表示降序
|
||
},
|
||
})) || {
|
||
deadline: new Date(),
|
||
};
|
||
const deadlineDate = new Date(register.deadline);
|
||
const now = new Date();
|
||
if (now <= deadlineDate) {
|
||
return { code: 2, msg: "三分钟内请勿重发送" };
|
||
} else {
|
||
return send(body.phone);
|
||
}
|
||
} else {
|
||
return send(body.phone);
|
||
}
|
||
});
|