巴拉巴拉
小魔仙

阿里云短信升级篇-mns

自从阿里云短信合并到了消息服务之后和以前不太一样了。虽然说不知道以前的sdk还是否有效,不过还是更新写一篇针对新版MNS的阿里云SMS短信Demo吧。阿里云短信服务升级之后居然涨价了,这点妥妥的不开心,0.035涨价到0.045.

 

想看以前老版本demo可以访问:操碎心的AliyunSMS,短信通知推送

如果你想学习老版本的sdk的话,就不推荐看了,因为有新版的sdk,但是如果你想学习一下反射,自定义注解,fastjson里面一些东西的话,例如fastjson字段过滤器,还是值得一看的。

本文中,已经没有使用fastjson了让代码简洁一些,老版本当中偏技术学习的概念居多。

新版sdk:

<dependency>
    <groupId>com.aliyun.mns</groupId>
    <artifactId>aliyun-sdk-mns</artifactId>
    <version>1.1.8</version>
    <classifier>jar-with-dependencies</classifier>
</dependency>

在介绍阿里云短信之前,先介绍一下阿里云的两个东西。

分别是ACCESS_KEY_ID和ACCESS_KEY_SECRET。

它们是用来操作所有阿里云服务的关键。

阿里云短信在升级mns服务之后,开始使用主题这一个概念进行推送,关于主题,消息队列这一系列内容我会在以后的博客中说到。这里我们在原来的老阿里云sms短信服务当中新加几个概念,还有原本就有的概念。

  1. 签名(SignName):签名是每条短信中必须会存在的内容,例如你的签名是:‘阿里云’,那么你的短信必定是:【阿里云】xxxxxx。是的【xxx】中的内容,就是你的签名,个人用户可以申请并审核通过一个签名,企业用户是5个。
  2. 模版:短信的内容是固定的例如:“尊敬的${name},您的验证码为:${code},请在${time}内使用。”,模板也是要申请并且审核的,模板分为验证码和通知类短信,每个手机号每分钟只能接收一条短信,每小时5条,每天10条。短信通知类,每个模板每个手机号可以接收50条。(限制规则也比老板的短信服务多了很多,不开森)
  3. 模板CODE(TemplateCode):用来指定使用哪个模板,SMS_332*****
  4. 主题名称(topic):根据地区选择的不通,主题也不同,例如华东1:sms.topic-cn-hangzhou
  5. Endpoint:最后的请求到哪里,可以是公网,私网,还有VPC专网

1.签名的获取

2.短信模板,模板申请审核通过后会看到模板CODE

3.获取主题名称和Endpoint


好了,基本内容介绍完开始介绍代码了

com.againfly.util.aliyun.sms
    ├─annotation
    │   └SmsParame.java              --一个短信字段注解
    ├─template
    │   ├SmsBody.java                --模板接口
    │   │
    │   └VerificationCode.java       --验证码模板,实现SmsBody接口
    │
    └SmsUtil.java                    --外部调用的工具类
Const.java    --常量存放类

注解代码:

package com.againfly.util.aliyun.sms.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SmsParame {
	public String value() default "";
}

接口:SmsBody主要是一个抽象了一个获取模板Code的方法

package com.againfly.util.aliyun.sms.template;

public interface SmsBody {
	String getTemplateCode();
}

 

模板:模板需要实现SmsBody接口,模版中的字段需要使用@SmsParam标记,如果字段名和模版中的参数不匹配,可以在注解中标记@SmsParame("time"),time就是模版当中的${time}

package com.againfly.util.aliyun.sms.template;

import com.againfly.util.aliyun.sms.annotation.SmsParame;

public class VerificationCode implements SmsBody{
	@SmsParame
	private String name;
	@SmsParame
	private String code;
	@SmsParame("time")
	private String time;
	
	public VerificationCode(String name, String code, String time) {
		this.name = name;
		this.code = code;
		this.time = time;
	}

	@Override
	public String getTemplateCode() {
		return "SMS_332xxxxxx";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTime() {
		return time;
	}

	public void setTime(String time) {
		this.time = time;
	}

	public void setCode(String code) {
		this.code = code;
	}
}

SmsUtil.java,短信工具类

package com.againfly.util.aliyun.sms;

import java.lang.reflect.Field;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.againfly.util.aliyun.sms.annotation.SmsParame;
import com.againfly.util.aliyun.sms.template.SmsBody;
import com.againfly.util.aliyun.sms.template.VerificationCode;
import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudTopic;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.ServiceException;
import com.aliyun.mns.model.BatchSmsAttributes;
import com.aliyun.mns.model.MessageAttributes;
import com.aliyun.mns.model.RawTopicMessage;
import com.aliyun.mns.model.TopicMessage;

public class SmsUtil {
	private static CloudTopic topic = null;
	private static MNSClient client = null;
	/**
	 * 签名名称
	 */
	private static final String SignName = "众课小组";
	private static Logger logger = LoggerFactory.getLogger(SmsUtil.class);
	
	static{
		SmsUtil.init();
	}
	
	/**
	 * @Title: init
	 * @Description: 初始化操作
	 * @author Jecced
	 */
	public static void init(){
		CloudAccount account = new CloudAccount("***access key id***", 
				"***access key secret***", 
				"***mns sms endpoint***");
		client = account.getMNSClient();
        topic = client.getTopicRef("sms.topic-cn-shanghai");
        logger.info("aliyun mns init!");
	}
	
	/**
	 * @Title: send
	 * @Description: 发送短信
	 * @author Jecced
	 * @param phone 短信接收人
	 * @param body 短信模板内容
	 */
	public static void send(String phone, SmsBody body){
		RawTopicMessage msg = new RawTopicMessage();
        msg.setMessageBody("sms-message");
        MessageAttributes messageAttributes = new MessageAttributes();
        BatchSmsAttributes batchSmsAttributes = new BatchSmsAttributes();
        batchSmsAttributes.setFreeSignName(SignName);
        batchSmsAttributes.setTemplateCode(body.getTemplateCode());
        BatchSmsAttributes.SmsReceiverParams smsReceiverParams = new BatchSmsAttributes.SmsReceiverParams();
        Class<? extends SmsBody> clazz = body.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for(Field field : fields){
        	SmsParame param = field.getAnnotation(SmsParame.class);
        	if(null == param){
        		continue;
        	}
        	String key = param.value();
    		if("".equals(key)){
    			key = field.getName();
    		}
    		field.setAccessible(true);
    		String value = "";
    		try {
				Object obj = field.get(body);
				if(obj instanceof String){
					value = (String)obj;
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
    		if(null!= value && !"".equals(value.trim()) && value.length() > 15){
    			value = value.substring(0, 15);
    		}
    		smsReceiverParams.setParam(key, value);
        }
        batchSmsAttributes.addSmsReceiver(phone, smsReceiverParams);
        messageAttributes.setBatchSmsAttributes(batchSmsAttributes);
        try {
            TopicMessage ret = topic.publishMessage(msg, messageAttributes);
            System.out.println("MessageId: " + ret.getMessageId());
            System.out.println("MessageMD5: " + ret.getMessageBodyMD5());
        } catch (ServiceException se) {
            System.out.println(se.getErrorCode() + se.getRequestId());
            System.out.println(se.getMessage());
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
	
	public static void destory(){
		client.close();
		logger.info("aliyun mns destory");
	}
}

 

最后,我们来测试一下代码

public static void main(String[] args) {

        SmsUtil.send("185xxxxxxxx", new VerificationCode("Jecced", "1212", "10分钟"));

        destory();

}

2017-07-21 10:59:04 INFO  SmsUtil:46 - aliyun mns init!
MessageId: 9F804164ECE38C29-1-15D6315961E-200000013
MessageMD5: 5BE1F9F6B1D99B653C5D34364500F501
2017-07-21 10:59:05 INFO  SmsUtil:110 - aliyun mns destory

赞(1) 打赏
如果文章对你有帮助,欢迎你来评价反馈。AgainFly » 阿里云短信升级篇-mns
标签:

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • Q Q(选填)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏