发送短信验证码几乎是现在每个网站都要使用到的一个功能,如注册的时候要发送短息验证码,修改密码的时候也要发送。但是第三方提供给我们的接口只是一个方法而已,并没有提供给我们更多的一个良好,可读性强的接口,如何设计一个阅读性强,扩展性高的接口。那么我们就需要设计两个接口:
一.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;@Overridepublic boolean send(String zone, String acct, String msg) {return send(zone, acct, msg, null);}@Overridepublic 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;}@Overridepublic 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 {/*** 具体的第三方实现类* 提高扩展性,如果要更换第三方接口,这个类的所有代码都不需要修改,只需要修改注解就可以了*/@Autowiredprivate SmsSender sms;@Overridepublic 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;}@Overridepublic boolean send(String zone, String acct, String template, Map params) {return sms.send(zone, acct, template, params);}@Overridepublic boolean sendVerify(String zone, String acct,  String verCode) {return sms.sendVerify(zone, acct, verCode);}
}

java短信发送接口开发相关推荐

  1. java短信发送接口代码示例demo分享

    适用类型:适用于各类办公系统.ERP.CRM.电子商务平台的插件(如网站app短信验证码.群发短信会议通知.会员/客户关系交流.订单生成通知.发货通知.日程提醒.催费通知等等) 接 口特 点: 绿色短 ...

  2. SpringBoot项目实现短信发送接口开发

    一. 短信接口实现 描述:请求第三方短信接口平台(而第三方短信平台的接口请求是webservice方式实现的),此时我们要测试接口是否通,要用的工具SoapUI测试工具, 不能用PostMan,即使用 ...

  3. 阿里大鱼短信发送接口开发

    一. API接口介绍 alibaba.aliqin.fc.sms.num.send (短信发送) 向指定手机号码发送模板短信,模板内可设置部分变量.使用前需要在阿里大于管理中心添加短信签名与短信模板. ...

  4. JAVA发送手机短信,httpclient短信发送接口示例(java)

    httpclient短信发送接口示例(java),可用于直接用电脑发送短信,可根据实际情况,与联通移动公司洽谈接口,完成网上发送短信功能,如需jar包,可向联通移动公司项目部沟通. package c ...

  5. Java 短信发送 ( 腾讯云)

    Java 短信发送 (保姆级使用说明) 该功能可包括验证码短信,通知短信,调用腾讯云SDK,阿里云腾讯云大同小异,只是当时申请的时候,腾讯云支持公众号申请 ( 现在阿里云也支持了). 1. 前期准备 ...

  6. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  7. IDM短信发送接口设计说明

    对于大多数企业而言,信息化建设的主要目的是通过信息化驱动业务,实现业务升级与优化,主要有三种体现形式:建设业务系统,实现业务流程标准化.便捷化:整合业务系统和数据,形成数据资产:业务数据呈现,直观展现 ...

  8. 阿里云短信发送接口直接HTTP请求调用

    最新一个个性化项目,客户要求使用阿里云短信发送接口. 但是实在不想引入阿里云的SDK,就自己生成签名,拼接URL实现,  其实用他们的SDK最终也是一哥GET请求进行调用,归根接底还是HTTP请求. ...

  9. 短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求

    前言 承接前文<短信发送接口被恶意访问的网络攻击事件(一)紧张的遭遇战险胜>,在解决了短信发送的问题后,长长地舒了口气,也就各忙各的事情去了,本以为应该是个完美的收场,哪知道只是泥泞道路的 ...

最新文章

  1. 20170507Linux七周二次课 io监控free ps 网络状态 抓包
  2. 云上护航服务—保障云上的尖峰时刻
  3. ecshop 搜索热词推荐_拼多多搜索推广实操——如何选择正确的关键词实现高投产!...
  4. 444. Sequence Reconstruction
  5. mysql 两条数据相减_mysql 实现相邻两条数据相减
  6. android 崩溃相关
  7. RocketMQ Message相关命令【实战笔记】
  8. 如何修改QT项目的项目名称?
  9. windows系统 电脑系统重装详细教程(看这一篇就够了)
  10. 电商用户RFM分析(平均值计算中心点)
  11. 网络安全——无线局域网安全技术——802.11i
  12. 阿里巴巴亏损114.56亿元,投资者:早有预料
  13. [POI2011]SEJ-Strongbox
  14. 【无标题】关于机械版CAD零件序号乱了重新排序的问题
  15. 盛天海科技:拼多多怎么提高转化?
  16. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
  17. WP 平衡球游戏开发教程(三) -DebugDraw(XNA渲染)
  18. 修马达的php源码,查看SKU:RB-02S087 振动马达模块的源代码
  19. 空气源热泵还能更节能吗
  20. 终于有华为网工整理网工10大必备软件,最新软件安装包

热门文章

  1. Java—二维码生成与识别(一)
  2. 使用Google colab的GPU运行resnet
  3. crosstab交叉表_用Python统计推断——交叉表篇(上:crosstab与热图)
  4. 百度网盘如何在线播放电影?
  5. 猜数字游戏c语言提示范围,【游戏编程】猜数字游戏(C语言)
  6. 开涛的博客 spring
  7. 对你来说,哪一个深度学习网络是最佳选择?(2)
  8. 黑苹果Mac系统快捷键修改
  9. Windows 10 运行python弹出windows应用商店
  10. 将Ubuntu主文件夹里的中文文件夹名称改成英文