springboot 快速啓動(十二)——發送短信

一、說明
本文講的是boot結合阿里大於短信服務,關於如何接入阿里大於短信服務下面有鏈接

阿里大於短信服務接入地址:https://blog.csdn.net/weixin_42083036/article/details/102463595

不多廢話直接開始

步驟
1、導入依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- 添加jedis客戶端 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--Alibaba Cloud SDK for Java核心庫-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ecs</artifactId>
            <version>4.11.0</version>
        </dependency>


        <!--阿里fastjson工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>
        <!-- JSONObject對象依賴的jar包 -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ezmorph</groupId>
            <artifactId>ezmorph</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.2.3</version>
            <classifier>jdk15</classifier><!-- 指定jdk版本 -->
        </dependency>

yml文件配置

#msg
aliyunSms:
  AccessKeyID: 自己的
  AccessKeySecret: 自己的
#address
eureka:
  client:
    serviceUrl:
      defaultZone: http://47.97.188.93:8761/eureka/
#server port
server:
  port: 8888
  servlet:
    context-path: /sms
#server name
spring:
  application:
    name: sms-server
#redis
  redis:
    database: 2
    host: 47.97.188.93
    jedis:
      pool:
        max-active: 8
        max-idle: 5
        max-wait: -1
    password: xxx
    port: 6379
    timeout: 10000

配置類用於獲取配置

 * @description  短信配置類 用於配置ak
 **/
@Component
@PropertySource(value="classpath:application.yml")
public class SmsConfig {

    @Value("${aliyunSms.AccessKeyID}")
    public  String accessKeyID;

    @Value("${aliyunSms.AccessKeySecret}")
    public  String AccessKeySecret;

    public String getAccessKeyID() {
        return accessKeyID;
    }


    public void setAccessKeyID(String accessKeyID) {
        this.accessKeyID = accessKeyID;
    }

    public String getAccessKeySecret() {
        return AccessKeySecret;
    }


    public void setAccessKeySecret(String accessKeySecret) {
        this.AccessKeySecret = accessKeySecret;
    }
}

request

@Component
public class SmsRequest {


    private static Log logger= LogFactory.getLog(SmsRequest.class);

    public static  CommonRequest generateSmsRequest(String phone,Integer verificationCode,String templateCode){

        return GenerateCommonRequest.generateCommonRequest(templateCode,verificationCode,(model, code)->{
            CommonRequest request = new CommonRequest();
            request.setMethod(MethodType.POST);
            request.setDomain("dysmsapi.aliyuncs.com");
            request.setVersion("2017-05-25");
            request.setAction("SendSms");
            request.putQueryParameter("RegionId", "cn-hangzhou");
            request.putQueryParameter("PhoneNumbers",phone );
            request.putQueryParameter("SignName", ResponseConstant.SIGN_NAME);
            request.putQueryParameter("TemplateCode", model);
            request.putQueryParameter("TemplateParam", "{\"code\":\""+code+"\"}");
            logger.info(request);
            return request;
        });
    }

}

@Component
public class SmsResponse implements Serializable {

    /**
     * 時間格式
     */
    private String dateTimeFormatter = "yyyyMMdd";

    private static Log logger = LogFactory.getLog(SmsResponse.class);

    @Autowired
    private SmsConfig smsConfig;

    /**
     * 發送手機短信
     * @param phone
     */
    @Async("asyncPromiseExecutor")
    public void sendSms(String phone,Integer code,String templateCode){
        GenerateCommonResponse.getCommonResponse(phone,code,templateCode,(x,y,z)->{
            DefaultProfile profile = generateDefaultProfile();
            IAcsClient client = new DefaultAcsClient(profile);
            CommonRequest request = SmsRequest.generateSmsRequest(x,y,z);
            try {
                CommonResponse response = client.getCommonResponse(request);
                logger.info(response.getData());
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                e.printStackTrace();
            }
        });

    }

    /**
     *  JSONObject jsonObject = JSONObject.parseObject(msg);
     *             jsonObject.get("Code")=OK;
     * @return
     */
    public String getMsg(String phone) {
        DefaultProfile profile = generateDefaultProfile();
        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("QuerySendDetails");
        request.putQueryParameter("PhoneNumber", phone);
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("SendDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateTimeFormatter)));
        request.putQueryParameter("PageSize", "1");
        request.putQueryParameter("CurrentPage", "1");
        String msg = null;
        try {
            CommonResponse response = client.getCommonResponse(request);
            msg = response.getData();
            logger.info(msg);
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return msg;
    }

    /**
     * 工廠模式創建 DefaultProfile 實例
     * @return
     */
    private  DefaultProfile generateDefaultProfile(){

        Supplier supplier = ()->{
            return DefaultProfile.getProfile("cn-hangzhou",  smsConfig.accessKeyID, smsConfig.AccessKeySecret);
        };
        return (DefaultProfile)supplier.get();
    }

}

測試類

/**
 * @author 王博淵
 * @version 1.0
 * @date 2019/11/4 13:27
 * @description
 **/
@RestController
@RequestMapping("/api")
public class TestSend implements SendSmsFeign {

    /**
     * 消息狀態碼
     */
    private final static String SEND_SUCCESS ="OK";

    @Autowired
    private SmsResponse smsResponse;


    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    @RequestMapping(value = "send",method = RequestMethod.GET)
    public RetResult sendLoginSms(@RequestParam(value = "phone")String phone){
        JSONObject jsonObject = JSONObject.parseObject(smsResponse.getMsg(phone));
        Integer code = (int)Math.floor((Math.random()*9+1)*100000);
        smsResponse.sendSms(phone,code,ResponseConstant.LOGIN_TEMPLATE_CODE);
        if(SEND_SUCCESS.equals(jsonObject.get(ResponseConstant.CODE))){
            stringRedisTemplate.opsForValue().set(phone,code.toString());
            return RetResponse.makeRsp("200","短信發送成功",code);
        }
        return RetResponse.makeErrRsp();
    }

    @Override
    @RequestMapping(value = "sendRegister",method = RequestMethod.GET)
    public RetResult sendRegisterSms(@RequestParam(value = "phone")String phone){
        JSONObject jsonObject = JSONObject.parseObject(smsResponse.getMsg(phone));
        Integer code = (int)Math.floor(Math.random()*1000000);
        smsResponse.sendSms(phone,code,ResponseConstant.REGISTER_TEMPLATE_CODE);
        if(SEND_SUCCESS.equals(jsonObject.get(ResponseConstant.CODE))){
            stringRedisTemplate.opsForValue().set(phone,code.toString());
            return RetResponse.makeRsp("200","短信發送成功",code);
        }
        return RetResponse.makeErrRsp();
    }

    @Override
    @RequestMapping(value = "sendModify",method = RequestMethod.GET)
    public RetResult sendModifySms(@RequestParam(value = "phone")String phone){
        JSONObject jsonObject = JSONObject.parseObject(smsResponse.getMsg(phone));
        Integer code = (int)Math.floor(Math.random()*1000000);
        smsResponse.sendSms(phone,code,ResponseConstant.MODIFIED_TEMPLATE_CODE);
        if(SEND_SUCCESS.equals(jsonObject.get(ResponseConstant.CODE))){
            stringRedisTemplate.opsForValue().set(phone,code.toString());
            return RetResponse.makeRsp("200","短信發送成功",code);
        }
        return RetResponse.makeErrRsp();
    }

}

項目源碼地址:https://github.com/MandalasWang/sms-server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章