zoukankan      html  css  js  c++  java
  • 短信微服务

    一、需求分析

      构建一个通用的短信发送服务(一个独立的工程),接收activeMQ的消息(MAP类型)  消息包括手机号(mobile)、短信模板号(template_code)、签名(sign_name)、参数字符串(param )

    二、工程搭建

      (1)创建工程itcast_sms (JAR工程),POM文件引入依赖 

      <properties>   
        <java.version>1.7</java.version>
      </properties>
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
      </parent>  
      <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
               <groupId>com.aliyun</groupId>
               <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
               <version>1.0.0-SNAPSHOT</version>
           </dependency>
           <dependency>
               <groupId>com.aliyun</groupId>
               <artifactId>aliyun-java-sdk-core</artifactId>
               <version>3.2.5</version>
           </dependency>
      </dependencies>

      (2)创建引导类

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

      (3)创建配置文件application.properties

    server.port=9003
    spring.activemq.broker-url=tcp://192.168.25.137:61616
    accessKeyId=不告诉你
    accessKeySecret=不告诉你

    三、创建短信工具类

    @Component
    public class SmsUtil {
    
        //产品名称:云通信短信API产品,开发者无需替换
        static final String product = "Dysmsapi";
        //产品域名,开发者无需替换
        static final String domain = "dysmsapi.aliyuncs.com";
        
        @Autowired
        private Environment env;
    
        // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
        
        /**
         * 发送短信
         * @param mobile 手机号
         * @param template_code 模板号
         * @param sign_name 签名
         * @param param 参数
         * @return
         * @throws ClientException
         */
        public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException {
    
            String accessKeyId =env.getProperty("accessKeyId");
            String accessKeySecret = env.getProperty("accessKeySecret");
            
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
    
            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(sign_name);
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(template_code);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(param);
    
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
    
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.setOutId("yourOutId");
    
            //hint 此处可能会抛出异常,注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
    
            return sendSmsResponse;
        }
    
        public  QuerySendDetailsResponse querySendDetails(String mobile,String bizId) throws ClientException {
            String accessKeyId =env.getProperty("accessKeyId");
            String accessKeySecret = env.getProperty("accessKeySecret");
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象
            QuerySendDetailsRequest request = new QuerySendDetailsRequest();
            //必填-号码
            request.setPhoneNumber(mobile);
            //可选-流水号
            request.setBizId(bizId);
            //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
            SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
            request.setSendDate(ft.format(new Date()));
            //必填-页大小
            request.setPageSize(10L);
            //必填-当前页码从1开始计数
            request.setCurrentPage(1L);
            //hint 此处可能会抛出异常,注意catch
            QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
            return querySendDetailsResponse;
        }
    }

    四、消息监听类

      创建SmsListener.java

    @Component
    public class SmsListener {
        @Autowired
        private SmsUtil smsUtil;
        
        @JmsListener(destination="sms")
        public void sendSms(Map<String,String> map){        
            try {
                SendSmsResponse response = smsUtil.sendSms(
                        map.get("mobile"), 
                        map.get("template_code"),
                        map.get("sign_name"),
                        map.get("param")  );                     
                    System.out.println("Code=" + response.getCode());
                    System.out.println("Message=" + response.getMessage());
                    System.out.println("RequestId=" + response.getRequestId());
                    System.out.println("BizId=" + response.getBizId());            
            } catch (ClientException e) {
                e.printStackTrace();            
            }        
        }
    }

    五、创建消息生产者

    @RestController
    public class QueueController {
        @Autowired
        private JmsMessagingTemplate jmsMessagingTemplate;
    
        @RequestMapping("/sendsms")
        public void sendSms() {
            Map map = new HashMap();
            map.put("mobile", "18676843053");
            map.put("template_code", "SMS_1623522989");
            map.put("sign_name", "品优购");
            //code是我们申请模板时写的参数
            map.put("param", "{"code":"102931"}");
            jmsMessagingTemplate.convertAndSend("sms", map);
        }
    }

      启动itcast_sms

      启动springboot-demo(消息生产者所在的工程)

      地址栏输入:http://localhost:8088/sendsms.do

      观察控制台输出

       

      随后短信也成功发送到你的手机上

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10638545.html
Copyright © 2011-2022 走看看