ylb-接口7注册发送短信

总览:
在这里插入图片描述

在common模块下引入短信验证码的依赖项(生成4位随机数):
在这里插入图片描述
在web模块下的resources/application.yml,添加配置信息(京东万象):

#短信配置
jdwx:sms:url: https://way.jd.com/chuangxin/dxjkappkey: 3680fa919b771148da626bbcbd459475content: 【大富科技】你的验证码是:%s,3分钟内有效,请勿泄露给他人login-text: 【大富科技】登录验证码是:%s,3分钟内有效,请勿泄露给他人realname:url: https://way.jd.com/youhuoBeijing/testappkey: 3680fa919b771148da626bbcbd459475

在web模块下的config包,创建一个短信配置类(JdwxSmsConfig):

package com.bjpowernode.front.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "jdwx.sms")
public class JdwxSmsConfig {private String url;private String appkey;private String content;private String loginText;public String getLoginText() {return loginText;}public void setLoginText(String loginText) {this.loginText = loginText;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getAppkey() {return appkey;}public void setAppkey(String appkey) {this.appkey = appkey;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

在web模块下的service包,创建一个短信接口(SmsService):

package com.bjpowernode.front.service;public interface SmsService {/*** @param phone 手机号* @return true:发送成功,false 其他情况*/boolean sendSms(String phone);
}

并实现这个接口(SmsCodeRegisterImpl):注册发送短信验证码
步骤:
1、随机生成4位短信验证码
2、使用http接受用户响应的json数据(包括电话、页面状态数等)
3、使用fastjson解析json数据,验证一下json数据(电话是否满足格式要求、页面状态是否正常等)
4、把验证码暂时存储到redis中(注入redis模板,在common模块中的RedisKey中写入相应的KEY)

package com.bjpowernode.front.service.impl;import com.alibaba.fastjson.JSONObject;
import com.bjpowernode.common.constants.RedisKey;
import com.bjpowernode.front.config.JdwxSmsConfig;
import com.bjpowernode.front.service.SmsService;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;/*** 注册发送短信验证码*/@Service(value = "smsCodeRegisterImpl")
public class SmsCodeRegisterImpl implements SmsService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate JdwxSmsConfig smsConfig;@Overridepublic boolean sendSms(String phone) {boolean send = false;// 设置短信内容String random  = RandomStringUtils.randomNumeric(4);System.out.println("注册验证码的随机数 random="+random);//更新content中的  %s   【大富科技】你的验证码是:%s,3分钟内有效,请勿泄露给他人String content  = String.format(smsConfig.getContent(), random);//使用HttpClient发送 get 请求给第三方。CloseableHttpClient client = HttpClients.createDefault();//https://way.jd.com/chuangxin/dxjk?mobile=13568813957&content=//【创信】你的验证码是:5873,3分钟内有效!&appkey=您申请的APPKEYString url = smsConfig.getUrl()+"?mobile="+phone+"&content=" + content+"&appkey="+smsConfig.getAppkey();HttpGet get  = new HttpGet(url);try{CloseableHttpResponse response = client.execute(get);if( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK ){  // 状态码:200//得到返回的数据,json//String text = EntityUtils.toString(response.getEntity());String text="{\n" +"    \"code\": \"10000\",\n" +"    \"charge\": false,\n" +"    \"remain\": 1305,\n" +"    \"msg\": \"查询成功\",\n" +"    \"result\": {\n" +"        \"ReturnStatus\": \"Success\",\n" +"        \"Message\": \"ok\",\n" +"        \"RemainPoint\": 420842,\n" +"        \"TaskID\": 18424321,\n" +"        \"SuccessCounts\": 1\n" +"    }\n" +"}";//解析jsonif(StringUtils.isNotBlank(text)){  // // fastjsonJSONObject jsonObject = JSONObject.parseObject(text);if("10000".equals(jsonObject.getString("code"))){ //第三方接口调用成功//读取result中的key:ReturnStatusif("Success".equalsIgnoreCase(jsonObject.getJSONObject("result").getString("ReturnStatus"))){//短信发送成功send  = true;//把短信验证码,存到redisString key = RedisKey.KEY_SMS_CODE_REG + phone;stringRedisTemplate.boundValueOps(key).set(random,3 , TimeUnit.MINUTES);}}}}}catch (Exception e){e.printStackTrace();}return send;}
}

上面用到httpclient类,在common模块下引入依赖:
在这里插入图片描述
上面用到fastjson解析json,在common模块下引入依赖:
在这里插入图片描述
验证码存入redis时更新添加相应的RedisKey(在common模块constants包下的RedisKey类):

    /*注册时,短信验证码 SMS:REG:手机号*/public static final String KEY_SMS_CODE_REG = "SMS:REG:";

在web模块下创建对应的controller类:

package com.bjpowernode.front.controller;import com.bjpowernode.common.constants.RedisKey;
import com.bjpowernode.common.enums.RCode;
import com.bjpowernode.common.util.CommonUtil;
import com.bjpowernode.front.service.SmsService;
import com.bjpowernode.front.view.RespResult;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@Api(tags = "短信业务")
@RestController
@RequestMapping("/v1/sms")
public class SmsController extends BaseController {@Resource(name = "smsCodeRegisterImpl")private SmsService smsService;@Resource(name = "smsCodeLoginImpl")private SmsService loginSmsService;/**发送注册验证码短信*/@GetMapping("/code/register")public RespResult sendCodeRegister(@RequestParam String phone){RespResult result = RespResult.fail();if(CommonUtil.checkPhone(phone)){//判断redis中是否有这个手机号的验证码String key  = RedisKey.KEY_SMS_CODE_REG + phone;if(stringRedisTemplate.hasKey(key)){  // 判断验证码key是否出现过在redis中,就是在3分钟之内发送过一次,这个验证码还可以使用result = RespResult.ok();result.setRCode(RCode.SMS_CODE_CAN_USE);} else {boolean isSuccess = smsService.sendSms(phone);if( isSuccess ){result = RespResult.ok();}}} else {result.setRCode(RCode.PHONE_FORMAT_ERR);}return result;}/**发送登录验证码短信*/@GetMapping("/code/login")public RespResult sendCodeLogin(@RequestParam String phone){RespResult result = RespResult.fail();if(CommonUtil.checkPhone(phone)){//判断redis中是否有这个手机号的验证码String key  = RedisKey.KEY_SMS_CODE_LOGIN + phone;if(stringRedisTemplate.hasKey(key)){result = RespResult.ok();result.setRCode(RCode.SMS_CODE_CAN_USE);} else {boolean isSuccess = loginSmsService.sendSms(phone);if( isSuccess ){result = RespResult.ok();}}} else {result.setRCode(RCode.PHONE_FORMAT_ERR);}return result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22349.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORB-SLAM2学习笔记2之TUM开源数据运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 evo工具1.1 简介1.2 常用命令1.3 安装 2 TUM数据3 单目ORB-SLAM23.1 运行ORB-SLAM23.2 evo评估轨迹3.2.1 载入和对比轨迹3.2.2 计算绝对位姿误差 4 RGB-D ORB-SLAM24.1 运行ORB-SLAM24.2 evo评估轨迹4.2.1 载入和对比轨迹4.2.2 计算绝对轨迹误差 ORB-SLAM2学习…

2003-Can‘t connect to Mysql server on ‘xxx‘ (10060 “Unknown error“)

Navicat连接 阿里云 服务器MySQL5.7数据库报错 解决办法: 进入数据库执行以下sql 1.允许root用户远程连接 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 数据库密码 WITH GRANT OPTION; 2.刷新权限 FLUSH PRIVILEGES;3.执行quit退出数据库 quit; 4.…

uniapp连接到微信小程序

第一次使用uniapp连接到微信小程序,但是出现了define is not defined问题,让人头疼,出现这个问题的原因是 调试基础库 版本过高导致的! 解决办法: 点击设置,选择项目设置。,会进入到如下界面&a…

mac M1 安装nacos

背景 m1不支持本地安装,只能用docker : “由于 rocksdb 暂不支持 M1 平台,所以使用 Zulu JDK 的小伙伴们运行 Nacos 2.x 版本会报错,网上通用的解决方案是使用 Oracle JDK 来运行 Nacos 2.x 版本,但对于强迫症的我来说…

Windows VScode如何配置与使用git?

当我们在VScode中编写代码后,需要提交到git仓库时,但是我们又不想切换到git的命令行窗口,我们可以在VScode中配置git,然后就可以很方便快捷的把代码提交到仓库中。 1. 官网下载安装Git命令行工具 根据自己的电脑系统&#xff0c…

选择正确的负载均衡器:LVS还是Nginx?

选择正确的负载均衡器:LVS还是Nginx? 博主简介一、前言二、什么是LVS?2.1、LVS的架构 三、什么是Nginx?3.1、Nginx 特性3.2、Nginx 架构 四、LVS和Nginx的区别五、总结 博主简介 💡一个热爱分享高性能服务器后台开发知…

高级测试工程师求职之路:从笔试到面试,我经历了什么?

最近行业里有个苦涩的笑话:公司扛过了之前的三年,没扛过摘下最近的一年,真是让人想笑又笑不出来。年前听说政策的变化,大家都满怀希望觉得年后行情一片大好,工作岗位激增,至少能有更多的机会拥抱未来。然而…

CAP原则的一致性、可用性、分区容错性

2000年,Eric Brewer在ACM PODC分布式计算原理专题讨论会上首次提出CAP原则。后来,麻省理工学院的两位科学家(赛斯吉尔伯特和南希林奇)证明了CAP原则的正确性。目前,CAP原则被大型公司广泛采纳,例如Amazon公司。 CAP原则又称CAP定…

【Go】vscode 安装go环境gopls失败

项目场景: 想要在VSCode安装go环境,但是gopls下载失败,导致vscode无法使用language server 问题描述 自动下载失败,在打开命令面板(CtrlshiftP)之后,输入go install/update 下载也失败 $ g…

java通过url获取视频时长(无需下载文件)

1、导入架包 <!-- jave 核心依赖 --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>2.4.6</version></dependency><!-- 根据不同操作系统引入不同FFmpeg包 --><!-- wi…

数据库应用:CentOS 7离线安装MySQL与Nginx

目录 一、理论 1.安装依赖 二、实验 1.离线安装MySQL与Nginx 2.离线安装Nginx 三、问题 1.执行nginx -v命令报错 四、总结 一、理论 1.安装依赖 &#xff08;1&#xff09;概念 安装依赖是指在软件开发中&#xff0c;为了运行或者编译一个程序或者库&#xff0c;在计…

css:横向滚动布局

效果&#xff1a; 实现代码&#xff1a; <template><div class"index_div"><div class"container"><div class"flexBox"><div class"flex_item" v-for"item in topMenu" :key"item.id&quo…