首页 > 其他分享 >.NET MVC 短信验证码过程

.NET MVC 短信验证码过程

时间:2023-12-19 16:15:03浏览次数:41  
标签:sMSInfo 验证码 DbType MVC result new NET public

原文链接:https://blog.csdn.net/weixin_44481764/article/details/97941984

1:创建一个项目用来调用第三方的类,右键Nuget添加第三方的引用类库 qcloudsms_csharp

2:把第三方的公共类放入到我们的项目里

using qcloudsms;
using qcloudsms_csharp.httpclient;
using qcloudsms_csharp.json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MiShop.Remote
{
public class TenXunYunSMS
{
//appId
public int appId;
//appKey
public string appKey = "";
//短信模板ID
private int tmplateId = 379257;
//签名内容
private string smsSign = "7hhhcn";
/// <summary>
/// 验证码
/// </summary>
public int Code { get; set; }
/// <summary>
/// 发送验证码
/// </summary>
/// <param name="phone"></param>
/// <returns></returns>
public void SetSMS(string phone)
{
Random random = new Random();
int code = random.Next(100000, 999999);
try
{
SmsSingleSender ssender = new SmsSingleSender(appId, appKey);
var result = ssender.sendWithParam("86", phone,
tmplateId, new[] { code.ToString() }, smsSign, "", ""); // 签名参数未提供或者为空时,会使用默认签名发送短信
}
catch (JSONException ex)
{
throw;
}
catch (HTTPException ex)
{
throw;
}
catch (Exception ex)
{
throw;
}
Code = code;
}
}
}
3:创建一张短信发送记录表 

//信息记录表
public class SMSInfo
{
public int Id { get; set; }
public int Code { get; set; }
public Int64 TelPhone { get; set; }
//创建时间
public DateTime CreateTime { get; set; }
//短信过期时间
public DateTime ExpireTime { get; set; }
}
4:数据访问层写插入短信信息表方法

public class SMSInfoRepository
{
/// <summary>
/// 将验证码和电话保存至数据库
/// </summary>
/// <param name="sMSInfo"></param>
/// <returns></returns>
public int InsertSMSInfo(SMSInfo sMSInfo)
{
int result = -1;
string sql = @"insert into SMSInfo values(@Code, @TelPhone, @CreateTime, @ExpireTime)";
SqlParameter[] sqlParameter = {
new SqlParameter(){
DbType=DbType.Int32,
ParameterName="@Code",
Value=sMSInfo.Code
},
new SqlParameter(){
DbType=DbType.Int64,
ParameterName="@TelPhone",
Value=sMSInfo.TelPhone
},
new SqlParameter(){
DbType=DbType.DateTime,
ParameterName="@CreateTime",
Value=DateTime.Now
},
new SqlParameter(){
DbType=DbType.DateTime,
ParameterName="@ExpireTime",
Value=DateTime.Now.AddMinutes(5)
}
};
DBHelper dBHelper = new DBHelper();
result =dBHelper.ExcuteNoQuery(sql,sqlParameter);
return result;
}
/// <summary>
/// 查询电话和验证码是否正确
/// </summary>
/// <param name="sMSInfo"></param>
/// <returns></returns>
public int SelCodePhone(SMSInfo sMSInfo)
{
int result = -1;
string sql = @"select COUNT(1) from SMSInfo where Code=@Code and TelPhone=@TelPhone and ExpireTime>@ExpireTime";
SqlParameter[] sqlParameter = {
new SqlParameter(){
DbType=DbType.Int32,
ParameterName="@Code",
Value=sMSInfo.Code
},
new SqlParameter(){
DbType=DbType.Int64,
ParameterName="@TelPhone",
Value=sMSInfo.TelPhone
},
new SqlParameter(){
DbType=DbType.DateTime,
ParameterName="@ExpireTime",
Value=DateTime.Now
}
};
DBHelper dBHelper = new DBHelper();
result = dBHelper.ExecuteScalar(sql, sqlParameter);
return result;
}
}


5:业务层:先引用第三方项目,先调用第三方类,发送验证码,然后将验证码存储到短信信息对象,最后调用数据访问层的插入短信的方法。

public class SMSInfoSerivice
{
/// <summary>
/// 获取验证码同时将验证码保存至数据库
/// </summary>
/// <param name="phone"></param>
/// <returns></returns>
public bool GetCode(string phone)
{
//调用第三方类
TenXunYunSMS tenXunYunSMS;
try
{
tenXunYunSMS = new TenXunYunSMS();
tenXunYunSMS.appId = Convert.ToInt32(ConfigurationManager.AppSettings["appId"]);
tenXunYunSMS.appKey = ConfigurationManager.AppSettings["appKey"];
tenXunYunSMS.SetSMS(phone);
}
catch (Exception)
{

return false;
}
SMSInfoRepository sMSInfoRepository = new SMSInfoRepository();
//创建信息对象保存验证码和电话号码
SMSInfo sMSInfo = new SMSInfo();
//将验证码存储到短信信息对象
sMSInfo.Code = tenXunYunSMS.Code;
sMSInfo.TelPhone = Convert.ToInt64(phone);
//调用插入短信信息的方法 成功返回true
return sMSInfoRepository.InsertSMSInfo(sMSInfo)>0;
}
/// <summary>
/// 查询电话和验证码是否正确
/// </summary>
/// <param name="sMSInfo"></param>
/// <returns></returns>
public bool SelCodePhone(SMSInfo sMSInfo)
{
SMSInfoRepository sMSInfoRepository = new SMSInfoRepository();
return sMSInfoRepository.SelCodePhone(sMSInfo)>0;
}
}


6:控制器写一个JsonResult的发送验证码方法需要接收手机号 

public JsonResult GetCode(string phone)
{
Operate operate = new Operate();
SMSInfoSerivice sMSInfoSerivice = new SMSInfoSerivice();
operate.Success = sMSInfoSerivice.GetCode(phone);
return Json(operate);
}

7:控制器写一个JsonResult的校验验证码方法需要接收短信信息对象 

//点击注册时查询电话号码与短信验证码是否存在
public JsonResult SelCodePhone(SMSInfo sMSInfo)
{
Operate operate = new Operate();
SMSInfoSerivice sMSInfoSerivice = new SMSInfoSerivice();
operate.Success = sMSInfoSerivice.SelCodePhone(sMSInfo);
return Json(operate);
}

8:页面点击获取验证码按钮:先禁用按钮,然后ajax post提交到控制器对应的发送验证码方法,传入手机号,然后success处理返回的结果。

//点击获取验证
$("#GetCode").click(function () {
var tel = $("#tel").val();
$.ajax({
url: "/SMSCode/GetCode?phone=" + tel,
type: "post",
success: function (result) {
if (result.Success) {
alert("获取成功");
//调用短信验证计时器方法
IntervalSMS();
}
else {
alert("获取失败");
}
}
})
})

//短信验证计时器
function IntervalSMS() {

$("#GetCode").attr("disable", "disabled");
$("#GetCode").css("color", "red");

var time = 30;
$("#GetCode").val(time + " S后重新获取验证码");

var timer = setInterval(function () {
if (time > 0) {
time--;
$("#GetCode").val(time + " S后重新获取验证码");
}
else {
$("#GetCode").removeAttr("disable").css("color", "black");
$("#GetCode").val("重新获取验证码");
clearInterval(timer);
}
}, 1000)
}


9:点击注册按钮,写一个校验验证码的方法,校验通过之后才能注册。 

//注册按钮 查询记录 为true进行保存注册
$("#btnRe").click(function () {

if (ckname == true && ckphone == true && ckrepwd == true && ckpwd == true) {

var SMSInfo = {};
SMSInfo.TelPhone = $("#tel").val();
SMSInfo.Code = $("#yan").val();
$.ajax({
url: "/SMSCode/SelCodePhone",
type: "post",
data: SMSInfo,
success: function (result) {
if (result.Success) {
//点击注册时查询电话和验证码是否正确 正确则调用该方法进行注册
reg();
}
else {
alert("短信验证码不存在");
return;
}
}
})
}
else {
alert("信息验证未通过无法注册成功");
}


//点击注册时查询电话和验证码是否正确 正确则调用该方法进行注册
function reg() {
var userInfo = {};
userInfo.UserName = $("#username").val();
userInfo.UserPwd = $("#password").val();
userInfo.UserPhone = $("#tel").val();
$.ajax({
url: "/Register/SaveUserInfo",
data: userInfo,
type: "post",
success: function (result) {
if (result.Success) {
alert("注册成功");
}
else {
alert("注册失败");
}
}
})
}

标签:sMSInfo,验证码,DbType,MVC,result,new,NET,public
From: https://www.cnblogs.com/Dongmy/p/17913988.html

相关文章

  • WiMinet 评说1.2:多跳无线网络的困境
    1、前言    在工业应用中,低速率,大规模和长距离的无线自组织网络一直没有得到广泛的部署,根本原因在于其稳定性,可靠性和实时性一直无法得到良好的保证。在这种自组织网络中,节点之间的跳转关系大多是根据其相对位置和信号强度来决定的;由于安装位置,部署密度,启动时间等差异,其网......
  • 验证码:防范官网恶意爬虫攻击,保障用户隐私安全
    网站需要采取措施防止非法注册和登录,验证码是有效的防护措施之一。攻击者通常会使用自动化工具批量注册网站账号,以进行垃圾邮件发送、刷量等恶意活动。验证码可以有效阻止这些自动化工具,有效防止恶意程序或人员批量注册和登录网站。恶意程序或人员通常会使用暴力破解等方式尝试登......
  • 验证码相关后端逻辑
    响应结果  注:后端会将需要展示的图片封装在通用返回结果类中传递给前端,前端将用户输入的答案传递给后端进行相应校验    在进行redis存储时,key值一般都会进行相应拼接,并且设置过期时间    通用结果类继承HashMap,便于后续增加字段信息 生成相应图片 ......
  • php mvc框架怎么实现路由的?
    都知道路由是实现框架重要的一步。如果对怎么实现框架感兴趣那必须要了解,而且对自己对正则表达是更加深刻了解。m----------模型v-----------视图c-----------控制器mvc模式就不想多说,网上解释的一大堆,各种理解。这个标准还是比较宽松的,看自己怎么理解。本文重点是是......
  • 如何在 ASP.NET Core 中使用 Route 特性
    ASP.NETCore中的Route中间件的职责在于将request匹配到各自Route处理程序上,Route分两种:基于约定和基本特性模式。基于约定模式的Route采用集中化的方式,而基于特性的方式允许你在Action或者Controller上单独定义,到底采用哪一种可以基于你自己的应用场景,本篇就......
  • EtherCAT转PROFINET工业网关-GT200-PN-EC
    GT200-PN-EC是实现PROFINET控制器和EtherCAT伺服或变频器设备之间的数据交换网关。它可以将多个EtherCAT设备连接到PROFINET网络中,并在它们之间建立可靠的通信通道。产品特点:1、使用方便:用户不必了解复杂的PROFIdrive行规和CIA402协议规范,西门子PLC通过此网关控制EtherCAT总线......
  • linux 下安装.net 8环境
    1.从官网下载对应的运行时环境压缩包。下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/8.02.安装SDK下载完成后,打开终端并运行以下命令以提取SDK并使这些命令在终端上可用。TerminalCopymkdir-p$HOME/dotnet&&tarzxfdotnet-sdk-8.0.100-linux-x6......
  • centos 7.9 二进制部署 kubernetes v1.27.7
    文章目录1.预备条件2.基础配置2.1配置root远程登录2.2配置主机名2.3安装ansible2.4配置互信2.5配置hosts文件2.6关闭防firewalld火墙2.7关闭selinux2.8关闭交换分区swap2.9修改内核参数2.10安装iptables2.11开启ipvs2.12配置limits参数2.13配置yum2.14配置时钟......
  • 简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示
    前言在Web应用开发中,经常需要实现PDF文件的加载和显示功能。本文小编将为您介绍如何在ASP.NETCore中实现这一功能,以便用户可以在Web应用中查看和浏览PDF文件。实现步骤1)在服务器端创建PDF打开VisualStudio并创建新的ASP.NETCoreWeb应用程序,小编这里项目名称为Create......
  • 第一章:SpringMVC的概述及简介
    一、springMVC课程介绍二、springMVC导学、回顾三、springMVC的简介和特点......