微信小程序模板消息(服務通知消息)原始post工具封裝(不使用jar包--坑比較多),解決47001(JSON格式)和中文亂碼問題


首先,這里使用的是原始的java封裝post請求,不適用jar包是因為第三方的jar包坑比較多(要么是中文亂碼問題----部分jar包需要改源碼  要么是JSON格式數據解析錯誤---字符串的json格式是對的,但是底層封裝發送的格式不對-我自己理解是maven上的jar包很多是國外整的,可對中文編碼這塊可能不怎么注重。


這里需要對字節流和字符流的寫入和寫出有一定認識

 

第一點:基礎認識

 

 

第二點:網上雖然這么說:項目之間通信一般使用PringWriter(字符流);

 

 

 第三點:但唯一的缺點是不能夠控制寫出的編碼格式(中文),所以采用BufferedWriter


 

接下來展示相關的代碼:

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請求。

 

 

 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格式的字符串;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM