您的位置:首页 > 编程语言 > Java开发

java短信发送接口开发

2017-03-08 18:06 393 查看
发送短信验证码几乎是现在每个网站都要使用到的一个功能,如注册的时候要发送短息验证码,修改密码的时候也要发送。但是第三方提供给我们的接口只是一个方法而已,并没有提供给我们更多的一个良好,可读性强的接口,如何设计一个阅读性强,扩展性高的接口。那么我们就需要设计两个接口:

一.SmsSender 接口,对接第三方短信,可以扩展支持不同的实现,如创蓝,leancloud等(相当于dao层),这个接口只负责实现发送短信,不负责其他的逻辑业务

二.SmsService 接口,发送短信的service层,这一层负责逻辑业务,如判断参数的正确性,统计短信发送的条数,但是最主要的功能就是,当需要修改第三实现接口的时候,只需要修改交注入的类,而不用修改代码。就可以实现第三短信提供商的切换。

1.SmsSender 接口,通用的sms类,

public interface SmsSender {
/**
* 中国区内为86,设计为国际化
*/
public static String Zone_CN = "86";
/**
* 发送短信
* @param zone  地区
* @param mobile 手机号码
* @param template  模板
* @return
*/
public boolean send(String zone, String mobile, String template);

public boolean send(String zone, String mobile, String template, Map params);

/**
* 发送验证码
*/
public boolean sendVerify(String zone, String mobile, String verCode);
}


2.SmsSender 接口的实现类ClSmsSender,该类对接的是第三方短信提供商的具体实现方法,如本文使用创蓝短信

@Service
public class ClSmsSender implements SmsSender {

private static final Logger log = LoggerFactory.getLogger(ClSmsSender.class);

@Value("#{properties['cl_url']}")
private String url;
@Value("#{properties['cl_user']}")
private String user;
@Value("#{properties['cl_pwd']}")
private String pwd;

@Override
public boolean send(String zone, String acct, String msg) {
return send(zone, acct, msg, null);
}

@Override
public boolean send(String zone, String acct, String msg, Map params) {
if (CommonUtil.isNotEmpty(zone) && Zone_CN.equals(zone) && Validator.isMobile(acct)) {
try {
String str = batchSend(acct, msg, true, null);
if (str != null && str.length() > 0) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
;// do nothing; //后期改成用国际短信接口
}
return false;
}

@Override
public boolean sendVerify(String zone, String mobile, String verCode) {
String msg = "【253云通讯】您好,你的验证码是" + verCode;
if (CommonUtil.isNotEmpty(zone) && Zone_CN.equals(zone) ) {
try {
String str = batchSend(mobile, msg, true, null);
if (str != null && str.length() > 0) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
;// do nothing; //后期改成用国际短信接口
}
return false;
}

/**
* 真正的发送方法
*/
private String batchSend(String mobile, String msg, boolean needstatus, String extno) throws Exception {
HttpClient client = new HttpClient(new HttpClientParams(), new SimpleHttpConnectionManager(true));
GetMethod method = new GetMethod();
try {
URI base = new URI(url, false);
method.setURI(new URI(base, "HttpBatchSendSM", false));
method.setQueryString(new NameValuePair[] { new NameValuePair("account", user),
new NameValuePair("pswd", pwd), new NameValuePair("mobile", mobile),
new NameValuePair("needstatus", String.valueOf(needstatus)), new NameValuePair("msg", msg),
new NameValuePair("extno", extno), });
int result = client.executeMethod(method);
if (result == HttpStatus.SC_OK) {
InputStream in = method.getResponseBodyAsStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String s = URLDecoder.decode(baos.toString(), "UTF-8");
return s;
} else {
throw new Exception("HTTP ERROR Status: " + method.getStatusCode() + ":" + method.getStatusText());
}
} finally {
method.releaseConnection();
}
}

}


3.SmsService 类,发送短信的service层接口,有人感觉这个接口多余,客官,静下心来往下看。

public interface SmsService {
/**
* 发送短信
* @param zone  地区
* @param acct  号码,可以是多个号码,用英文逗号连接
* @param template  短信模板
* @return
*/
boolean send(String zone, String acct, String template);

boolean send(String zone, String acct, String template, Map params);
/**
* 发送验证码
*/
boolean sendVerify(String zone, String acct, String verCode);
}


4.SmsService接口的实现类SmsServiceImpl

@Service
public class SmsServiceImpl implements SmsService {

/**
* 具体的第三方实现类
* 提高扩展性,如果要更换第三方接口,这个类的所有代码都不需要修改,只需要修改注解就可以了
*/
@Autowired
private SmsSender sms;

@Override
public boolean send(String zone, String acct, String template) {
/*
* 业务层
* 1.判断发送过来的acct是否是用英文逗号连接起来的手机号码字符串
* 2.统计发送短信的条数
* 这些业务都在这里记录
*/
//      String[] mobileArry = acct.split(",");
//      for (String mobile : mobileArry) {
//
//      }
sms.send(zone, acct, template);
return true;
}

@Override
public boolean send(String zone, String acct, String template, Map params) {
return sms.send(zone, acct, template, params);
}

@Override
public boolean sendVerify(String zone, String acct,  String verCode) {
return sms.sendVerify(zone, acct, verCode);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息