ylb-接口9登录短信发送

news2025/1/18 20:12:20

总览:(总体功能与注册发送短信功能相似)
在这里插入图片描述

在web模块service.impl包下,创建SmsCodeLoginImpl,实现的还是SmsService接口

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.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 登录发送短信验证码
 */

@Service(value = "smsCodeLoginImpl")
public class SmsCodeLoginImpl implements SmsService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private JdwxSmsConfig smsConfig;

    @Override
    public 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.getLoginText(), random);

        //使用HttpClient发送 get 请求给第三方。
        CloseableHttpClient client = HttpClients.createDefault();
        //https://way.jd.com/chuangxin/dxjk?mobile=13568813957&content=
        //【创信】你的验证码是:5873,3分钟内有效!&appkey=您申请的APPKEY
        String 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 ){
                //得到返回的数据,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" +
                        "}";
                //解析json
                if(StringUtils.isNotBlank(text)){
                    // fastjson
                    JSONObject jsonObject = JSONObject.parseObject(text);
                    if("10000".equals(jsonObject.getString("code"))){ //第三方接口调用成功
                        //读取result中的key:ReturnStatus
                        if("Success".equalsIgnoreCase(
                                jsonObject.getJSONObject("result").getString("ReturnStatus"))){
                            //短信发送成功
                            send  = true;

                            //把短信验证码,存到redis
                            String key = RedisKey.KEY_SMS_CODE_LOGIN + phone;
                            stringRedisTemplate.boundValueOps(key).set(random,3 , TimeUnit.MINUTES);

                        }
                    }
                }
           // }
        }catch (Exception e){
            e.printStackTrace();
        }
        return send;
    }

    @Override
    public boolean checkSmsCode(String phone, String code) {
        String key = RedisKey.KEY_SMS_CODE_LOGIN + phone;
        if( stringRedisTemplate.hasKey(key)){
            String querySmsCode = stringRedisTemplate.boundValueOps(key).get();
            if( code.equals(querySmsCode)){
                return true;
            }
        }
        return false;
    }

}

其中:
验证码存入redis时更新添加相应的RedisKey(在common模块constants包下的RedisKey类):

    /*登录时,短信验证码 SMS:LOGIN:手机号*/
    public static final String KEY_SMS_CODE_LOGIN = "SMS:LOGIN:";

在web模块下补充对应的SmsController类:

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)){
                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.coloradmin.cn/o/755071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023机器人操作系统(ROS)暑期学校报名通道开启-转发-

来源请查看: https://mp.weixin.qq.com/s/gVr4pUG2TGT6sCcGKvVnYw 报名等请使用上面给出地址。 面向对象:机器人/人工智能相关专业教师/学生/工程师 要求:ROS零基础/中高级 费用:免费,食宿自理 时间:2023…

3.2 多路复用和多路分用

3.2 多路复用和多路分用 多路复用/分用分用如何工作?无连接分用面向连接的分用面向连接的分用:多线程Web服务器 多路复用/分用 分用如何工作? 主机接收到IP数据报(datagram) 每个数据报携带源IP地址、目的IP地址。每个数据报携带一个传输层的…

Java中字符串相关的类

目录 String类 StringBuffer类 StringBuilder类 String类 String类:代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 String是一个final类,代表不可变的字符序列。 字符串是常量&…

[论文分享]MR-MAE:重构前的模拟:用特征模拟增强屏蔽自动编码器

论文题目:Mimic before Reconstruct: Enhancing Masked Autoencoders with Feature Mimicking 论文地址:https://arxiv.org/abs/2303.05475 代码地址:https://github.com/Alpha-VL/ConvMAE(好像并未更新为MR-MAE模型) …

不容错过!10个Python自动化办公库免费送!(上)

大家好,这里是程序员晚枫,小红薯也叫这个名。 今天给大家分享一下,花费2周时间整理的Python自动化办公库。 本次内容涵盖了Excel、Word、PPT、PDF、微信、文件处理等所有能在办公场景实现自动化的库,希望能够对大家有所帮助。 提…

部署LAMP 平台(二十四)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、概述 二、PHP安装配置 1. PHP的作用 2. PHP安装 2.1 yum安装 2.2 PHP语言简介 三、安装 四、启动 五、书写测试页面 六、客户端访问 七、书写连接数据库页…

C++图形开发(13):得分系统

文章目录 1.定义变量2.得分系统3.分数清零系统4.输出分数5.整段代码 今天来对这个“别碰方块”的游戏进行一个完善,并增加一个得分系统 1.定义变量 首先是定义用于储存得分的变量: int score 0;2.得分系统 那么怎样才能得分呢? 没错&…

数据分析——AB测试应用与实战

摘要 某电商公司非常注重自己的落地页设计,希望通过改进设计来提高转化率。以往该公司全年转化率平均在13%左右,现在希望设计的新页面能够带来更高的转化率,希望新页面的转化率能有2%的提升,达到15%。在正式推出新页面之前&#…

HCIA配置命令集

目录 扩展 交换机 路由器 路由器网关配置 DHCP服务器 Telnet :远程登录协议 静态路由配置 动态路由 OSPF RIP NAT—网络地址转换 ACL—访问控制列表 ACL的分类: 配置 配置基础ACL : 例一: 例二: 配…

微服务 云原生:K8S 核心组件

参考 Kubernetes 官方文档,简要概述 Kubernetes 中的核心组件用途及部分原理。 一个 K8S 集群,可以分为两个部分: 控制平面(Control Plane)。它是一套管理系统,专门来管理集群节点和服务,为集群做出全局决策&#xff…

apache doris数据库集群搭建(二)

1. 概述 该文档主要介绍了主要基于apache doris数据库搭建(一)的基础上进行集群搭建、升级、扩容操作讲解编写。 2.软硬件需求 Doris 作为一款开源的 MPP 架构 OLAP 数据库,能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架…

java Exception输出错误详细信息

1、直接输出Exception try {//上传代码} catch (Exception e) {throw new RuntimeException("上传训练数据失败:" e);}输出结果:只输出错误原因,不输出错误发生的位置 2、e.getMessage() throw new RuntimeException("上…

Thymeleaf解析

thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发 最开始网站开始发展时,使用HTML展示网页,随着技术的发展和需求变化,出现了前后端交互的页面,不需要使用多个页面去展示一个大同小异的页面。…

Android TvSettings Bug: 密码框无法点击唤起输入法

概述 Android 10 的Box方案, 默认使用的是TvSettings作为系统设置,输入操作的习惯上是使用鼠标,键盘,遥控,日常的场景是没有问题,也不会出现本文中提及的问题。当外接的USB触摸屏后,出现无法点击…

华润燃气牵手腾讯云 数字技术助力燃气行业高质量发展

7月13日,华润燃气与腾讯云正式签署战略合作协议。双方将充分发挥各自优势,探索AI大模型在燃气行业的深度应用,并深耕分布式计算、连接和客户运营等领域,不断提升燃气民生服务的效率、质量,共同推动行业数字化转型和高质…

echarts3D地图+3D柱状图+3D飞线图

echarts版本&#xff1a;5.4.0 echarts-gl版本&#xff1a;2.0.8 示例代码&#xff1a; <template><div><div ref"chinaMap" id"chinaMap" style"width: 90vw;height: 90vh;"></div></div> </template>&l…

【ArcGIS Pro二次开发】(49):村规数据入库【福建省】

之前用Arcpy脚本工具做了一个村规数据入库和主要图纸生成工具。 在使用过程中&#xff0c;感觉对电脑环境比较高&#xff0c;换电脑用经常会一些莫名其妙的错误&#xff0c;bug修得很累。近来随着ArcGIS Pro SDK的熟悉&#xff0c;就有了移植的想法。 这里先把村规数据入库工…

【量化课程】02_2.货币金融学基础概念

2.2_货币金融学基础概念 文章目录 2.2_货币金融学基础概念概述金融体系货币利率利率的风险结构与期限结构货币供给过程中国货币政策工具货币政策效果货币数量论、通货膨胀与货币需求总需求与总供给分析货币政策理论货币政策传导机制 概述 金融市场&#xff1a;资金从剩余方转向…

解决git每次提交都需要输入用户密码

一、背景 在github上贴上了服务器ssh的公钥后&#xff0c;在服务器上推送代码仍旧提示需要输入git的账号和密码。 二、原因 这是因为此时的仓库是http协议下载的&#xff0c;此时的链接并不是通过ssh的&#xff0c;因此在推送代码时&#xff0c;会提示输入git的账号和密码。…

基于Python编写一个B站全自动抽奖的小程序

本文将利用Python编写一个B站全自动抽奖的小程序&#xff0c;可以实时监控自己关注的UP主&#xff0c;如果关注的UP主中有人发布了抽奖的动态&#xff0c;就自动参与这个抽奖。这样就能不错过任何一个可以暴富的机会了。需要的可以参考一下 导语 应好友邀请&#xff0c;帮他写…