阿里云短信业务

阿里云短信服务

参考B站狂神说java
https://www.bilibili.com/video/BV1c64y1M7qN?from=search&seid=12654527917124728671

了解阿里云用户权限操作

阿里云短信业务
1、开启子用户
2、新建一个用户组(设置添加权限)
3、创建一个用户(具体用来操作的账号)
4、得到Accesskey(id,密码)

注意:要将这个账号保存起来

开通阿里云短信业务

1、找到短信控制台面板
阿里云短信业务

2、找到帮助文档
https://help.aliyun.com/product/44282.html?spm=5176.12207334.0.0.46ae1cbeqZyjNa

添加短信模板

1、短信的具体内容
2、等待审核通过(需要正当的理由)

添加签名

1、公司名称
2、等待审核通过(需要正当的理由)

编写测试代码

pom

 <!--导入依赖-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

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

SendSms

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

SendSmsImpl

@Service
public class SendSmsImpl implements SendSms {
    @Override
    public boolean send(String phoneNumber, String templateCode, Map<String, Object> code) {

        //连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<Accesskey>", "<secret>");
        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", phoneNumber);
        request.putQueryParameter("SignName", "传智健康");
        request.putQueryParameter("TemplateCode", templateCode);

        //构建短信验证码

        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;
    }
}

SmsApiController

@RestController
@CrossOrigin//跨域支持
public class SmsApiController {
    @Autowired
    private SendSms sendSms;

    @Autowired
    private StringRedisTemplate redisTemplate;

    private static final String KEY_PERFIX = "user:verify:phone:";

    @GetMapping("/send/{phone}")
    public String code(@PathVariable("phone") String phone) {

        //调用方法发送
        //对同一个手机号进行限流,一分钟之内不让他重复发送
        //String code = redisTemplate.opsForValue().get(phone);
        String lastTime = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(lastTime)) {
            Long last = Long.valueOf(lastTime);
            if (System.currentTimeMillis() - last < 60000)//当前时间和你上一次发送的时间小于1分钟
                return phone + "发送短信频率过高";
        }

        //生成短信验证码,并存入redis
        String code = UUID.randomUUID().toString().substring(0, 4);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code", code);

        boolean isSend = sendSms.send(phone, "SMS_176535793", map);
        if (isSend) {
            redisTemplate.opsForValue().set(KEY_PERFIX + phone, code, 5, TimeUnit.MINUTES);//将验证码存入redis,时间5分钟

            redisTemplate.opsForValue().set(phone, String.valueOf(System.currentTimeMillis()), 1, TimeUnit.MINUTES);//以用户手机号phone为key,发送验证码时 的时间为value,对手机号限流时 进行判断
            return phone + ":" + code + "发送成功";
        }
        return "发送失败";
    }
}

http://localhost:8080/send/phone
阿里云短信业务

阿里云短信业务

上一篇:判断字符串中中是否有手机号


下一篇:CF1023F Mobile Phone Network