微信公众号开发用到的一些工具
来源:互联网 发布:国际象棋和围棋 知乎 编辑:程序博客网 时间:2024/06/05 17:14
/** * 类名: MyX509TrustManager </br> * 描述: 信任管理器 </br> * */public class MyX509TrustManager implements X509TrustManager { // 检查客户端证书 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 检查服务器端证书 public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 返回受信任的X509证书数组 public X509Certificate[] getAcceptedIssuers() { return null; }}
public final class SHA1 { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /** * Takes the raw bytes from the digest and formats them correct. * * @param bytes the raw bytes from the digest. * @return the formatted bytes. */ private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文转换成十六进制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } public static String encode(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } }}
/** * 发起https请求并获取结果 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static Map<String, Object> httpRequest(String requestUrl, String requestMethod, String outputStr) { Map<String, Object> map = new HashMap<String, Object>(); StringBuffer buffer = new StringBuffer(); try { // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = {new MyX509TrustManager()}; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); httpUrlConn.setSSLSocketFactory(ssf); httpUrlConn.setDoOutput(true); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); // 设置请求方式(GET/POST) httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); // 当有数据需要提交时 if (null != outputStr) { OutputStream outputStream = httpUrlConn.getOutputStream(); // 注意编码格式,防止中文乱码 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 将返回的输入流转换成字符串 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 释放资源 inputStream.close(); inputStream = null; httpUrlConn.disconnect(); map = (Map<String, Object>)JSONObject.parseObject(buffer.toString()); System.out.println("=========" + map.toString()); } catch (ConnectException ce) { logger.error("Weixin server connection timed out."); } catch (Exception e) { logger.error("https request error:{}", e); } return map; } /** * 上传图片时,封装media信息 */ public static Map<String, Object> uploadimg(String path, File file) throws Exception { URL urlObj = new URL(path); // 连接 HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); Map<String, Object> map = new HashMap<String, Object>(); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); // post方式不能使用缓存 // 设置请求头信息 con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); // 设置边界 String BOUNDARY = "----------" + System.currentTimeMillis(); con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); // 请求正文信息 // 第一部分: StringBuilder sb = new StringBuilder(); sb.append("--"); // 必须多两道线 sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"media\";filelength=\"" + file.length() + "\";filename=\"" + file.getName() + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); byte[] head = sb.toString().getBytes("utf-8"); // 获得输出流 OutputStream out = new DataOutputStream(con.getOutputStream()); // 输出表头 out.write(head); // 文件正文部分 // 把文件已流文件的方式 推入到url中 DataInputStream in = new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } in.close(); // 结尾部分 byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线 out.write(foot); out.flush(); out.close(); StringBuffer buffer = new StringBuffer(); BufferedReader reader = null; try { // 定义BufferedReader输入流来读取URL的响应 reader = new BufferedReader(new InputStreamReader(con.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { buffer.append(line); } map = JSONObject.parseObject(buffer.toString()); System.out.println("图片返回信息"+map); } catch (IOException e) { System.out.println("发送POST请求出现异常!" + e); e.printStackTrace(); } finally { if (reader != null) { reader.close(); } } return map; }
public class SignUtil { /** * 验证签名 * * @param token 微信服务器token,在env.properties文件中配置的和在开发者中心配置的必须一致 * @param signature 微信服务器传过来sha1加密的证书签名 * @param timestamp 时间戳 * @param nonce 随机数 * @return */ public static boolean checkSignature(String token,String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); // 将三个参数字符串拼接成一个字符串进行sha1加密 String tmpStr = SHA1.encode(arr[0] + arr[1] + arr[2]); // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; }}
public class MessageUtils { /** * xml转换为map * @param request * @return * @throws IOException */ @SuppressWarnings("unchecked") public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException { Map<String, String> map = new HashMap<String, String>(); SAXReader reader = new SAXReader(); InputStream ins = null; try { ins = request.getInputStream(); } catch (IOException e1) { e1.printStackTrace(); } Document doc = null; try { doc = reader.read(ins); Element root = doc.getRootElement(); List<Element> list = root.elements(); for (Element e : list) { map.put(e.getName(), e.getText()); } return map; } catch (DocumentException e1) { e1.printStackTrace(); }finally{ ins.close(); } return null; } /** * 文本消息对象转换成xml * * @param wxMessage 文本消息对象 * @return xml */ public static String textMessageToXml(WxMessage wxMessage){ XStream xstream = new XStream(); xstream.alias("xml", wxMessage.getClass()); return xstream.toXML(wxMessage); }}
public class MessageType { /** * 返回消息类型:文本 */ public static final String RESP_MESSAGE_TYPE_TEXT = "text"; /** * 返回消息类型:音乐 */ public static final String RESP_MESSAGE_TYPE_MUSIC = "music"; /** * 返回消息类型:图文 */ public static final String RESP_MESSAGE_TYPE_NEWS = "news"; /** * 请求消息类型:文本 */ public static final String REQ_MESSAGE_TYPE_TEXT = "text"; /** * 请求消息类型:图片 */ public static final String REQ_MESSAGE_TYPE_IMAGE = "image"; /** * 请求消息类型:链接 */ public static final String REQ_MESSAGE_TYPE_LINK = "link"; /** * 请求消息类型:地理位置 */ public static final String REQ_MESSAGE_TYPE_LOCATION = "location"; /** * 请求消息类型:音频 */ public static final String REQ_MESSAGE_TYPE_VOICE = "voice"; /** * 请求消息类型:推送 */ public static final String REQ_MESSAGE_TYPE_EVENT = "event"; /** * 事件类型:subscribe(订阅) */ public static final String EVENT_TYPE_SUBSCRIBE = "subscribe"; /** * 事件类型:unsubscribe(取消订阅) */ public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; /** * 事件类型:CLICK(自定义菜单点击事件) */ public static final String EVENT_TYPE_CLICK = "CLICK";}
阅读全文
0 0
- 微信公众号开发用到的一些工具
- 微信公众号开发需要用到的一些工具函数
- 开发微信公众号网页用到的一些工具记录
- 微信公众号开发的一些总结
- 开发微信公众号遇到的一些问题
- 微信公众号开发工具类
- 微信公众号开发工具汇总
- 微信公众号的一些事
- 微信公众号的开发
- 微信公众号的开发
- 微信公众号的开发
- 微信公众号的开发流程
- 微信公众号的开发
- 微信公众号本地开发调试工具
- [QT开发]微信公众号修改菜单工具
- 微信公众平台开发 获得公众号的access_token
- 微信公众号第三方平台开发的一些教训总结
- Java 进行微信公众号开发遇到的一些坑
- ASP.NET MVC
- ASP.NET MVC
- golang使用yaml格式解析构建配置文件
- 说说依赖包的管理和维护
- 六周一次课(11月20日) 12.1 安装客户端 12.2 数据库连接 12.3 mysql事务 12.4 mysql操作数据
- 微信公众号开发用到的一些工具
- leetcode-169. Majority Element
- 1042 电子老鼠闯迷宫
- ASP.NET MVC
- Less的!important关键字
- Spring简介
- ASP.NET MVC
- Java集合框架07--HashMap和源码分析
- 使用JDK9无法打开eclipse解决方案