1.做过两个短信验证码的平台介入:
第一:发送的时候携带平台的key,手机号,短信内容,这种相对于简单,只需要对内容数据进行转码操作就能进行发送。
第二:这种就比较复杂一点,短信介入需要发送xml格式的数据,发送之前需要对发送的xml的值进行字典排序之后再进行md5加密。之后把加密的字符串加入到xml中一起发送过去。如果和平台的加密一致就发送短信,不一致就不进行发送。下面着重讲解第二种:
2.xml数据的封装
//第一种方式生成xml
StringBuilder sb = new StringBuilder();
sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
sb.append("<smses>");
for (int i = 0; i < 50; i++) {
sb.append("<sms>");
sb.append("<address>");
sb.append(5554 + i);
sb.append("</address>");
sb.append("<body>");
sb.append("我是短信内容" + i);
sb.append("</body>");
sb.append("<time>");
sb.append(new Date().getTime());
sb.append("</time>");
sb.append("</sms>");
}
sb.append("</smses>");
String msg=sb.toString();
第二种生成请看这篇博客:http://www.cnblogs.com/ygj0930/p/6651643.html (转载)
3.上一步,我们生成了xml文件的数据,但是里面的数据我们还没有加密封装,加密方式类似于微信支付宝这样的支付(其实我就是觉的一个短信的加密做成这样也是够够的了鄙视一下心里)
//进行字典排序的的数据,再进行md5加密,借助了一些网上大神的代码,修改后的数据适应项目
private static String getSign(Map<String, String> params) throws UnsupportedEncodingException, NoSuchAlgorithmException {
Map<String, String> sortMap = new TreeMap<String, String>();
sortMap.putAll(params);
// 以k1=v1&k2=v2...方式拼接参数
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, String> s : sortMap.entrySet()) {
String k = s.getKey();
String v = s.getValue();
if (StringUtils.isBlank(v)) {// 过滤空值s
continue;
}
builder.append(k).append("=").append(v).append("&");
}
if (!sortMap.isEmpty()) {
builder.deleteCharAt(builder.length() - 1);
}
String newString= DigestUtils.md5Hex(builder.append(String.format("&key=%s",appKey)).toString());
//加密后的字符串
return newString.toUpperCase();
4.之后把加密后的字符串放入到xml中进行发送
发送我们可以用httpclient,之前做爬虫用这个请求别人的接口,但是这个封装要费一定的时间。这次我们用一个小型的http工具就可以,okhttp3这个,简介地址:https://blog.csdn.net/xx326664162/article/details/77714126(转载)
//发送的简单封装,一般不会出错,可以对异常进行更好的处理,当时给了一天时间就没有多做处理
String xmls=addXml(phone,ip,randomstr, type);
OkHttpClient client =new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.build();
RequestBody body = RequestBody.create(JSON, xmls);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
注意:还可以对返回的数据进行处理如果是xml的转成map这样就好获取
/**其他大神的代码寝室就是对节点的解析之后,里哦用递归加入map中
* Xml string转换成Map
* @param xmlStr
* @return
*/
public static Map<String,Object> xmlString2Map(String xmlStr){
Map<String,Object> map = new HashMap<String,Object>();
Document doc;
try {
doc = DocumentHelper.parseText(xmlStr);
Element el = doc.getRootElement();
map = recGetXmlElementValue(el,map);
} catch (DocumentException e) {
e.printStackTrace();
}
return map;
}
/**
* 循环解析xml
* @param ele
* @param map
* @return
*/
@SuppressWarnings({ "unchecked" })
private static Map<String, Object> recGetXmlElementValue(Element ele, Map<String, Object> map){
List<Element> eleList = ele.elements();
if (eleList.size() == 0) {
map.put(ele.getName(), ele.getTextTrim());
return map;
} else {
for (Iterator<Element> iter = eleList.iterator(); iter.hasNext();) {
Element innerEle = iter.next();
recGetXmlElementValue(innerEle, map);
}
return map;
}
}
6.这样我们基本就完成了一个复杂短信的封装