zoukankan      html  css  js  c++  java
  • 使用Java实现微信公众号推送模板消息(保证能用)

    背景:

      还是那个业务背景,面向微信公众号开发,指定针对用户发送消息,胖友们,我研究了一天了,代码粘过去,用不了你锤死我

    1、pom.xml文件中添加依赖

    <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.wso2.apache.httpcomponents</groupId>
                <artifactId>httpmime</artifactId>
                <version>4.3.1.wso2v1</version>
            </dependency>
            <dependency>
                <groupId>org.wso2.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.3.1.wso2v1</version>
            </dependency>
            <!-- json -->
            <dependency>
                <groupId>top.jfunc.json</groupId>
                <artifactId>json-fastjson</artifactId>
                <version>1.8.3</version>
            </dependency>

    DataEntity.java

    @Getter
    @Setter
    public class DataEntity {    
        //内容
        private String value;
        //字体颜色
        private String color;
        
        public DataEntity(String value ,String color){
            this.value = value;
            this.color = color;
        }

    实现类: 有“XXX”的地方需要修改,其他地方可以不用动

    WechatMsg.java

    @Component
    public class WechatMsg {
        
        public static void main(String[] args) {
            WechatMsg wm = new WechatMsg();
            wm.SendWeChatMsg(wm.getToken());
        }
        /**
         * 获取token
         * 
         * @return token
         */
        public String getToken() {
            // 授予形式
            String grant_type = "client_credential";
            //应用ID
            String appid = "XXXXXXXXXXXXXXXXXXX";
            //密钥
            String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
            // 接口地址拼接参数
            String getTokenApi = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grant_type + "&appid=" + appid
                    + "&secret=" + secret;
            String tokenJsonStr = doGetPost(getTokenApi, "GET", null);
            JSONObject tokenJson = JSONObject.parseObject(tokenJsonStr);
            String token = tokenJson.get("access_token").toString();
            System.out.println("获取到的TOKEN : " + token);
            return token;
        }
        /***
         * 发送消息
         * 
         * @param token
         */
        public void SendWeChatMsg(String token) {
            // 接口地址
            String sendMsgApi = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
            //openId
            String toUser = "XXXXXXXXXXXXXX";
            //消息模板ID
            String template_id = "XXXXXXXXXXXXXXXXXXXXXX";
            //整体参数map
            Map<String, Object> paramMap = new HashMap<String, Object>();
            //消息主题显示相关map
            Map<String, Object> dataMap = new HashMap<String, Object>();
            //根据自己的模板定义内容和颜色
            dataMap.put("first",new DataEntity("详细内容XXXXXXX","#173177"));
            dataMap.put("keyword1",new DataEntity("私有化部署XXX","#173177"));
            dataMap.put("keyword2",new DataEntity("2020-08-18XXX" ,"#173177"));
            dataMap.put("remark",new DataEntity("申请成功XXX","#173177"));
            paramMap.put("touser", toUser);
            paramMap.put("template_id", template_id);
            paramMap.put("data", dataMap);
            System.out.println(doGetPost(sendMsgApi,"POST",paramMap));
        }
        /**
         * 调用接口 post
         * @param apiPath
         */
        public String doGetPost(String apiPath,String type,Map<String,Object> paramMap){
            OutputStreamWriter out = null;
            InputStream is = null;
            String result = null;
            try{
                URL url = new URL(apiPath);// 创建连接
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestMethod(type) ; // 设置请求方式
                connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
                connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
                connection.connect();
                if(type.equals("POST")){
                    out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
                    out.append(JSON.toJSONString(paramMap));
                    out.flush();
                    out.close();
                }
                // 读取响应
                is = connection.getInputStream();
                int length = (int) connection.getContentLength();// 获取长度
                if (length != -1) {
                    byte[] data = new byte[length];
                    byte[] temp = new byte[512];
                    int readLen = 0;
                    int destPos = 0;
                    while ((readLen = is.read(temp)) > 0) {
                        System.arraycopy(temp, 0, data, destPos, readLen);
                        destPos += readLen;
                    }
                    result = new String(data, "UTF-8"); // utf-8编码
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return  result;
        }
    }

    效果图

     附微信接口文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

  • 相关阅读:
    谈谈final, finally, finalize的区别。
    session是存储在什么地方,以什么形式存储的
    如果有几千个session,怎么提高效率
    堆和栈的区别?
    进程和线程的区别?
    Delphi中启动项管理 已安装程序卸载简单组件
    在使用TStringlist谨慎使用For循环
    Delphi 中窗体全屏组件
    TEdit扩展:做成多按钮的Edit,可用作浏览器地址栏
    Delphi 7中处理TEdit鼠标进入 离开事件
  • 原文地址:https://www.cnblogs.com/shisanye/p/13639825.html
Copyright © 2011-2022 走看看