微信云开发怎么写腾讯发短信验证码云函数

无敌的宇宙
无敌的宇宙
擅长邻域:Java,HTML,JavaScript,MySQL,支付,退款,图片上传

分类: 微信小程序 专栏: 小程序 标签: 云开发 短信验证码 云函数

2024-11-26 11:55:05 115浏览

用云函数发送短信验证码,以及验证短信验证码的正确与否

思路:

写一个发送短信的云函数(为啥写云函数,你可以把云函数理解为后台,云函数调用短信接口相对安全),还要创建一个发送手机的日志表(云数据库里创建)sendmsg_list记录验证码,手机号,日期,过期时间,发送总次数,对短信进行管理,避免有人无限点击发送短信。发送短信很简单,就是找文档费了一些时间


api文档:

https://cloud.tencent.com/document/product/382/43197

先看云函数sendmsg 

image.png

 

需要安装依赖,进去该文件夹绝对路径,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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695