SpringBoot 阿里雲發送短信驗證碼小例子

SpringBoot 發送短信驗證碼

1.建立用戶信息

1.申請一個阿里雲的帳號

2. 打開控制檯 ,點擊我的頭像,找到AccessKey 管理,點擊打開

3.點擊進入以後會看到這個,必定要保管好這個accesskey 不要泄露,選擇使用子用戶的

image

4.新建一個用戶組

image

點擊建立用戶組,而後根據提示填寫便可java

image

建立完成以後點擊新建的用戶組進去
imageweb

5. 給用戶組添加權限

找到權限管理,添加權限redis

image

輸入SMS點擊管理短信服務,跳到有邊,點擊肯定便可spring

6.建立用戶

image
image

根據提示填寫就能夠編程

編程訪問必定要勾選上,由於咱們是經過代碼操做的json

點擊肯定便可api

建立用戶以後點擊進入會看到這個用戶的全部信息
image跨域

這裏的accesskeyid accessSecret 必定要妥善保管,由於一旦建立了用戶以後就看不到密碼了,若是泄露,要即便禁用或者刪除app

而後點擊加入的組,將剛纔建立好的用戶組添加進去便可dom

該子用戶會繼承用戶組的權限

2. 開通短信服務

1. 在控制檯首頁直接搜索短信服務 便可 ,點擊進入

2.第一次進入他會讓開通短信服務,直接贊成開通便可,能夠本身查看計費規則及其餘的信息

3.添加短信的模板

image

image

根據提示填寫就能夠,必定不要亂寫,填寫正當理由,審覈未經過接着審覈就行

${code}這個必定要有,不要修改他,要經過這個將驗證碼的變量傳進去

4. 添加簽名

image

第一次進去的時候驗證碼是能夠選用的,選用驗證碼就行,由於我申請過了,因此不能在選擇了

必定要等審覈經過了才能夠使用

5. 找到幫助文檔 打開找到SDK參考選擇java的,正常公司的開發都是使用SDK方式的,這裏也是使用這個方式

這個幫助文檔有api參考,能夠自行了解
image

進入官方的demo中

3.代碼階段

pom.xml 在pom.xml中導入如下依賴
<!--導入依賴sms  發送短信的核心依賴-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.3</version>
</dependency>
<!--FastJson 對於數據的處理的依賴-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>
<!--redis  由於短信驗證碼都是幾分鐘後沒法使用,因此放在redis中-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.2.RELEASE</version>
</dependency>
先測試一下能不能使用,直接將官方的demo代碼複製放到測試類中測試一下
/**
* <accessKeyId> 你本身的 accessKeyId      至關於帳號
* accessSecret  在建立用戶時的 accessSecret 至關於密碼
*/
@Test
void contextLoads() {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
   IAcsClient client = new DefaultAcsClient(profile);
        //構建請求
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");//不能改 改了就會報錯
        request.setSysVersion("2017-05-25");//不能改  改了就會報錯
         request.setSysAction("SendSms");//通常也不會該改
        //自定義的參數(手機號,驗證碼,模板,簽名)
        //參數名稱不要亂寫
        //手機號
        request.putQueryParameter("PhoneNumbers", "接受短信的手機號");
        //簽名名稱
        request.putQueryParameter("SignName", "剛纔定義好的簽名名稱");
        //模板code
        request.putQueryParameter("TemplateCode", "自定義短信模板的模板CODE編碼");
        //構建一個短信驗證碼
        Map<String,Object> map  = new HashMap<>();
        map.put("code","1234");
        //將定義好的驗證碼放入進去
        //短信驗證碼
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
    try {
        CommonResponse response = client.getCommonResponse(request);
        //控制檯打印返回的信息
        System.out.println(response.getData());
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}

在導包的時候必定不要導錯了,導阿里雲的,有些包是重名的

測試發送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}

在控制檯看到這句話就證實短信發送成功了

是否是已經收到短信了!

發送短信的正式代碼

controller

package com.mango.controller;

import com.mango.Service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;


/**
 * @Author:  
 * @Date:     2020/8/9 22:11
 * @CrossOrigin//跨域支持
 */
@RestController
@CrossOrigin
public class SendSmsApiController {

    @Autowired
    private SendSmsService sendSmsService;
    /**
     * 使用redis的模板
     */
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @GetMapping("/send/{phone}")
    public String sendSms(@PathVariable("phone")String phone){
        //調用發送短信的方法(使用redis)
        //獲取redis中的手機號
        String code = redisTemplate.opsForValue().get(phone);
        //判斷當前的code的不爲空
        if(!StringUtils.isEmpty(code)){
            return phone+":"+code +"已存在,尚未過時";
        }
        //不然就是沒有驗證碼,生成驗證碼而且存儲到redis中,設置他的過時時間
        //生成隨機驗證碼
        code = UUID.randomUUID().toString().substring(0, 4);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",code);
        //發送短信
        boolean isSend = sendSmsService.sendSms(phone, "自定義短信模板的模板CODE編碼", map);

        if(isSend){
            //若是短信發送成功就放入到redis中,設置5分鐘以後過時
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return phone+":"+code +"發送成功";
        }else {
            return "發送成功";
        }
    }
}

service

package com.mango.Service;

import java.util.Map;

/**
 * @Author:  
 * @Date:     2020/8/9 22:12
 */
public interface SendSmsService {

    /**
     * @param phoneNum  發送的手機號
     * @param TemplateCode  短信模板的code
     * @param code          驗證碼
     * @return
     */
    public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code);
}

servcieImpl

package com.mango.Service.impl;

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.mango.Service.SendSmsService;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @Author:  
 * @Date:     2020/8/9 22:12
 */
@Service
public class SendSmsImpl implements SendSmsService {

    /**
     * @param phoneNum     發送的手機號
     * @param TemplateCode 短信模板的code
     * @param code         驗證碼
     * @return
     */
    @Override
    public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);
        //構建請求
        CommonRequest request = new CommonRequest();
        //不要改
        request.setSysMethod(MethodType.POST);
        //不能改 改了就會報錯
        request.setSysDomain("dysmsapi.aliyuncs.com");
        //不能改  改了就會報錯
        request.setSysVersion("2017-05-25");
        //通常也不會該改
        request.setSysAction("SendSms");
        //自定義的參數(手機號,驗證碼,模板,簽名)
        //參數名稱不要亂寫
        //手機號
        request.putQueryParameter("PhoneNumbers", phoneNum);
        //簽名名稱
        request.putQueryParameter("SignName", "剛纔定義好的簽名名稱");
        //模板code
        request.putQueryParameter("TemplateCode", TemplateCode);
        //短信驗證碼
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
        try {
            CommonResponse response = client.getCommonResponse(request);
            //這個是他自帶的判斷他發送的是否成功,成功就直接返回
            return response.getHttpResponse().isSuccess();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}

application.yml

server:
  port: 8090

# redis  我這裏使用的是本地的redis
spring:
  redis:
    host: 127.0.0.1  
    port: 6379

如今看下是否是已經發送成功了!

相關文章
相關標籤/搜索