阿里云对接短信

news/2024/7/12 2:24:53 标签: java, 蓝桥杯, eureka

可以先去bibi看教程:下面是bibi教学视频

【狂神说】通俗易懂的阿里云短信业务实战教程_哔哩哔哩_bilibili

1: 我们需要在pom 引入一个jar包

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.0.3</version>
</dependency>

 2:下面是工具类

java">package com.yunze.common.constant;

import com.alibaba.fastjson.JSONObject;
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.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.yunze.common.sms.SemdSms;
import org.springframework.stereotype.Service;

import java.util.Map;
/**
 * 阿里云 短信发送配置
 * */

@Service
public class SendSmsImpl implements SemdSms {


    @Override
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {

        /**
         * regionID @cn-hangzhou
         * 阿里云短信服务账号 @accessKeyId
         * 阿里云短信服务密码 @secret
         * */

        // 链接阿里云  这个不需要动 cn-hangzhou  accessKeyId : 账号  secret: 密码
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","xxxxxx","xxxxx");
        IAcsClient client = new DefaultAcsClient(profile);

        // 构建请求
        CommonRequest request = new CommonRequest();

        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");//官方说不要动
        request.setVersion("2017-05-25");//官方说不要动
        request.setAction("SendSms");//事件名称

        // 自定义的参数 (手机号,验证码,签名,模板!)
        request.putQueryParameter("PhoneNumbers",phoneNum);//手机号
        request.putQueryParameter("SignName","山东山东");//签名
        request.putQueryParameter("TemplateCode",templateCode);//模板CODE

        // 构建一个短信的验证码
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));

        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();//成功
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}



下面说说这个阿里云的账号和密码 我的已经标记xxxx了

 1:登录阿里云平台  我们点击 AccessKey 管理

 2:进去之后提示  如何你没有然后自己去创建  --在这里提醒大家先看教学视频

 3:我们点击继续使用  然后我们就能看到自己的账号了  也就是 AccessKey ID

        密码在右边---操作  有个 查看 Secret 就可以看到我们的密码了。

 3:我们写个接口  去动态的实现数据

java">package com.yunze.common.sms;

import java.util.Map;

public interface SemdSms {
    public boolean send(String phoneNum, String templateCode, Map<String,Object> code);
}

 4:下面是我们的 Controller 层

java">package com.yunze.web.controller.common;

import com.yunze.common.core.redis.RedisCache;
import com.yunze.common.sms.SemdSms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

@RestController
@CrossOrigin // 跨域支持
@RequestMapping
public class SmsApiController {

    @Autowired
    private SemdSms sendSms;

    @Resource
    private RedisCache redisCache;



    @GetMapping("/send/{phone}")
    public String code(@PathVariable String phone){
        int H = 24;
        // 调用发送方法
        Object code = redisCache.getCacheObject("login_"+phone);
        if (code!=null && code.toString().length()>0) { //不等于 空
            return "已存在,还没有过期";
        }

        StringBuilder builder = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            builder.append(random.nextInt(10));//实现验证码 6 位数字
        }
        // 生成验证码并存储到redis 中
        code = builder.toString();

        HashMap<String,Object> param = new HashMap<>();
        param.put("code",code);

        boolean isSend = sendSms.send(phone,"SMS_242220249",param);

        if(isSend){

            //设置 5 分钟过期
            redisCache.setCacheObject("login_"+phone, code, 5, TimeUnit.MINUTES);//设置5分钟过期
            return "验证成功 请查看手机验证码";

        }else {
            return "发送失败";
        }
    }
}

操作完毕 --------------------------------------

 下面操作你们可以不看   因为我是用的若依框架写的---其中也是遇到了  很多问题

javascript">// 手机号 登录
export function GetPhone(phone) {
  return request({
    url: '/send/'+phone,
    method: 'get'
  })
}

在 SecurityConfig.java 配置拦截

 前端还有一个拦截的地方  大家注意  在这个地方 大家可以看看

 

 我在这里总结以下我的问题

1:若依登录  Java 代码有个 token 验证 这边挺复杂的

大家请看 这篇文章 若依系统(Security)增加手机验证码登录

因为若依没有验证码是不让登录的

若依系统(Security)增加手机验证码登录 - 简书

 但是我写的 token 验证 跟这篇文章的不太一样 大家都看看

java">    /**
     * 短信登录验证
     * @param telephone 用户名
     * @param password 密码
     * @param uuid 唯一标识
     * @return 结果
     */
    public String Massagelogin(String telephone, String password, String uuid)
    {
        // 用户验证
        Authentication authentication = null;
        try {
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager
                    .authenticate(new SmsCodeAuthenticationToken(telephone));
        } catch (Exception e) {
            if (e instanceof BadCredentialsException) {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(telephone, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                throw new UserPasswordNotMatchException();
            } else {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(telephone, Constants.LOGIN_FAIL, e.getMessage()));
                throw new CustomException(e.getMessage());
            }
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(telephone, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        recordLoginInfo(loginUser.getUser());
        // 生成token
        return tokenService.createToken(loginUser);
    }

前端需要把数据放入到 token


http://www.niftyadmin.cn/n/1230021.html

相关文章

正则表达式验证11位数的手机号

getShortMessageCode() {let regs /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;// 11位手机if (!regs.test(this.MessageloginForm.username)) {this.msgError("手机号码格式不正确&#xff0c;请重新输入");} else {this.sli…

MySQL存储过程之while、repeat循环

一、创建示例表 /* test数据库下建立testa表 */ CREATE TABLE test.testa (ID int(11) NOT NULL,PRIMARY KEY (ID) USING BTREE ) ENGINE InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT Dynamic; 一、while循环 CREATE DEFINERrootlocalhost PROCEDUR…

MySQL存储过程之游标的使用

示例&#xff1a;把表中status为0所对应的age值改为99&#xff08;当然有更简单的方法&#xff0c;这里主要是为了学习MySQL存储过程中游标的使用&#xff09; 先建表如下&#xff1a; /* 在test库下建立testb表 */ CREATE TABLE test.testb (ID int(11) NOT NULL,NAME varc…

图片滑动验证

1、引入vue-monoplasty-slide-verify组件到项目里 先使用命令行安装&#xff1a;npm install --save vue-monoplasty-slide-verify 2、在main.js目录下添加代码 import Vue from vue; import SlideVerify from vue-monoplasty-slide-verify;Vue.use(SlideVerify); 3、在页面中…

MySQL之自定义函数的使用

示例&#xff1a;输入status值&#xff0c;返回status对应输入的值的所有age之和 表还是那个表&#xff0c;数据也还是那些数据&#xff0c;&#xff08;见MySQL存储过程之游标的使用&#xff09;如下&#xff1a; 定义函数如下&#xff1a; CREATE DEFINERrootlocalhost FUN…

el-tabs 实现多个 el-table表格 分页操作

一&#xff0c; 下面是图片效果 我们每个 el-tab-pane 都是一个表格 需求&#xff0c;每个表格都实现分页 &#xff1b;然后我的表格有三个状态&#xff1a; 成功 失败 待处理 然后是我实现的分页数据 二&#xff0c;下面直接看代码 <template><div><!--…

Linux 学习 第一章

Linux 一切皆文件&#xff1a;文件就 读&#xff0c;写&#xff0c;&#xff08;权限&#xff09; 1&#xff0c;基本的命令&#xff08;重点&#xff1a;Git讲了一些基本的命令&#xff08;文件操作&#xff0c;目录管理&#xff0c;文件属性&#xff0c;Vim编辑器&#xff0…

Nginx -学习

所谓 负载均衡 就是&#xff1a;就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器&#xff0c;从而不会产生集群中大量请求只请求某一台服务器&#xff0c;从而使该服务器宕机的情况。 一&#xff0c;nginx 反向代理 实现负载均衡之前我们要实现 反向代理 &…