手机短信验证码发送

news/2024/12/23 2:00:50/

使用aliyun的短信发送服务

用户登录名称 sms-127@1286242113840900.onaliyun.com
AccessKey ID LTAI5t6jFYKGyZp529NCVV9d
AccessKey Secret hYXc4KtpFiHELEmU5yuLCfstZM7zhS
签名 : XXX
模版CODE : SMS_186613739

配置文件 aliyun.properties

aliyun.sms.regionId=sms-127@1286242113840900.onaliyun.com
aliyun.sms.accessKeyId=LTAI5t6jFYKGyZp529NCVV9d
aliyun.sms.accessKeySecret=hYXc4KtpFiHELEmU5yuLCfstZM7zhS
aliyun.sms.domain=dysmsapi.aliyuncs.com
aliyun.sms.signName=XXX
aliyun.sms.templateCode=SMS_186613739

注意:等号前后不要留有空格。否则签名部分会出错。

在service层处理短信阿里发送业务,通过这个方法实现短信发送到指定手机号码,并且生成随机验证码code返回

/*** 发送短信验证码* @param mobile* @return 返回发送验证的结果*/public String sendSms(String mobile) {DefaultProfile profile = DefaultProfile.getProfile(this.aliyunSMSConfig.getRegionId(),this.aliyunSMSConfig.getAccessKeyId(), this.aliyunSMSConfig.getAccessKeySecret());IAcsClient client = new DefaultAcsClient(profile);String code = RandomUtils.nextInt(100000, 999999) + "";CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain(this.aliyunSMSConfig.getDomain());request.setSysVersion("2017-05-25");request.setSysAction("SendSms");request.putQueryParameter("RegionId", this.aliyunSMSConfig.getRegionId());request.putQueryParameter("PhoneNumbers", mobile); //目标手机号request.putQueryParameter("SignName", this.aliyunSMSConfig.getSignName()); //签名名称request.putQueryParameter("TemplateCode", this.aliyunSMSConfig.getTemplateCode()); //短信模板coderequest.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");//模板中变量替换try {CommonResponse response = client.getCommonResponse(request);String data = response.getData();if (StringUtils.contains(data, "\"Message\":\"OK\"")) {return code;}log.info("发送短信验证码失败~ data = " + data);} catch (Exception e) {log.error("发送短信验证码失败~ mobile = " + mobile, e);}return null;}

根据接口和客户端请求参数类型编写controller层

POST请求路径:/user/login

返回请求参数类型JSON格式

{
  "phone": "接受验证码手机号码"
}

@Autowired
private SmsService smsService;/*** 发送短信验证码接口* @param param* @return 返回由spring封装好的ResponseEntity对象
*/
@PostMapping("login")
public ResponseEntity<ErrorResult> sendCheckCode(@RequestBody Map<String , String> param) {ErrorResult errorResult = null;//获取手机号码String phone = param.get("phone");//调用service层的发送验证码方法获取发送验证码的状态try{errorResult= this.smsService.sendCheckCode(phone);if (null == errorResult) {//发送验证成功return ResponseEntity.ok(null);}} catch (Exception e) {log.error("发送验证码失败 phone=" + phone,e);errorResult = ErrorResult.builder().errCode("000002").errMessage("短信验证码发送失败!").build();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResult);
}

编写service层的sendCheckCode方法,发送验证码

/*** 发送短信验证码* 实现业务:调用sendSms方法获取随机验证码,存放在redis中,有效期为5分钟* @param phone* @return
*/
public ErrorResult sendCheckCode(String phone) {String redisKey = "CHECK_CODE_" + phone;//判断验证码是否失效if (this.redisTemplate.hasKey(redisKey)) {String msg = "上次发送的验证码还未失效,请稍后再试!";return ErrorResult.builder().errCode("000001").errMessage(msg).build();}//获取验证码String code = this.sendSms(phone);//判断验证码是否为空if (StringUtils.isEmpty(code)) {String msg = "发送短信验证码失败";return ErrorResult.builder().errCode("000000").errMessage(msg).build();}//短信发送成功,将验证码存放在redis,有效期为5分钟this.redisTemplate.opsForValue().set(redisKey,code,Duration.ofMinutes(5));return null;}


http://www.ppmy.cn/news/711968.html

相关文章

防止恶意频繁发送短信验证码

短信接口验证码是网站&#xff0c;App&#xff0c;微信端校验用户手机号码真实性的首要途径&#xff0c;在为用户提供便利的同时&#xff0c;手机短信验证功能也会被部分用户进行恶意使用。恶意频繁发送短信验证码&#xff0c;不仅会增加公司的运营成本&#xff0c;增加系统负载…

【SpringCloud-8】sleuth+zipkin分布式链路追踪

一&#xff1a;基本介绍 分布式链路追踪&#xff0c;听起来很高大上&#xff0c;其实也没什么。 说简单点&#xff0c;分布式系统中&#xff0c;一个请求可能会经过很多个服务。使用sleuth可以在这些服务上打一些日志&#xff08;不是我们自己打印的业务日志&#xff09;&#…

手机短信接收验证码的实现原理

关于手机短信接收验证码的实现原理: 思路&#xff1a; A:获得验证码: 1.找到相关的表。 2.用什么发送,post&#xff0c;get ,ajax,当然ajax首选 3.post之前要js先判断是手机号码11位&#xff0c;并且全部都是数字&#xff0c;或者用正则也行。 4.用ajax发送数据data,要对数据进…

生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展

近年来&#xff0c;国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究&#xff0c;他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合&#xff0c;评价不同类型研究区的生态脆弱特征&#xff0c;其研究内容…

Apache Doris (十六) :Doris分区和分桶2-List分区

1. List分区 业务上&#xff0c;用户可以选择城市或者其他枚举值进行partition&#xff0c;对于这种枚举类型数据列进行分区就可以使用List分区。List分区列支持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR 数据类型&#xff0c;分区…

MAC地址对应厂商

MAC地址由IEEE注册管理机构RA分配给厂商&#xff0c;只分配前三个字节&#xff0c;剩余由厂商自己分配。 IEEE会定期更新OUI文件&#xff0c;用于查询MAC对应的厂商。 下载地址&#xff08;需翻&#xff09;&#xff1a;http://standards.ieee.org/develop/regauth/oui/oui.t…

代码判断iphone型号4 5 6 6plus

代码判断iphone型号4 5 6 6plus #define IS_IPAD (UI_USER_INTERFACE_IDIOM() UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() UIUserInterfaceIdiomPhone) #define IS_RETINA ([[UIScreen mainScreen] scale] > 2.0) #define SCREEN_WIDTH ([[U…

MAC地址规则

MAC&#xff08;Media AccessControl&#xff0c;介质访问控制&#xff09;地址&#xff0c;也叫硬件地址&#xff0c;长度是48比特&#xff08;6字节&#xff09;&#xff0c;由16进制的数字组成&#xff0c;分为前24位和后24位&#xff1a; 前24位叫做组织唯一标志符&#x…