一、准备工作
1)、微服务发送短信。
1.创建maven工程,导入spring微服务相关依赖:
2.在resource包下,创建application.properties以及导入log4j.propertites
2.1 application.propertities如下:
# 改变默认端口
server.port=8889
#activemq所在服务器
spring.activemq.broker-url=tcp://192.168.25.130:61616
#腾讯短信秘钥,需要到腾讯云平台申请
appid=*****
appkey=******
#模板Id,需要到腾讯云平台申请
templateId=*****
#签名,需要到腾讯云平台申请
smsSign=*****
2.2 log4j.properties如下:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout
二、编写代码
3.微服务入口(启动微服务监听的入口,所在目录:cn.china3y.pyg.SmsApplication)
@SpringBootApplication
public class SmsApplication {
public static void main(String[] args) {
SpringApplication.run(SmsApplication.class, args);
}
}
*** 4.发送短信的工具类(*******)
package cn.china3y.pyg.qsmsUtils;
/**
* 被监听类调用,用于发送信息
*/
@Component
public class SmsUtils {
@Autowired
private Environment env;
// 短信应用SDK AppID
//int appid = ***; // 1400开头
// 短信应用SDK AppKey
//String appkey = "***";
// 短信模板ID,需要在短信应用中申请
//int templateId = ***; // NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请
//templateId7839对应的内容是"您的验证码是: {1}"
// 签名
//String smsSign = "***"; // NOTE: 这里的签名"腾讯云"只是一个示例,真实的签名需要在短信控制台中申请,另外签名参数使用的是`签名内容`,而不是`签名ID
// 需要发送短信的手机号码
//String[] phoneNumbers = {env.getProperty("phoneNumbers")};
public void sendSms(String phone, String code,String code_time) {
String[] phoneNumbers = {phone};
// 单发短信
try {
SmsSingleSender ssender = new SmsSingleSender(Integer.parseInt(env.getProperty("appid")), env.getProperty("appkey"));
//nationCode:国家码
//注意:这里的第三个参数,必须与申请的模板内容一致,否则报错:发送的信息与模板内容不一致
SmsSingleSenderResult result = ssender.send(0, "86", phoneNumbers[0],
"【签名】您的短信验证码为:" + code + ",验证码时间为"+code_time+"分钟内有效,请尽快完成验证", "", "");
System.out.print(result);
} catch (Exception e) {
// HTTP响应码错误
e.printStackTrace();
}
// 指定模板ID单发短信
try {
String[] params = {"***","777","77"};
//SmsMultiSender msender = new SmsMultiSender(appid, appkey);
SmsMultiSender msender = new SmsMultiSender(Integer.parseInt(env.getProperty("appid")), env.getProperty("appkey"));
SmsMultiSenderResult result = msender.sendWithParam("86", phoneNumbers,
Integer.parseInt(env.getProperty("templateId")), params, env.getProperty("smsSign"), "", ""); // 签名参数未提供或者为空时,会使用默认签名发送短信
System.out.print(result);
} catch (Exception e) {
// HTTP响应码错误
e.printStackTrace();
}
// 发送语音验证码
// 发送语音通知
// 拉取短信回执以及回复
try {
// Note: 短信拉取功能需要联系腾讯云短信技术支持(QQ:3012203387)开通权限
int maxNum = 10; // 单次拉取最大量
SmsStatusPuller spuller = new SmsStatusPuller(Integer.parseInt(env.getProperty("appid")), env.getProperty("appkey"));
// 拉取短信回执
SmsStatusPullCallbackResult callbackResult = spuller.pullCallback(maxNum);
System.out.println(callbackResult);
// 拉取回复
SmsStatusPullReplyResult replyResult = spuller.pullReply(maxNum);
System.out.println(replyResult);
} catch (Exception e) {
// HTTP响应码错误
e.printStackTrace();
}
// 拉取单个手机短信状态
try {
int beginTime = 1511125600; // 开始时间(unix timestamp)
int endTime = 1511841600; // 结束时间(unix timestamp)
int maxNum = 10; // 单次拉取最大量
SmsMobileStatusPuller mspuller = new SmsMobileStatusPuller(Integer.parseInt(env.getProperty("appid")), env.getProperty("appkey"));
// 拉取短信回执
SmsStatusPullCallbackResult callbackResult = mspuller.pullCallback("86",
phoneNumbers[0], beginTime, endTime, maxNum);
System.out.println(callbackResult);
// 拉取回复
SmsStatusPullReplyResult replyResult = mspuller.pullReply("86",
phoneNumbers[0], beginTime, endTime, maxNum);
System.out.println(replyResult);
} catch (Exception e) {
// HTTP响应码错误
e.printStackTrace();
}
}
}
以上4步已经可以实现短信发送了,下面使用activemq,中间件接受监听并调用发送短信工具类。
5.activeMq监听器()
package cn.china3y.pyg.qsmsListener;
/**
* 用于监听mq中的sms区域
* 当mq ,sms区接收到信息自动触发监听器,获取mq信息,
* 调用msUtils.sendSms(phone, code , code_time);实现短息发送
*/
@Component
public class SmsListener {
@Autowired
private SmsUtils smsUtils;
@JmsListener(destination = "sms")
public void sendSms(Map smsmap) {
try {
String phone = smsmap.get("phone");
String code = smsmap.get("code");
String code_time = smsmap.get("code_time");
//phone:需要发送短信的手机号; code:验证码; code_time:验证码有效时间
smsUtils.sendSms(phone,code,code_time);
} catch (Exception e) {
e.printStackTrace();
}
}
6.测试类(cn.china3y.pyg.SmsApplication)
package cn.china3y.pyg;
@RestController
public class QueueController {
@Autowired
private JmsTemplate jmsTemplate;
@RequestMapping("send")
public void smsSend() {
Map map = new HashMap<>();
map.put("phone", "***");
map.put("code", "18122");
map.put("code_time", "5");
jmsTemplate.convertAndSend("sms", map);
}