微信小程序中短信验证码登录全流程及代码
短信验证码实现流程
1、构造手机验证码,生成一个6位的随机数字串;
2、使用接口向短信平台发送手机号和验证码,然后短信平台再把验证码发送到制定手机号上
3、将手机号验证码、操作时间存入Session,redis中,作为后面验证使用;
4、接收用户填写的验证码、手机号及其他注册数据;
5、对比提交的验证码与Session,redis中的验证码是否一致,同时判断提交动作是否在有效期内;
6、验证码正确且在有效期内,请求通过,处理相应的业务。

package com.foen.utils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.http.HttpRequest; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.foen.car.dto.BaseResultDto; import com.foen.car.service.RedisService; import org.apache.commons.lang.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * 手机短信通信类 * @auther: 作者 gzh * @description: 类说明 * @Date: created in 9:45 2020/5/27 */ public class MoblieMessageUtil { private static final Logger logger = LoggerFactory.getLogger(MoblieMessageUtil.class); // 产品名称:云通信短信API产品,开发者无需替换 private static final String product = "Dysmsapi"; private static final String domain = "dysmsapi.aliyuncs.com"; // 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) private static String accessKeyId = "---"; private static String accessKeySecret = "---"; private static String signName = "--"; private static String identifyingTempleteCode = "{\"code\":\"1111\"}"; private static String registTempleteCode = "---"; public static BaseResultDto sendSmsCode(String tel, String code, HttpServletRequest httpServletRequest) { BaseResultDto baseResultDto = Utils.baseDefaultResultMessageError(); DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain("dysmsapi.aliyuncs.com"); request.setSysVersion("2017-05-25"); request.setSysAction("SendSms"); request.putQueryParameter("RegionId", "cn-hangzhou"); request.putQueryParameter("PhoneNumbers", tel); request.putQueryParameter("SignName", signName); request.putQueryParameter("TemplateCode", registTempleteCode); request.putQueryParameter("TemplateParam","{\"code\":"+code+"}" ); request.putQueryParameter("SmsUpExtendCode", code); try { CommonResponse response = client.getCommonResponse(request); logger.info("==>"+response.getData()); if(response.getData().indexOf("OK")!=-1){ baseResultDto=Utils.renderBaseResultDtoSuccess("短信发送成功"); }else{ baseResultDto=Utils.renderBaseResultDtoError(response.getData()); } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return baseResultDto; } /** * 保存数据到session * @param request * @param code * @param phone */ private static void setSendSmsCode(HttpServletRequest request,String code,String phone){ Session session = SecurityUtils.getSubject().getSession(); session.setAttribute(Constants.CRM_STR+phone, code); try { final Timer timer=new Timer(); timer.schedule(new TimerTask() { @Override public void run() { String yxcode1 = (String) session.getAttribute(Constants.CRM_STR+phone); if(StringUtils.isNotEmpty(yxcode1)){ session.removeAttribute(Constants.CRM_STR+phone); } timer.cancel(); } },Constants.SIGN_EXPIRED_TIME); } catch (Exception e) { e.printStackTrace(); } } public static void setRegistData(RedisService service, String phone, String code){ service.setValue(Constants.CRM_STR+phone,code); service.setValue(Constants.CRM_TIME+phone,DateUtils.dateToStringFromat()); try { //TimerTask实现5分钟后从session.resdis中删除checkCode final Timer timer=new Timer(); timer.schedule(new TimerTask() { @Override public void run() { String phone_ = service.getValue(Constants.CRM_STR+phone); String vcode_ = service.getValue(Constants.CRM_TIME+phone); if(StringUtils.isNotEmpty(phone_)){ service.delete(Constants.CRM_STR+phone); } if(StringUtils.isNotEmpty(vcode_)){ service.delete(Constants.CRM_TIME+phone); } timer.cancel(); } },Constants.SIGN_EXPIRED_TIME); } catch (Exception e) { e.printStackTrace(); } } }
短信验证码实现流程
1、构造手机验证码,生成一个6位的随机数字串;
2、使用接口向短信平台发送手机号和验证码,然后短信平台再把验证码发送到制定手机号上
3、将手机号验证码、操作时间存入Session,redis中,作为后面验证使用;
4、接收用户填写的验证码、手机号及其他注册数据;
5、对比提交的验证码与Session,redis中的验证码是否一致,同时判断提交动作是否在有效期内;
6、验证码正确且在有效期内,请求通过,处理相应的业务。
//构造手机验证码,生成一个6位的随机数字串;
public static String runNumber() { String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; StringBuilder sb=new StringBuilder(4); for(int i=0;i<6;i++) { char ch=str.charAt(new Random().nextInt(str.length())); sb.append(ch); } System.out.println(sb.toString()); String code = sb.toString(); return code; }
参考:
阿里短信通
https://help.aliyun.com/document_detail/101893.html?spm=a2c4g.11186623.6.649.37f460e2WewZdf
————————————————
版权声明:本文为CSDN博主「zuoliangzhu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zuoliangzhu/article/details/81219900
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~