微信公众号开发用到的一些工具

来源:互联网 发布:国际象棋和围棋 知乎 编辑:程序博客网 时间: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";}



原创粉丝点击