微信云开发怎么写腾讯发短信验证码云函数
分类: 微信小程序 专栏: 小程序 标签: 云开发 短信验证码 云函数
2024-11-26 11:55:05 437浏览
思路:
写一个发送短信的云函数(为啥写云函数,你可以把云函数理解为后台,云函数调用短信接口相对安全),还要创建一个发送手机的日志表(云数据库里创建)sendmsg_list记录验证码,手机号,日期,过期时间,发送总次数,对短信进行管理,避免有人无限点击发送短信。发送短信很简单,就是找文档费了一些时间
api文档:
https://cloud.tencent.com/document/product/382/43197
先看云函数sendmsg

需要安装依赖,进去该文件夹绝对路径,cmd
npm install wx-server-sdk npm install tencentcloud-sdk-nodejs
index.html代码
// 云函数入口文件
//文档https://cloud.tencent.com/document/product/382/43197
const cloud = require('wx-server-sdk')
const tencentcloud = require("tencentcloud-sdk-nodejs")
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
const timelen=5 ;//短信有效期5分钟
const maxnum=5 ;// 一天可发送5条
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext();
let openid=wxContext.OPENID;
let phone=event.phone;
let day=event.day;
let TemplateId='';
if(event.type=='login')TemplateId='xxx';
if(event.type=='reg')TemplateId='xxx';
if(event.type=='findupass')TemplateId='xxx';
//验证手机号
let resuu=await db.collection('user_list').where({phoneNumber:phone}).get()
let uli=resuu.data;
if(uli.length==0){
if(event.type=='login'||event.type=='findupass') {
return {openid:openid,status:0,msg:'该手机不存在'}
}
}else{
if(event.type=='reg') {
return {openid:openid,status:0,msg:'该手机已注册'}
}
}
//查询日志
let res=await db.collection('sendmsg_log').where({phone:phone,day:day}).orderBy('endts', 'desc').get()
console.log(res,"------------sendmsgyun--------")
let li=res.data;
let sendresult=0;
if(li.length==0){
sendresult= await sengmessfunc(phone,openid,TemplateId,null,null,day)
}else{
let lo=li[0];
if(lo.num>=maxnum)return {openid:openid,status:0,msg:'短信发送频繁,请明天重试'}
sendresult=await sengmessfunc(phone,openid,TemplateId,lo._id,lo.num,day)
}
if(sendresult==0) return {openid:openid,status:0,msg:'发送失败,系统错误'}
return {openid:openid,status:1,msg:'短信已发送,有效期'+timelen+'分钟'}
}
//发送短信
async function sengmessfunc(phone,openid,TemplateId,id,num,day){
let code =rand( ) ;
const smsClient = tencentcloud.sms.v20210111.Client ;
const client = new smsClient({
credential: {
secretId: "xxx",
secretKey: "xxx",
},
region: "ap-guangzhou",
profile: {
signMethod: "HmacSHA256",
httpProfile: {
reqMethod: "POST", // 请求方法
reqTimeout: 120, // 请求超时时间,默认60s
endpoint: "sms.tencentcloudapi.com"
},
},
})
const params = {
SmsSdkAppId: "xxx",
SignName: "xxx",
TemplateId: TemplateId,
TemplateParamSet: [code],
PhoneNumberSet: ["+86"+phone],
}
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
client.SendSms(params , function (err, response) {
// 请求异常返回,打印异常信息
if (err) {
console.log(err)
return 0;
}
// 请求正常返回,打印response对象
console.log(response)
if(id!=null&&num!=null ){
updatemsglog( id, num ,code);
}else{
addmsglog(phone,day,code);
}
return 1;
})
}
function updatemsglog( id,num ,code){
num=num+1;
db.collection('sendmsg_log').where({
_id: id
}).update({
data: {
"num": num,
"code":code,
"endts": Date.now()+timelen*60*1000,
}
})
}
function addmsglog(phone,day,code){
db.collection('sendmsg_log').add({
data: {
"phone":phone,
"day":day,
"num":1,
"endts": Date.now()+timelen*60*1000,
"code":code
}
})
}
function rand( ) {
//获取随机四位数字
let s="";
for(let i=0;i<4;i++){
s+=parseInt(Math.random()*10)+""
}
return s;
}
说明:一定看文档,那里面写了哪里获取这些配置参数,返回值必须有openid,否则调用云函数后result返回值为空;sendmsg_list表权限设置一下,我设置的是所有者可读,仅创建者可读写。否则你会发现你程序改不了sendmsg_list里的数据。
写完云函数记得上传和部署
调用云函数代码
wx.cloud.callFunction({
name: 'sendmsg',
data: {
phone:phoneNumber,
day:day,
type:type,
},
success(res) {
console.log('sendmsg==0---', res);
wx.showToast({
title: res.result.msg,
icon: 'none'
})
}
})这里只贴关键代码,因为我是注册,登录,忘记密码都用了这个云函数,所以我封装了工具类统一处理发短信和页面点击发送按钮倒计时。
然后,用户点击提交按钮需要验证码短信验证码是否正确和超时,这个也最好写道云函数里,这样安全一些哦,验证的云函数我就不贴了,和上面的代码比非常简单了。
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论

java
vue
springboot
Mysql
ssm
小程序
uniapp
js和jquery