自从阿里云短信合并到了消息服务之后和以前不太一样了。虽然说不知道以前的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短信服务当中新加几个概念,还有原本就有的概念。
- 签名(SignName):签名是每条短信中必须会存在的内容,例如你的签名是:‘阿里云’,那么你的短信必定是:【阿里云】xxxxxx。是的【xxx】中的内容,就是你的签名,个人用户可以申请并审核通过一个签名,企业用户是5个。
- 模版:短信的内容是固定的例如:“尊敬的${name},您的验证码为:${code},请在${time}内使用。”,模板也是要申请并且审核的,模板分为验证码和通知类短信,每个手机号每分钟只能接收一条短信,每小时5条,每天10条。短信通知类,每个模板每个手机号可以接收50条。(限制规则也比老板的短信服务多了很多,不开森)
- 模板CODE(TemplateCode):用来指定使用哪个模板,SMS_332*****
- 主题名称(topic):根据地区选择的不通,主题也不同,例如华东1:sms.topic-cn-hangzhou
- 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
最新评论