package com.hehenian.biz.facade.notify; import java.security.MessageDigest; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import com.hehenian.biz.common.notify.INotifyService; import com.hehenian.biz.common.util.StringUtil; /* * * 用document 对象封装XML * * */ public class YouXunTongSmsSender implements ISMSSender { private static final Logger logger = Logger.getLogger(INotifyService.class); private static final String[] xmlElements = { "account", "password", "msgid", "phones", "content", "sign", "subcode", "sendtime" }; /* * ############################参数说明############################ userName = * "311101"; // 用户名 password = "311101"; // 密码 phone = "13692177359"; // * 要发送的手机号码 content = "hello my duanxi tes<%%%*&^>t1"; // 短信内容 sign = ""; // * 短信内容 msgid =""; //成功后会返回 subcode =""; sendtime =""; //定时发送用的 * url="http://3tong.net/http/sms/Submit"; //无限通使用地址 /* * ############################此部分参数需要修改##################### * * * /** 发送短信 短信内容不可以超过350个字 消息参数规格: <?xml version='1.0' encoding='UTF-8'?> * <message> <account>userName</account> * <password>MD5Encode(password)</password> <msgid></msgid> * <phones>phone</phones> <content>content</content> <sign>sign</sign> * <subcode></subcode> <sendtime></sendtime> </message> 发送短信方法使用document * 对象方法封装XML字符串 */ public long send(String url, String userName, String password, String phone, String content, String sign, String subcode, String sendtime, String msgid) { String[] phones = phone.split(","); long result = -1; for(String tele :phones){ Map<String, String> params = new LinkedHashMap<String, String>(); String message = docXml(userName, MD5Encode(password), msgid, tele, content, sign, subcode, sendtime); params.put("message", message); String resp = doPost(url, params); result= parserResponse(resp); if(-1 == result ){ logger.error("短信内容:"+ content +" 发送回复:"+resp); } } return result; } /** * 状态报告 参数格式: <?xml version='1.0' encoding='UTF-8'?> <message> * <account>userName</account> <password>MD5Encode(password)</password> * <msgid></msgid> <phone></phone> </message> */ private static void getReport(String userName, String password, String msgid, String phone, String url) { Map<String, String> params = new LinkedHashMap<String, String>(); String message = ""; params.put("message", message); String resp = doPost(url, params); logger.debug(resp); } /** * 查询余额 参数格式: <?xml version='1.0' encoding='UTF-8'?> <message> * <account>userName</account> <password>MD5Encode(password)</password> * </message> */ private static void getBalance(String userName, String password, String url) { Map<String, String> params = new LinkedHashMap<String, String>(); String message = ""; params.put("message", message); String resp = doPost(url, params); logger.debug(resp); } /** * * 获取上行 参数格式: <?xml version='1.0' encoding='UTF-8'?> <message> * <account>userName</account> <password>MD5Encode(password)</password> * </message> */ private static void getSms(String userName, String password, String url) { Map<String, String> params = new LinkedHashMap<String, String>(); String message = ""; params.put("message", message); String resp = doPost(url, params); logger.debug(resp); } /** * 解析返回的结果 0 发送成功 * * @param response * @return */ private static long parserResponse(String response) { try { Document doc = DocumentHelper.parseText(response); String msgidStr = doc.getRootElement().element("msgid").getText(); String resultCode = doc.getRootElement().element("result").getText().trim(); if ("0".equals(resultCode)) { long msgid = StringUtil.strToLong(msgidStr, -1); return msgid; } else { return -1; } } catch (DocumentException e) { logger.error(e); } return -1; } /** * 执行一个HTTP POST请求,返回请求响应的HTML * * @param url * 请求的URL地址 * @param params * 请求的查询参数,可以为null * @return 返回请求响应的HTML */ private static String doPost(String url, Map<String, String> params) { String response = null; HttpClient client = new HttpClient(); PostMethod postMethod = new PostMethod(url); postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8"); // 设置Post数据 if (!params.isEmpty()) { int i = 0; NameValuePair[] data = new NameValuePair[params.size()]; for (Entry<String, String> entry : params.entrySet()) { data[i] = new NameValuePair(entry.getKey(), entry.getValue()); i++; } postMethod.setRequestBody(data); } try { client.executeMethod(postMethod); if (postMethod.getStatusCode() == HttpStatus.SC_OK) { response = postMethod.getResponseBodyAsString(); } } catch (Exception e) { logger.error(e); } finally { postMethod.releaseConnection(); } return response; } /** * 使用document 对象封装XML * * @param userName * @param pwd * @param id * @param phone * @param contents * @param sign * @param subcode * @param sendtime * @return */ private static String docXml(String userName, String pwd, String msgid, String phone, String contents, String sign, String subcode, String sendtime) { Document doc = DocumentHelper.createDocument(); doc.setXMLEncoding("UTF-8"); Element message = doc.addElement("response"); Element account = message.addElement("account"); account.setText(userName); Element password = message.addElement("password"); password.setText(pwd); Element msgid1 = message.addElement("msgid"); msgid1.setText(null == msgid ? "" : msgid); Element phones = message.addElement("phones"); phones.setText(phone); Element content = message.addElement("content"); content.setText(contents); Element sign1 = message.addElement("sign"); sign1.setText(null == sign ? "" : sign); Element subcode1 = message.addElement("subcode"); subcode1.setText(null == subcode ? "" : subcode); Element sendtime1 = message.addElement("sendtime"); sendtime1.setText(null == sendtime ? "" : sendtime); return message.asXML(); } /** * 使用document 对象封装XML * * @param userName * @param pwd * @param id * @param phone * @param contents * @param sign * @param subcode * @param sendtime * @return */ private static String docXml(Map<String, String> sendMap) { Document doc = DocumentHelper.createDocument(); doc.setXMLEncoding("UTF-8"); Element message = doc.addElement("response"); for (String xmlElement : xmlElements) { String val = sendMap.get(xmlElement); if (null == val) { val = ""; } Element element = message.addElement(xmlElement); element.setText(val); } return message.asXML(); } // MD5加密函数 private static String MD5Encode(String sourceString) { String resultString = null; try { resultString = new String(sourceString); MessageDigest md = MessageDigest.getInstance("MD5"); resultString = byte2hexString(md.digest(resultString.getBytes())); } catch (Exception ex) { logger.error(ex); } return resultString; } private static final String byte2hexString(byte[] bytes) { StringBuffer bf = new StringBuffer(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { if ((bytes[i] & 0xff) < 0x10) { bf.append("0"); } bf.append(Long.toString(bytes[i] & 0xff, 16)); } return bf.toString(); } }