nodejs实现短信业务

nodejs实现短信业务

1、一定要备案域名,不然短信业务无法使用。
2、申请到下述二个模块

在这里插入图片描述

3、选择原版SDK中node

在这里插入图片描述

4、申请AccessKey,申请一个管理密钥

在这里插入图片描述

5、搭建node环境并且安装pop-core
 npm install @alicloud/pop-core -S
6、实现短信登录(我使用koa框架,但是逻辑相同的)
const Core = require("@alicloud/pop-core");
const jwt = require("jsonwebtoken");
const { PRIVATE_KEY } = require("../app/config");
const SmsService = require("../service/sms.service");
const md5password = require("../utils/password-handle");

//存储手机号和获取的验证码
var loginInfo = [];

class smsController {
  async sendLoginCroeCode(ctx, next) {
    //获取手机号
    const { iphone } = ctx.request.body;
    //#随机6位验证码
    var code = "";
    //防止出0开头,阿里短信不允许0开头
    while(code[0]=='0'||code==''){
      let i=0;
      for (i; i < 6; i++) {
        let random = parseInt(Math.random() * 10);
        code = code + random;
      }
    }

    //# 存储手机号+验证码(方便验证)
    var client = new Core({
      accessKeyId: "你的ID!!!",
      accessKeySecret: "你的密钥!!",
      endpoint: "https://dysmsapi.aliyuncs.com",
      apiVersion: "2017-05-25",
    });
    var params = {
      PhoneNumbers: iphone,
      SignName: "bigbar", //标签名称,可填你网站名称
      TemplateCode: "SMS_213302143",
      TemplateParam: '{"code":' + `${code}` + "}",
    };
    var requestOption = {
      method: "POST",
    };
    
    try {
      if (true) {
      //进行发送短信
        const result = await client.request("SendSms", params, requestOption);
        if (result.Code == "OK") {
          // if (true) {
          loginInfo.push({
            iphone: iphone,
            code: code,
          });
          ctx.body = {
            status: 200,
            msg: "发送成功",
          };
        }
      }
    } catch (err) {
      ctx.body = {
        status: 400,
        msg: "发送失败",
      };
    }
  }
  //# 验证码登录接口
  async lphoneCodeLogin(ctx, next) {
    var { iphone, code } = ctx.request.body;
    //# 验证手机号是否已经发送个验证码
    let validate = (iphone) => {
      return loginInfo.some((item) => item.iphone === iphone);
    };
    //# 验证验证码是否一致
    let validateCode = (iphone, code) => {
      return loginInfo.some(
        (item) => item.iphone === iphone && item.code == code
      );
    };
    if (validate(iphone)) {
      //判断手机号是否发送过验证码
      if (validateCode(iphone, code)) {
        //判断验证码与手机号是否匹配
        code = md5password(code);
        const result = await SmsService.isRegister(iphone);
        if (result) {
          //注册过,把密码实时更新为验证码
          // await SmsService.UpdatePassword(iphone, code);
          //拉取登录信息
          let user = await SmsService.LoginMessage(iphone);
          const { id, name } = user[0];
          const token = jwt.sign({ id, name }, PRIVATE_KEY, {
            expiresIn: 60 * 60 * 24 * 30,
            algorithm: "RS256",
          });
          let status = "200";
          ctx.body = { id, name, token, status };
        } else {
          //没注册过,进行注册
          const password = md5password(iphone);
          await SmsService.RegisterInfo(iphone, password);
          //拉取登录信息
          let user = await SmsService.LoginMessage(iphone);
          const { id, name } = user[0];
          const token = jwt.sign({ id, name }, PRIVATE_KEY, {
            expiresIn: 60 * 60 * 24 * 30,
            algorithm: "RS256",
          });
          let status = "200";
          ctx.body = { id, name, token, status };
        }
        loginInfo = []; // 登录成功,立马清空数组,以免无法再次发送验证码
      } else {
        ctx.body = {
          status: 400,
          msg: "验证码错误",
        };
      }
    } else {
      ctx.body = {
        status: 400,
        msg: "未获取验证码",
      };
    }
  }
 
 //找回密码功能
  async findpassword(ctx,next) { 
    var { iphone, code, password } = ctx.request.body;
    //# 验证手机号是否已经发送个验证码
    let validate = (iphone) => {
      return loginInfo.some((item) => item.iphone === iphone);
    };
    //# 验证验证码是否一致
    let validateCode = (iphone, code) => {
      return loginInfo.some(
        (item) => item.iphone === iphone && item.code == code
      );
    };
    if (validate(iphone)) {
      //判断手机号是否发送过验证码
      if (validateCode(iphone, code)) {
        //判断验证码与手机号是否匹配
        password = md5password(password);
        console.log(password);
        const result = await SmsService.isRegister(iphone);
        if (result) {
          //验证通过修改密码
          await SmsService.UpdatePassword(iphone, password);
          ctx.body = {
            status:200,
            msg:"修改成功"
          }
        } else {
          //没注册过,进行注册
          await SmsService.RegisterInfo(iphone, password);
          ctx.body={
            status:200,
            msg: "由于你未注册,系统将给你自动注册,密码为你刚刚输入的",
          }
        }
        loginInfo = []; // 登录成功,立马清空数组,以免无法再次发送验证码
      } else {
        ctx.body = {
          status: 400,
          msg: "验证码错误",
        };
      }
    } else {
      ctx.body = {
        status: 400,
        msg: "未获取验证码",
      };
    }
  }
}

module.exports = new smsController();

7、实现成功!!

在这里插入图片描述

如有帮助到各位可以点个赞,欢迎加我qq1804357047进行交流

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可以方便地使用 JavaScript 编写后端服务器程序。华为云提供了一套短信服务 API,可以方便地实现短信验证功能。 要使用 Node.js 实现华为云短信验证,你可以先在华为云官网上注册账号并开通短信服务。然后,你可以在 Node.js 中使用 HTTP 模块发送 HTTP 请求到华为云的短信服务接口,以实现发送短信验证码的功能。以下是一个简单的 Node.js 示例代码: ``` const https = require('https'); const qs = require('querystring'); const accessKey = 'your_access_key'; // 替换为你的 Access Key const secretKey = 'your_secret_key'; // 替换为你的 Secret Key const region = 'cn-north-4'; // 替换为你的短信服务所在的区域 const sender = 'your_sender'; // 替换为你的短信发送者名称 const templateId = 'your_template_id'; // 替换为你的短信模板 ID const phoneNumber = 'your_phone_number'; // 替换为你要发送验证码的手机号码 // 生成签名字符串 function generateSignature(accessKey, secretKey, region, timestamp) { const hmac = require('crypto').createHmac('sha256', secretKey); hmac.update(`AccessKey=${accessKey}&Action=SendSms&Region=${region}&SecretKey=${secretKey}&SignatureMethod=HmacSHA256&SignatureNonce=${Math.random()}&SignatureVersion=2&TemplateID=${templateId}&Timestamp=${timestamp}&Version=2017-05-25`); return encodeURIComponent(hmac.digest('base64')); } // 发送短信验证码 function sendSmsCode(code) { const timestamp = new Date().toISOString().replace(/\..+/, '') + 'Z'; const signature = generateSignature(accessKey, secretKey, region, timestamp); const data = { Action: 'SendSms', Version: '2017-05-25', Region: region, PhoneNumber: phoneNumber, SignName: sender, TemplateParam: JSON.stringify({ code }), TemplateID: templateId, SignatureMethod: 'HmacSHA256', SignatureNonce: Math.random(), SignatureVersion: 2, AccessKeyId: accessKey, Timestamp: timestamp, Signature: signature }; const options = { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, hostname: `sms.${region}.myhuaweicloud.com`, path: '/v1.0/sms/send' }; const req = https.request(options, res => { let chunks = ''; res.on('data', chunk => chunks += chunk); res.on('end', () => console.log(chunks)); }); req.on('error', err => console.error(err)); req.write(qs.stringify(data)); req.end(); } // 发送一个随机的6位数验证码 sendSmsCode(Math.floor(Math.random() * 900000 + 100000)); ``` 以上代码通过生成签名字符串、构造请求数据和发送 HTTP 请求三个步骤实现了发送短信验证码的功能。你可以根据自己的需求和具体情况调整代码中的参数和逻辑。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值