和几家短信平台接触过,都进行了接入测试。总体来说短信发送又快,覆盖率又全的,价格相对贵些。简易选两家分开使用,短信验证码的用一家贵的快的,普通的推广群发短信用一个便宜的。 下面显示下测试代码 1 public class HttpSMSSender { 2 3 protected final Logger logger = LoggerFactory.getLogger(getClass()); 4 5 // 短信接口地址 6 private String postUrl = "http://ip:port/webservice.asmx"; 7 @Autowired 8 private AppVars vars; 9 10 11 private String sname = "username"; // 提交账户 12 private String spwd = "password"; // 提交账户的密码 13 14 15 16 private String spnumber = ""; // 企业代码(扩展号,可空着) 17 private String key = "【某某公司】"; 18 19 @Deprecated 20 String sdst; // 接收号码,每次只能提交1个号码 21 @Deprecated 22 String smsg; // 信息内容,通常为70汉字以内,具体由平台内部决定 23 24 /** 25 * @param phoneNum 26 * 手机号码 27 * @param msg 28 * 短信内容 29 * @return 成功返回0 30 */ 31 public static void main(String[] args) { 32 HttpSMSSender sms = new HttpSMSSender(); 33 // String msg = "您正通过" + vars2.websiteNameCn 34 // + "提现至银行卡(尾号0908),金额90元,请确认无误后方可输入短信验证码:289002。如非本人操作,请拨打客服电话" 35 // + vars2.servicePhone; 36 String msg = "您好!用户哈哈,您好!您" + "平台的手机绑定验证码为:989887,请确认。"; 37 sms.send("186****5286", msg); 38 } 39 40 public int send(String phoneNum, String msg) { 41 StringBuilder postData = new StringBuilder(); 42 43 try { 44 45 // sb 46 String pwdd = MD5.EncoderByMd5(sname + spwd); 47 postData.append("sn").append("=").append(sname).append("&"); 48 postData.append("pwd").append("=").append(pwdd).append("&"); 49 postData.append("Ext").append("=").append("").append("&"); 50 postData.append("stime").append("=").append("").append("&"); 51 postData.append("mobile").append("=").append(phoneNum).append("&"); 52 postData.append("Rrid").append("=").append("").append("&"); 53 postData.append("Content").append("=") 54 .append(java.net.URLEncoder.encode(msg + key, "GBK")); 55 return send(postData.toString()); 56 } catch (Exception x) { 57 logger.error("发送短信时发生异常", x); 58 return -1; 59 } 60 } 61 62 private int send(String postData) throws UnsupportedEncodingException, 63 IOException, ParserConfigurationException, SAXException { 64 logger.info("请求短信接口内容[{}]", postData); 65 HttpURLConnection conn = null; 66 try { 67 final URL url = new URL(postUrl + "?" + postData); 68 conn = (HttpURLConnection) url.openConnection(); 69 conn.setRequestMethod("GET"); 70 conn.connect(); 71 72 73 // 获取响应状态 74 if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { 75 logger.error("连接短信服务器失败"); 76 return -1; 77 } 78 79 InputStream is = conn.getInputStream(); 80 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 81 int i = -1; 82 while ((i = is.read()) != -1) { 83 baos.write(i); 84 } 85 logger.info("请求短信接口返回内容[{}]", baos.toString()); 86 int resultCode = -1; 87 88 try { 89 resultCode = 0; 90 91 } catch (Exception e) { 92 resultCode = -1; 93 // TODO: handle exception 94 } 95 96 return resultCode; 97 } finally { 98 if (conn != null) { 99 conn.disconnect(); 100 } 101 } 102 } 103 104 private int parseResultCode(InputStream is) 105 throws ParserConfigurationException, SAXException, IOException { 106 final Map<String, String> map = new HashMap<String, String>(); 107 SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); 108 saxParser.parse(is, new DefaultHandler() { 109 110 private String tag = ""; 111 112 public void endElement(String uri, String localName, String qName) 113 throws SAXException { 114 tag = ""; 115 } 116 117 public void startElement(String uri, String localName, 118 String qName, Attributes attributes) throws SAXException { 119 tag = qName; 120 } 121 122 public void characters(char[] ch, int start, int length) 123 throws SAXException { 124 if (!tag.isEmpty()) { 125 map.put(tag, new String(ch, start, length)); 126 } 127 } 128 129 }); 130 logger.info("短信接口返回码[{}]描述[{}]", map.get("State"), map.get("MsgState")); 131 return Integer.valueOf(map.get("State")); 132 } 133 134 public String getPostUrl() { 135 return postUrl; 136 } 137 138 public String getSname() { 139 return sname; 140 } 141 142 public String getSpwd() { 143 return spwd; 144 } 145 146 public void setPostUrl(String postUrl) { 147 this.postUrl = postUrl; 148 } 149 150 public void setSname(String sname) { 151 this.sname = sname; 152 } 153 154 public void setSpwd(String spwd) { 155 this.spwd = spwd; 156 } 157 }