微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

首先,这里使用的是原始的java封装post请求,不适用jar包是因为第三方的jar包坑比较多(要么是中文乱码问题----部分jar包需要改源码  要么是JSON格式数据解析错误---字符串的json格式是对的,但是底层封装发送的格式不对-我自己理解是maven上的jar包很多是国外整的,可对中文编码这块可能不怎么注重。


这里需要对字节流和字符流的写入和写出有一定认识

第一点:基础认识

微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

第二点:网上虽然这么说:项目之间通信一般使用PringWriter(字符流);

微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

 第三点:但唯一的缺点是不能够控制写出的编码格式(中文),所以采用BufferedWriter

微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题


接下来展示相关的代码:

1.post方法的工具类封装;param 为JSON格式的字符串:eg:param如下:

{"data":{"keyword3":{"value":"2.0片"},"keyword4":{"value":"韩大大"},"keyword1":{"value":"卡培他滨"},"keyword2":{"value":"2019-09-04 00:00:00.0"}},"emphasis_keyword":"keyword2.DATA","form_id":"e96476fe003e4c44b2e62a1fbb3ac292","template_id":"7cC2LSqbCdN13dBkVxR-9QRv-MHWEuD55zllEfI2La8","touser":"ojwg75IMUtrqkre_8Gz3XBq7xMVM"}

  

post方法工具类:

package com.xingshu.utils;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;

/**
 * @author Hanguangxue XINSHU 2019.09.06
 */
public class HttpClientUtil {
    /**
     * 发送post请求 json格式
     * @param url 需要发送数据的链接
     * @param param 请求数据的JSON格式
     * @return 服务响应后返回的结果
     */
    public static String sendPost(String url, String param) {
        BufferedWriter out = null;  //也可以使用PrintWriter 但是写出没有编码设置(字符流)
        BufferedReader in = null;   //同样为设置编码,获取传回的JSON格式或是文件
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept-Charset", "UTF-8");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);

            // 获取URLConnection对象对应的输出流
            out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),"UTF-8"));
            // 发送请求参数
            out.write(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }
}

2.微信小程序相关JSON格式代码的封装,我用的是模板消息的send数据格式:详情见官网 服务通知消息模板消息都可以使用该post请求。

微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

 3.实体类封装  主要属性(get,set自己生成)

public class TemplateMssData {
    private String touser;
    private Object data;
    private String form_id;
    private String template_id;
    private String page;
    private String emphasis_keyword;
}

4.请求获取 发送服务通知

public String sendTemplateMSS(String data){
        System.out.println(data);
        final String TemplateMSSURLPre = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=";
        String access_token = this.getAccessToken();
        JSONObject JSDJson = JSONObject.parseObject(access_token);
        if(null != JSDJson) {
            if(JSDJson.containsKey("access_token")) {
                String TemplateMSSURL = TemplateMSSURLPre + JSDJson.getString("access_token");
                String results = null;
                    //results = HttpClientUtil.doPost(TemplateMSSURL,JSON.toJSONString(data));
                    results = HttpClientUtil.sendPost(TemplateMSSURL,data);
                logger.info(results);
                System.out.println("消息返回:"+results);
                return results;
            }
        }
        return null;
    }

5.获取 access_token 方法

public String getAccessToken(){
        final String ACCESSTOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";
        String accessTokenInfo = null;

        Map<String, String> ParaMap = new HashMap<>();
        ParaMap.put("grant_type", Constants.GRANTTYPE);
        ParaMap.put("appid", Constants.WECHATAPPID);
        ParaMap.put("secret", Constants.WECHATSECRET);

        ResponseEntity<String> responseEntity = restTemplate.getForEntity(ACCESSTOKENURL, String.class, ParaMap);
        HttpStatus st = responseEntity.getStatusCode();
        if(st.is2xxSuccessful()) {
            accessTokenInfo = responseEntity.getBody();
        }else {
            logger.error("Get access_token fail, HttpStatus: " + st);
        }
        return accessTokenInfo;
    }

6.调用:其中mssData是 TemplateMssData 对象。转换后的格式就是JSON格式的字符串;

微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题