ylb-接口7注册发送短信

news2024/11/25 16:24:45

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

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

#短信配置
jdwx:
  sms:
    url: https://way.jd.com/chuangxin/dxjk
    appkey: 3680fa919b771148da626bbcbd459475
    content: 【大富科技】你的验证码是:%s,3分钟内有效,请勿泄露给他人
    login-text: 【大富科技】登录验证码是:%s,3分钟内有效,请勿泄露给他人
  realname:
    url: https://way.jd.com/youhuoBeijing/test
    appkey: 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 {

    @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.getContent(), 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 ){  // 状态码: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" +
                        "}";
               
                //解析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_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.coloradmin.cn/o/753932.html

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

相关文章

在 3ds Max 中使用Mental Ray渲染 wip 图像

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 本教程面向初学者,每个步骤都详细概述和显示。如果您是 3D Studio MAX 的新手,您可能想先尝试我们的其他一些教程。 使用默认的 3D Studio MAX 渲染器创建粘土渲染 步骤 1 在 3D S…

Unity DOTS如何优雅地实现ECS框架下的定时器Timer系统(无对象池,零GC)

实现定时器并不复杂,就是写个类存放回调,再写个类来统一管理这些回调类。但是ECS写代码的方式变了,所以还是有些区别的。 实现过程中需要注意的几点: 1、由于IComponentData不能存放managed类型的数据,所以无法用常规…

微服务架构+创建微服务工程(商品/订单)

目录 1.微服务架构 1.1.单体应用架构 1.2.微服务应用 1.3 微服务架构的优势 1.4.微服务架构的缺点(挑战) 1.5. SpringCloud与微服务关系 1.6.SpringBoot和SpringCloud关系 2. 创建微服务工程 2.1.数据库 2.2.搭建父工程 2.2 创建公共模块 2.3.商品系统 2.4.订单微…

【通讯协议备忘录】stm32的CAN外设

文章目录 帧结构测试模式(静默/换回/环回静默):环回测试配置 过滤器的使用测试参考用例过滤器的初始化发送和接收 中断 帧结构 CAN的报文结构: 测试模式(静默/换回/环回静默): 静默模式&…

Apache(httpd) 搭建笔记

Apache 搭建笔记 安装Apache HTTP服务器:启动Apache服务并设置开机自启 配置SSL证书配置Apache的SSL虚拟主机:重启Apache服务以使更改生效: 多站点配置第一个虚拟主机配置第二个虚拟主机创建每个站点的根目录: 强制跳转http>&g…

mysql及事务隔离级别

目录 一 事务之间相互影响分为几种 二 mysql常见的储存引擎 三 死锁 四 查看使用的储存引擎 五 修改储存引擎 六 总结 一 事务之间相互影响分为几种 脏读:就是读取了没有提交的数据, 不可重复读 :前后多次读取内容不一致 幻读:两次读的结果不一样 丢失更新:后一个会覆…

哈夫曼编码(霍夫曼、赫夫曼)

一、发展历史 哈夫曼使用自底向上的方法构建二叉树。 哈夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字(这种长度不同的编码方式称为变长编码,对应的长度相同的编码方…

关闭Vue CLI(脚手架)中的语法检查

1.创建一个名为vue.config.js的文件,与package.json文件平级 参考官方文档:Home | Vue CLI (vuejs.org) 2.将下面代码复制进vue.config.js文件中 module.exports{lintOnSave:false;//关闭语法检查 }

c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

效果可查看上一篇博文&#xff1a;js手动画平滑曲线&#xff0c;贝塞尔曲线拟合【代码】js手动画平滑曲线&#xff0c;贝塞尔曲线拟合。https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm1001.2014.3001.5502 代码如下&#xff1a; #include <cmath&…

10.6.1 【Linux】撷取命令: cut, grep

cut cut 主要的用途在于将“同一行里面的数据进行分解&#xff01;”最常使用在分析一些数据或文字数据的时候。这是因为有时候我们会以某些字符当作分区的参数&#xff0c;然后来将数据加以切割&#xff0c;以取得我们所需要的数据。 grep 10.6.2 排序命令&#xff1a; sort,…

最火爆的大模型框架LangChain七大核心及案例剖析上(一)

最火爆的大模型框架LangChain七大核心及案例剖析上 10.1 Models解析及案例剖析 本节正式进入当前开源界最火爆的大模型开发框架LangChain的部分,会讲解整个LangChain解决的问题及它的工作机制,通过一个“LangChain GPT内容创建者”(“LangChain GPT Content Creator”)的具体…

第九章:RefineNet——多路径细化网络用于高分辨率语义分割

0.摘要 最近&#xff0c;非常深的卷积神经网络&#xff08;CNN&#xff09;在目标识别方面表现出色&#xff0c;并且也是密集分类问题&#xff08;如语义分割&#xff09;的首选。然而&#xff0c;在深度CNN中&#xff0c;重复的子采样操作&#xff08;如池化或卷积跳跃&#x…

Matplotlib figure图形对象

通过前面的学习&#xff0c;我们知道matplotlib.pyplot模块能够快速地生成图像&#xff0c;但如果使用面向对象的编程思想&#xff0c;我们就可以更好地控制和自定义图像。 在 Matplotlib 中&#xff0c;面向对象编程的核心思想是创建图形对象&#xff08;figure object&#…

第十三章——类继承

面向对象编程的主要目的之一是提供可重用的代码。&#xff08;重用经过测试的代码比重新编写代码要好的多&#xff09; C类提供了更高层次的重用性。很多厂商提供了类库&#xff0c;类组合了数据表示和类方法&#xff0c;因此提供了比函数库更加完整的程序包。通常类库是以源代…

文件IO_文件读写(附Linux-5.15.10内核源码分析)

目录 1.什么是文件偏移量&#xff1f; 1.1 文件偏移量介绍 1.2 文件偏移量重点 1.3 文件偏移量工作原理 2.文件偏移量设置 2.1 lseek函数 2.2 lseek内核源码分析 3.写文件 3.1 write函数 3.2 write内核源码分析 4.读文件 4.1 read函数 4.2 read内核源码分析 5.文…

物流难统计、难管理?学会这招,问题迎刃而解

在当今数字化的时代&#xff0c;商家面临着诸多物流挑战。物流数据人工统计成本高、管理难、决策难是很常见的问题。本文将探讨如何通过智能数据分析解决这些问题&#xff0c;帮助商家提升物流效率和管理能力。 物流数据人工统计&#xff0c;难决策 物流数据沉淀全靠人工线下…

Vue3_简介、CompositionVPI、新的组件

文章目录 Vue3快速上手1.Vue3简介2.Vue3带来了什么1.性能的提升2.源码的升级3.拥抱TypeScript4.新的特性 一、创建Vue3.0工程1.使用 vue-cli 创建2.使用 vite 创建 二、常用 Composition API1.拉开序幕的setup2.ref函数3.reactive函数4.Vue3.0中的响应式原理vue2.x的响应式Vue3…

labview实现呼吸灯颜色渐变效果

呼吸灯效果具有美好的视觉观感&#xff0c;前一段时期感受了一位大佬在MCU中实现呼吸灯颜色渐变效果&#xff0c;很是震撼。这引起了我的兴趣&#xff0c;本文则是实现一种呼吸灯效果(主要在于颜色的渐变体现)。 程序整体视图 程序框图 公式节点程序 int red_is_0 red 0 ?…

探索MR与AIGC技术的发展机遇:教育、医疗领域的前景展望

在当今科技迅猛发展的时代&#xff0c;混合现实&#xff08;MR&#xff09;和增强智能生成创作&#xff08;AIGC&#xff09;技术正逐渐成为教育、医疗领域中的关键驱动力。这两项前沿技术的结合为我们带来了无限的可能性和创新的机遇。 MR技术在教育领域中的发展与机遇是广泛而…

非洲秃鹫优化算法(AVOA)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…