微信云开发怎么写腾讯发短信验证码云函数
分类: 微信小程序 专栏: 小程序 标签: 云开发 短信验证码 云函数
2024-11-26 11:55:05 115浏览
思路:
写一个发送短信的云函数(为啥写云函数,你可以把云函数理解为后台,云函数调用短信接口相对安全),还要创建一个发送手机的日志表(云数据库里创建)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)展开评论
展开评论