java短信发送接口开发

发送短信验证码几乎是现在每个网站都要使用到的一个功能,如注册的时候要发送短息验证码,修改密码的时候也要发送。但是第三方提供给我们的接口只是一个方法而已,并没有提供给我们更多的一个良好,可读性强的接口,如何设计一个阅读性强,扩展性高的接口。那么我们就需要设计两个接口:
一.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);
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值