短信服务--阿里云学习使用札记

阿里云目前提供的短信服务主要有四项:

1:短信发送API

2:短信查询API

3:短信消息API

4:短信批量发送API

群发由于需要升级到企业用户才可以使用,暂时不在学习使用的考虑范围内了就。

-->短信发送API

编写了简单的form表单进行测试,在input框内输入电话号码,点击begin test按钮后,会收到验证码。

                    

                  

验证码是固定的,写成了"2tong",可以根据需要进行相应的修改。

扫描二维码关注公众号,回复: 2150392 查看本文章

使用方式为:

在pom.xml文件中引入:

<dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>3.7.1</version> 
    </dependency>
    <dependency>
    	<groupId>com.aliyun</groupId>
    	<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    	<version>1.1.0</version>
    </dependency>

新建java文件,编写相应的方法:

	public void test() throws ServerException, ClientException {
	    //设置超时时间-可自行调整
	    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
	    System.setProperty("sun.net.client.defaultReadTimeout", "10000");
	    //初始化ascClient需要的几个参数
	    final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
	    final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
	    //替换成自己的AK
	    final String accessKeyId = "";//你的accessKeyId(需要修改)
	    final String accessKeySecret = "";//你的accessKeySecret(需要修改)
	    //初始化ascClient,暂时阿里云不支持多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();
	     //使用post提交
	     request.setMethod(MethodType.POST);
	     //必填:待发送手机号。发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”。
	     request.setPhoneNumbers(this.phone);
	     //必填:短信签名-可在短信控制台中找到
	     request.setSignName(""); //这个会是短信的那个提示,例如[吃货店铺]
	     //必填:短信模板-这个可以在短信控制台中找到,自己设定短信模版后,阿里云会分配给你一个模版码值
	     request.setTemplateCode("");
	     //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
	     //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
	     request.setTemplateParam("{\"code\":\"2tong\"}"); //我这里只需要一个,因此,就只写了这个,而且写成了固定的
	     //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
	     request.setSmsUpExtendCode("90997");
	     //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
	     request.setOutId("");  //你的outId
 	    //请求失败这里会抛ClientException异常
	    SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
	    if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
	         //请求成功
	    	System.out.println("that is ok,2tong");
                //可以增添一些业务代码,如果需要的话            
            }
	    else {
                //请求失败,可以查看失败码值
                 System.out.println(sendSmsResponse.getCode());
	    }
		return;
	}

失败码值介绍的链接是:https://help.aliyun.com/knowledge_detail/57717.html?spm=a2c4g.11186623.2.9.H9gbF8

-->短信查询API

阿里云支持对某一个号码30天内的短信追踪

编写了简单的form表单进行测试,在input框内依次输入想要查询的手机号码、短信发送时返回的BizId、诸如20180528形式的日期,点击begin test可以看到查询结果。

                  

                  

使用方式为:

在pom.xml文件中引入:

<dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>3.7.1</version> 
    </dependency>
    <dependency>
    	<groupId>com.aliyun</groupId>
    	<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    	<version>1.1.0</version>

编写相应的方法:

public void testQuery() throws ClientException {
	//设置超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        //云通信产品-短信API服务产品名称(短信产品名固定,无需修改)
        final String product = "Dysmsapi";
        //云通信产品-短信API服务产品域名(接口地址固定,无需修改)
        final String domain = "dysmsapi.aliyuncs.com";
        //此处需要替换成自己的AK信息
        final String accessKeyId = "";
        final String accessKeySecret = "";
        //初始化ascClient
        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(this.phone);
        //可选-调用发送短信接口时返回的BizId
        request.setBizId(this.BizId);
        //必填-短信发送的日期 支持30天内记录查询(可查其中一天的发送数据),格式yyyyMMdd
        request.setSendDate(this.dateTime);
        //必填-页大小
        request.setPageSize(10L);
        //必填-当前页码从1开始计数
        request.setCurrentPage(1L);
        //hint 此处可能会抛出异常,注意catch
        QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
        //获取返回结果
       if(querySendDetailsResponse.getCode() != null && querySendDetailsResponse.getCode().equals("OK")){
    	   //代表请求成功
           System.out.println("短信明细查询接口返回数据----------------");
           System.out.println("Code=" + querySendDetailsResponse.getCode());
           System.out.println("Message=" + querySendDetailsResponse.getMessage());
           int i = 0;
           for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
           {
               System.out.println("SmsSendDetailDTO["+i+"]:");
               System.out.println("Content=" + smsSendDetailDTO.getContent());
               System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
               System.out.println("OutId=" + smsSendDetailDTO.getOutId());
               System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
               System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
               System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
               System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
               System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
           }
           
           System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
           System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
    	   
       }
}

-->短信消息API

这个API是阿里云在用户反馈后新增的一个API,支持:

支持上行消息接收、状态报告接收两项,两项下又依次支持MNS消息队列消费模式、HTTP批量推送模式。

只学习了MNS消息队列消费模式。

用户返回消息:12给发送短信的号码:

                                                        

点击begin test后,可以得到如下的响应:


使用方式为:

确保如下jar包加入到了工程之中:

                            

而后,在文件中新建类、方法:

public class ReceiveAlicomMsg {
	private static Log logger=LogFactory.getLog(ReceiveAlicomMsg.class);
	
	static class MyMessageListener implements MessageListener{
	        private Gson gson=new Gson();

		public boolean dealMessage(Message message) {
			// TODO Auto-generated method stub
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			//消息的几个关键值
			System.out.println("message receiver time from mns:" + format.format(new Date()));
			System.out.println("message handle: " + message.getReceiptHandle());
                        System.out.println("message body: " + message.getMessageBodyAsString());
                        System.out.println("message id: " + message.getMessageId());
                        System.out.println("message dequeue count:" + message.getDequeueCount());
                        System.out.println("Thread:" + Thread.currentThread().getName());
                        try{
            	            Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);

	                    //TODO 根据文档中具体的消息格式进行消息体的解析
                            String arg = (String) contentMap.get("arg");

                            //TODO 这里开始编写您的业务代码
                        }catch(com.google.gson.JsonSyntaxException e){
            	           logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
				//理论上不会出现格式错误的情况,所以遇见格式错误的消息,只能先delete,否则重新推送也会一直报错
				return true;
                        } catch (Throwable e) {
				//您自己的代码部分导致的异常,应该return false,这样消息不会被delete掉,而会根据策略进行重推
				return false;
			}

			//消息处理成功,返回true, SDK将调用MNS的delete方法将消息从队列中删除掉
			return true;
		}
	}
}



猜你喜欢

转载自blog.csdn.net/orange_612/article/details/80483088