Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 569|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-7-17 07:54:45 | 显示全部楼层 |阅读模式

    首先,这里使用的是原始的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格式的字符串;

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 10:23 , Processed in 2.131106 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表