SpringBoot实现阿里云短信发送

Spring Boot实现阿里云短信发送

今天写了个阿里云的短信发送业务 , 具体阿里云短信申请这些就不记录了官网写的很清楚,记录下代码以后忘记了好快速复制粘贴 ,哈哈狗头

先导入依赖: 阿里云 和 fastjson lomback, redis 直接在boot init 中勾选即可

<!--阿里云-->
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-core</artifactId>
			<version>4.5.3</version>
		</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.62</version>
		</dependency>
<!--lomback-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

编写一个测试代码 没有对其 封装 参考官方文档写的

@Test
    void sendMsg(){
        DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", "accessKeyId", "accessKeySecret");
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        //下面这3个不要改动
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        //接收短信的手机号码
        request.putQueryParameter("PhoneNumbers","接收短信的手机号码");
        //短信签名名称
        request.putQueryParameter("SignName","短信签名名称");
        //短信模板ID
        request.putQueryParameter("TemplateCode","短信模板ID");
        //短信模板变量对应的实际值 ${code} 中的值
        Map<String,String> param = new  HashMap<>(2);
        param.put("code","1024");
        request.putQueryParameter("TemplateParam",JSONObject.toJSONString(param));

        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }

对其进行方法封装

1.创建 AliyunSendMsgConfig 类保存配置
package com.szqbl.cxy.hzty.aliyun;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 发送短信配置
 */
@Configuration
@ConfigurationProperties(prefix = "aliyun.send-msg")
@Data
public class AliyunSendMsgConfig {

    private String accessKeyId;
	
    private  String accessKeySecret;
    ///短信签名名称
    private String SignName;
    //短信模板ID
    private String TemplateCode;
}

2.以上完成后 就可以到 application.yml 或者 .properties 配置参数避免 硬编码
#阿里云 msg
aliyun:
   send-msg: 
    accessKeyId :  你的accessKeyId
    accessKeySecret :  你的accessKeySecret
    SignName :  短信签名名称
    TemplateCode :  短信模板ID
3.创建sendMsgService 接口 分层操作

public interface SendMsgService {
    /**
     *
     * @param phoneNumbers 手机
     * @param param 发送 code
     * @return
     */
    public Boolean sendMsg(String  phoneNumbers, Map<String ,Integer> param);
}

4.创建sendMsgService Impl 实现类
@Service
public class SendMsgServiceImpl implements SendMsgService {
	//注入之前写好的配置类
    @Autowired
    private AliyunSendMsgConfig aliyunSendMsgConfig;
    /**
     * @param phoneNumbers 手机
     * @param param   发送 code
     * @return
     */
    @Override
    public Boolean sendMsg(String phoneNumbers, Map<String, Integer> param) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", aliyunSendMsgConfig.getAccessKeyId(), aliyunSendMsgConfig.getAccessKeySecret());
        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",phoneNumbers);
        //短信签名名称
        request.putQueryParameter("SignName",aliyunSendMsgConfig.getSignName());
        //短信模板ID
        request.putQueryParameter("TemplateCode",aliyunSendMsgConfig.getTemplateCode());
        //短信模板变量对应的实际值
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));
        try {
            CommonResponse response = client.getCommonResponse(request);
            // 是否发送成功
            return response.getHttpResponse().isSuccess();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}

5.创建 控制器 Controller 配合 redis

/**
 * 短信发送
 */
@Controller
@RequestMapping("api/")
//@AnonymousPermission 公司的权限注解 可以去掉
// BaseApiController  这个是公司封装的可以去掉 
public class SendMsgController extends BaseApiController {

    @Autowired
    private SendMsgService sendMsgService;
	// RedisTemplate
    @Resource
    private RedisTemplate<String,String> redisTemplate;
	//公司封装的 可以去掉 
   // @Autowired
   // protected DataCacheService dataCacheService;

	//BaseResult 可以自己创建一个 返回视图类 data code msg 
    @RequestMapping(value = "sendMsg.do",method = RequestMethod.GET)
    @ResponseBody
    public BaseResult<?> sendMsg(@RequestParam String phone){
        // CheckUtil.isMobilePhone(phone) 这个手机号码正则 可以 百度一个 这个是公司封装的
        if (StringUtils.isNotBlank(phone) && CheckUtil.isMobilePhone(phone)){
            String code = redisTemplate.opsForValue().get(phone);
            if (stringUtils.isNotBlank(code)){
                return result("验证码未过期,请勿重复发送");
            }
           //if (dataCacheService.exists(phone)){
            //    return result("验证码未过期,请勿重复发送");
           // }
            Map<String,Integer> param =new HashMap<>(2);
            //随机生成一个4位数的 数字
            param.put("code",(int) ((Math.random() * 9 + 1) * 1000));
            Boolean isSend = sendMsgService.sendMsg(phone, param);
            //发送成功
            if (isSend){
                //添加到缓存 5分钟
redisTemplate.opsForValue().set(phone,String.valueOf(param.get("code")),5, TimeUnit.SECONDS);
                String s = redisTemplate.opsForValue().get(phone);
                System.out.println(s);
               //  这个是公司自己封装的redis 模板dataCacheService.set(phone,String.valueOf(param.get("code")),300L);
                return result("发送成功");
            }
        }
        throw new BaseValidationException("请输入正确的手机号码!");
    }
}

以上就完成了springboot 操作阿里云发送短信的功能了


版权声明:本文为weng74原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。