第一步,创建httpPost方法
public static String httpPost(String urlStr,String params){ URL connect; StringBuffer data = new StringBuffer(); try { connect = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection)connect.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false);//post不能使用缓存 connection.setInstanceFollowRedirects(true); connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); OutputStreamWriter paramout = new OutputStreamWriter( connection.getOutputStream(),"UTF-8"); /*String paramsStr = ""; //拼接Post 请求的参数 //System.out.println("拼接字符串为字符串params:"+params); for(String param : params.keySet()){ paramsStr += "&" + param + "=" + params.get(param); } if(!paramsStr.isEmpty()){ paramsStr = paramsStr.substring(1); }*/ System.out.println("拼接字符串为字符串paramsStr:"+params); paramout.write(params); paramout.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream(), "UTF-8")); String line; while ((line = reader.readLine()) != null) { data.append(line); } paramout.close(); reader.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return data.toString(); }
注意事项:中间参数方式可以按照场景切换。
第二步:生成sign签名
1、有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
2、在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值.
注意事项:
1、参数名ASCII码从小到大排序(字典序);
2、如果参数的值为空不参与签名;
3、参数名区分大小写;
4、key为固定字符值udhjskenc。
public static String createSign(String characterEncoding, SortedMap<Object,Object> parameters, String key){ StringBuffer sb = new StringBuffer(); StringBuffer sbkey = new StringBuffer(); Set es = parameters.entrySet(); //所有参与传参的参数按照accsii排序(升序) Iterator it = es.iterator(); while(it.hasNext()) { Map.Entry entry = (Map.Entry)it.next(); String k = (String)entry.getKey(); Object v = entry.getValue(); //空值不传递,不参与签名组串 if(null != v && !"".equals(v)) { sb.append(k + "=" + v + "&"); sbkey.append(k + "=" + v + "&"); } } //System.out.println("字符串:"+sb.toString()); sbkey=sbkey.append("appSecret="+key); //MD5加密,结果转换为大写字符 String sign = MD5Util.MD5Encode(sbkey.toString(), characterEncoding).toUpperCase(); System.out.println("MD5加密值sign:"+sign); System.out.println("拼接字符串为字符串:"+sb.toString()+"sign="+sign); return sb.toString()+"sign="+sign; }
第三步:调试接口
public static void main(String[] args) throws Exception { //按照ASCII码从小到大排序获取sign SortedMap<Object,Object> map=new TreeMap<Object,Object>(); String appid ="OYTBSJJtPpGyYl7EDFS3"; String dt =String.valueOf(System.currentTimeMillis()); String iccid ="124587656541232312"; String secret ="DV7cd54dDSEWD54fserdswe"; String appSecret ="udhjskenc"; map.put("iccid", iccid); map.put("appid", appid); map.put("dt", dt); map.put("secret", secret); String sign = createSign("UTF-8",map,appSecret); System.out.println("最后结果:"+sign); String url="你自己应该访问的链接!"; System.out.println(httpPost(url2,sign)); }
注意事项:
我这里调用httpPost直接传输的拼接好的参数sign,需要根据自己的场景进行修改!