阿里云短信接收

1.进入设置页面

2.创建用户组

3.添加用户

4.笔记

如何得到AccessKey ID和AccessKey Secret?

AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,
我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。

两个选项 "继续使用AccessKey" 和 "开始使用子用户AccessKey",区别如下:
1.继续使用AccessKey
  创建的是阿里云账号的AccessKey,是具有账户的完全权限,可以通过API调用阿里云的服务,
  不仅是短信服务,其他服务(OSS,语音服务,内容安全服务,视频点播服务...等)也可以调用。
  一旦AccessKey泄露,不太安全
2.开始使用子用户AccessKey
  可以创建一个子用户,这个子用户我们可以分配比较低的权限,比如仅分配短信发送的权限,
  不具备操作其他的服务的权限,即使这个AccessKey泄漏了,也不会影响其他的云服务, 相对安全。

5.用户组添加组成员(添加用户)

6.用户组添加短信权限

7.第一次使用,需要点击,并开通短信服务

短信签名是短信发送者的署名,表示发送方的身份。

我们要调用阿里云短信服务发送短信,签名是比不可少的部分。

下面短信这里展示的就是签名

8.添加短信模板

9.绑定测试手机号码

这里不绑定,发送会报错:只能向已回复授权信息的手机号发送

10.新建一个springboot项目,然后导包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.zyy</groupId>
	<artifactId>aliyun-sms</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>aliyun-sms</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>dysmsapi20170525</artifactId>
			<version>2.0.24</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba.fastjson2</groupId>
			<artifactId>fastjson2</artifactId>
			<version>2.0.28</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 11.生成验证码工具类

import java.util.Random;

/**
 * 随机生成验证码工具类
 */
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     *
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length) {
        Integer code = null;
        if (length == 4) {
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if (code < 1000) {
                code = code + 1000;//保证随机数为4位数字
            }
        } else if (length == 6) {
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if (code < 100000) {
                code = code + 100000;//保证随机数为6位数字
            }
        } else {
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     *
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length) {
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

12.测试代码

import com.alibaba.fastjson2.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import com.zyy.utils.ValidateCodeUtils;

import java.util.HashMap;
import java.util.Map;

public class Sample {

    /**
     * 使用AK&SK初始化账号Client
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
        Client client = Sample.createClient("LTAI5tD*****", "cvYFE******");

        Integer code = ValidateCodeUtils.generateValidateCode(4);

        Map<String, Integer> paramMap = new HashMap<>();
        paramMap.put("code", code);

        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setPhoneNumbers("182******06");
        sendSmsRequest.setSignName("大垚大摆");
        sendSmsRequest.setTemplateCode("SMS_462005158");
        sendSmsRequest.setTemplateParam(JSON.toJSONString(paramMap));

        RuntimeOptions runtime = new RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
            System.out.println(JSON.toJSONString(sendSmsResponse.getBody()));
        } catch (TeaException error) {
            // 如有需要,请打印 error
            Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            Common.assertAsString(error.message);
        }
    }
}

 编写可复用的微服务接口,实现验证码的发送

13.编写笔记

1.导包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.zyy</groupId>
	<artifactId>aliyun-sms</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>aliyun-sms</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>dysmsapi20170525</artifactId>
			<version>2.0.24</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba.fastjson2</groupId>
			<artifactId>fastjson2</artifactId>
			<version>2.0.28</version>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2.配置文件

server:port: 8088

spring:
  redis:
    host: 127.0.0.1
    port: 6379

 3.接口

import java.util.Map;


public interface SendSmsService {
    boolean send(String phoneNo, String templateCode, Map<String, Integer> paramMap) throws Exception;
}

4.实现类

import com.alibaba.fastjson2.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.zyy.service.SendSmsService;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class SendSmsServiceImpl implements SendSmsService {


    /**
     * 使用AK&SK初始化账号Client
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    private Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }

    @Override
    public boolean send(String phoneNo, String templateCode, Map<String, Integer> paramMap) throws Exception {
        Client client = createClient("LTAI5tD2A3bF7RMB8vJ1EUSs", "cvYFEWcvZsoX1jJDLXOmLiT2NJMjsq");

        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setPhoneNumbers(phoneNo);
        sendSmsRequest.setSignName("大垚大摆");
        sendSmsRequest.setTemplateCode(templateCode);
        sendSmsRequest.setTemplateParam(JSON.toJSONString(paramMap));

        RuntimeOptions runtime = new RuntimeOptions();

        SendSmsResponse response = client.sendSmsWithOptions(sendSmsRequest, runtime);

        if ("OK".equals(response.getBody().getCode())) {
            return true;
        }
        return false;

    }
}

5.controller

import com.zyy.service.SendSmsService;
import com.zyy.utils.ValidateCodeUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

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


@RestController
public class SendSmsController {

    @Resource
    private SendSmsService sendSmsService;

    @Resource
    private RedisTemplate redisTemplate;

    @RequestMapping(value = "/send/{phoneNo}", method = RequestMethod.GET)
    public String sendSms(@PathVariable("phoneNo") String phoneNo) {

        Object codeObj = redisTemplate.opsForValue().get(phoneNo);

        if (codeObj != null) {
            return "[手机号: " + phoneNo + "],[验证码: " + codeObj + "],还未过期";
        }

        Integer code = ValidateCodeUtils.generateValidateCode(4);

        Map<String, Integer> paramMap = new HashMap<>();
        paramMap.put("code", code);

        String templateCode = "SMS_462005158";

        boolean send;
        try {
            send = sendSmsService.send(phoneNo, templateCode, paramMap);
        } catch (Exception e) {
            return "[手机号: " + phoneNo + "],[验证码: " + code + "],发送异常";
        }
        if (send) {
            redisTemplate.opsForValue().set(phoneNo, code, 1, TimeUnit.MINUTES);
            return "[手机号: " + phoneNo + "],[验证码: " + code + "],发送成功";
        }
        return "[手机号: " + phoneNo + "],[验证码: " + code + "],发送失败";
    }
}

6.启动本地redis服务

7.启动springboot服务  

访问http://localhost:8088/send/手机号码

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值