SpringBoot 阿里云發(fā)送短信的小例子

SpringBoot 發(fā)送短信驗(yàn)證碼

阿里云賬戶要有一點(diǎn)錢

1.創(chuàng)建用戶信息

1.申請(qǐng)一個(gè)阿里云的賬號(hào)

2. 打開(kāi)控制臺(tái) ,點(diǎn)擊個(gè)人頭像,找到AccessKey 管理,點(diǎn)擊打開(kāi)

3.點(diǎn)擊進(jìn)入之后會(huì)看到這個(gè),一定要保管好這個(gè)accesskey 不要泄露,選擇使用子用戶的

image-20200809183339864.png

4.新建一個(gè)用戶組

微信截圖_20200809183332.png

點(diǎn)擊創(chuàng)建用戶組,然后根據(jù)提示填寫(xiě)即可

微信截圖_20200809183552.png

創(chuàng)建完成之后點(diǎn)擊新建的用戶組進(jìn)去

微信截圖_20200809183740.png

5. 給用戶組添加權(quán)限

找到權(quán)限管理,添加權(quán)限

微信截圖_20200809184056.png

輸入SMS點(diǎn)擊管理短信服務(wù),跳到有邊,點(diǎn)擊確定即可

6.創(chuàng)建用戶

微信截圖_20200809184350.png
微信截圖_20200809184504.png

根據(jù)提示填寫(xiě)就可以

編程訪問(wèn)一定要勾選上,因?yàn)槲覀兪峭ㄟ^(guò)代碼操作的

點(diǎn)擊確定即可

創(chuàng)建用戶之后點(diǎn)擊進(jìn)入會(huì)看到這個(gè)用戶的所有信息

微信截圖_20200809185002.png

這里的accesskeyid accessSecret 一定要妥善保管,因?yàn)橐坏﹦?chuàng)建了用戶之后就看不到密碼了,如果泄露,要即使禁用或者刪除

然后點(diǎn)擊加入的組,將剛才創(chuàng)建好的用戶組添加進(jìn)去即可

該子用戶會(huì)繼承用戶組的權(quán)限

2. 開(kāi)通短信服務(wù)

1. 在控制臺(tái)首頁(yè)直接搜索短信服務(wù) 即可 ,點(diǎn)擊進(jìn)入

2.第一次進(jìn)入他會(huì)讓開(kāi)通短信服務(wù),直接同意開(kāi)通即可,可以自己查看計(jì)費(fèi)規(guī)則及其他的信息

3.添加短信的模板

微信截圖_20200809190251.png
微信截圖_20200809191056.png

根據(jù)提示填寫(xiě)就可以,一定不要亂寫(xiě),填寫(xiě)正當(dāng)理由,審核未通過(guò)接著審核就行

${code}這個(gè)一定要有,不要修改他,要通過(guò)這個(gè)將驗(yàn)證碼的變量傳進(jìn)去

4. 添加簽名

image-20200809191419460.png

第一次進(jìn)去的時(shí)候驗(yàn)證碼是可以選用的,選用驗(yàn)證碼就行,因?yàn)槲疑暾?qǐng)過(guò)了,所以不能在選擇了

一定要等審核通過(guò)了才可以使用

5. 找到幫助文檔 打開(kāi)找到SDK參考選擇java的,正常公司的開(kāi)發(fā)都是使用SDK方式的,這里也是使用這個(gè)方式

這個(gè)幫助文檔有api參考,可以自行了解

image-20200809212454730.png

進(jìn)入官方的demo中

3.代碼階段

pom.xml 在pom.xml中導(dǎo)入以下依賴

<!--導(dǎo)入依賴sms  發(fā)送短信的核心依賴-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.3</version>
</dependency>
<!--FastJson 對(duì)于數(shù)據(jù)的處理的依賴-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>
<!--redis  因?yàn)槎绦膨?yàn)證碼都是幾分鐘后無(wú)法使用,所以放在redis中-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.2.RELEASE</version>
</dependency>

先測(cè)試一下能不能使用,直接將官方的demo代碼復(fù)制放到測(cè)試類中測(cè)試一下

/**
* <accessKeyId> 你自己的 accessKeyId      相當(dāng)于賬號(hào)
* accessSecret  在創(chuàng)建用戶時(shí)的 accessSecret 相當(dāng)于密碼
*/
@Test
void contextLoads() {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
   IAcsClient client = new DefaultAcsClient(profile);
        //構(gòu)建請(qǐng)求
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");//不能改 改了就會(huì)報(bào)錯(cuò)
        request.setSysVersion("2017-05-25");//不能改  改了就會(huì)報(bào)錯(cuò)
         request.setSysAction("SendSms");//一般也不會(huì)該改
        //自定義的參數(shù)(手機(jī)號(hào),驗(yàn)證碼,模板,簽名)
        //參數(shù)名稱不要亂寫(xiě)
        //手機(jī)號(hào)
        request.putQueryParameter("PhoneNumbers", "接受短信的手機(jī)號(hào)");
        //簽名名稱
        request.putQueryParameter("SignName", "剛才定義好的簽名名稱");
        //模板code
        request.putQueryParameter("TemplateCode", "自定義短信模板的模板CODE編碼");
        //構(gòu)建一個(gè)短信驗(yàn)證碼
        Map<String,Object> map  = new HashMap<>();
        map.put("code","1234");
        //將定義好的驗(yàn)證碼放入進(jìn)去
        //短信驗(yàn)證碼
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
    try {
        CommonResponse response = client.getCommonResponse(request);
        //控制臺(tái)打印返回的信息
        System.out.println(response.getData());
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}

在導(dǎo)包的時(shí)候一定不要導(dǎo)錯(cuò)了,導(dǎo)阿里云的,有些包是重名的

測(cè)試發(fā)送短信

{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}

在控制臺(tái)看到這句話就證明短信發(fā)送成功了

是不是已經(jīng)收到短信了!

發(fā)送短信的正式代碼

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){
        //調(diào)用發(fā)送短信的方法(使用redis)
        //獲取redis中的手機(jī)號(hào)
        String code = redisTemplate.opsForValue().get(phone);
        //判斷當(dāng)前的code的不為空
        if(!StringUtils.isEmpty(code)){
            return phone+":"+code +"已存在,還沒(méi)有過(guò)期";
        }
        //否則就是沒(méi)有驗(yàn)證碼,生成驗(yàn)證碼并且存儲(chǔ)到redis中,設(shè)置他的過(guò)期時(shí)間
        //生成隨機(jī)驗(yàn)證碼
        code = UUID.randomUUID().toString().substring(0, 4);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",code);
        //發(fā)送短信
        boolean isSend = sendSmsService.sendSms(phone, "自定義短信模板的模板CODE編碼", map);

        if(isSend){
            //如果短信發(fā)送成功就放入到redis中,設(shè)置5分鐘之后過(guò)期
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return phone+":"+code +"發(fā)送成功";
        }else {
            return "發(fā)送成功";
        }
    }
}

service

package com.mango.Service;

import java.util.Map;

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

    /**
     * @param phoneNum  發(fā)送的手機(jī)號(hào)
     * @param TemplateCode  短信模板的code
     * @param code          驗(yàn)證碼
     * @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     發(fā)送的手機(jī)號(hào)
     * @param TemplateCode 短信模板的code
     * @param code         驗(yàn)證碼
     * @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);
        //構(gòu)建請(qǐng)求
        CommonRequest request = new CommonRequest();
        //不要改
        request.setSysMethod(MethodType.POST);
        //不能改 改了就會(huì)報(bào)錯(cuò)
        request.setSysDomain("dysmsapi.aliyuncs.com");
        //不能改  改了就會(huì)報(bào)錯(cuò)
        request.setSysVersion("2017-05-25");
        //一般也不會(huì)該改
        request.setSysAction("SendSms");
        //自定義的參數(shù)(手機(jī)號(hào),驗(yàn)證碼,模板,簽名)
        //參數(shù)名稱不要亂寫(xiě)
        //手機(jī)號(hào)
        request.putQueryParameter("PhoneNumbers", phoneNum);
        //簽名名稱
        request.putQueryParameter("SignName", "剛才定義好的簽名名稱");
        //模板code
        request.putQueryParameter("TemplateCode", TemplateCode);
        //短信驗(yàn)證碼
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
        try {
            CommonResponse response = client.getCommonResponse(request);
            //這個(gè)是他自帶的判斷他發(fā)送的是否成功,成功就直接返回
            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

現(xiàn)在看下是不是已經(jīng)發(fā)送成功了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容