通过java实现微信公众号发送微信消息

2023-10-27

(感谢好多老哥提供的文档,哈哈,这里我就只是代码贴出来,方便以后copy)

 

1获取token

String token = Wechat.getAccess_token(appId, appSecret).getString("access_token");
    public static JSONObject getAccess_token(String appId, String appSecret) {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
        String accessToken = null;
        JSONObject jsonObj = null;
        try {
            URL urlGet = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
            http.setRequestMethod("GET"); // 必须是get方式请求
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            http.connect();
            InputStream is = http.getInputStream();
            int size = is.available();
            byte[] jsonBytes = new byte[size];
            is.read(jsonBytes);
            accessToken = new String(jsonBytes, "UTF-8");
            System.err.println(accessToken);
            jsonObj = JSONObject.parseObject(accessToken);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObj;
    }

 

2调用service层发消息模板

TemplateMessageService.sendTemp(appId, token, appSecret, entity.realAmount, tenantEntity.name, memberEntity.wechatOpenId);

3进入该模板后会调用httputil类,发送消息

package com.mall.common.services;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mall.common.utils.HttpSend;
import com.mall.common.utils.HttpUtil;

import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TemplateMessageService {

    public static void sendTemp(String appid, String accessToken, String appSecret, Double realAmount, String shopName, String openId) {
        String url = "https://api.weixin.qq.com/cgi-bin/token";
        String param = "grant_type=client_credential" + "&appid=" + appid + "&secret=" + appSecret;
        String accTemp = HttpSend.sendGet(url, param);
        JSONObject jsonObject = JSONObject.parseObject(accTemp);
        System.out.println("1--->" + jsonObject);
        accessToken = jsonObject.getString("access_token"); // 获取到了access_token,调用接口都要用到的,有时效
        // 封装要发送的json
        Map<String, Object> map = new HashMap();
        map.put("touser", openId);//你要发送给某个用户的openid 前提是已关注该公众号,该openid是对应该公众号的,不是普通的openid
        map.put("template_id", "VkxwzizOa2YS_M2RQbVQHPHzHTbabAqLvqU5FNFqQVs");//模板消息id
        //map.put("url","https://www.vipkes.cn");//用户点击模板消息,要跳转的地址
        // 封装miniprogram 跳转小程序用,不跳不要填
        Map<String, String> mapA = new HashMap<>();
        mapA.put("appid", ""); //小程序appid
        mapA.put("pagepath", ""); //小程序页面pagepath
        map.put("miniprogram", mapA);

        // 以下就是根据模板消息的格式封装好,我模板的是:问题反馈结果通知  可以和我一样试试
        // 封装first
        Map firstMap = new HashMap();
        firstMap.put("value", "新的消费通知!"); //内容
        firstMap.put("color", "#173177"); //字体颜色

        // 封装keyword1 提交的问题
        Map keyword1Map = new HashMap();
        keyword1Map.put("value", shopName);
        keyword1Map.put("color", "#fff");

        // 封装keyword2此处也可以是商品名
        Map keyword2Map = new HashMap();
        keyword2Map.put("value", "-");
        keyword2Map.put("color", "#fff");

        // 封装keyword2此处可以是商品价格
        Map keyword3Map = new HashMap();
        keyword3Map.put("value", realAmount + "元");
        keyword3Map.put("color", "#fff");

        // 封装keyword4
        // 封装remark
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Map keyword4Map = new HashMap();
        keyword4Map.put("value", simpleDateFormat.format(date));
        keyword4Map.put("color", "#fff");


        Map remarkMap = new HashMap();
        remarkMap.put("value", "尊敬的用户,您于" + simpleDateFormat.format(date) + "在" + shopName + "消费了" + realAmount + "元");
        remarkMap.put("color", "#fff");

        // 封装data
        Map dataMap = new HashMap();
        dataMap.put("first", firstMap);
        dataMap.put("keyword1", keyword1Map);
        dataMap.put("keyword2", keyword2Map);
        dataMap.put("keyword3", keyword3Map);
        dataMap.put("keyword4", keyword4Map);
        dataMap.put("remark", remarkMap);

        map.put("data", dataMap);
        String r = HttpUtil.getJsonData(JSONObject.parseObject(JSON.toJSONString(map)), "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken); //发送模板消息,这里有个工具类,我给你哟
        System.out.println("-->" + r);
    }


    public static void sendTempPoint(String appid, String accessToken, String appSecret, Integer Id, String name, String mobile, Double amount, String wechatOpenId) {
        String url = "https://api.weixin.qq.com/cgi-bin/token";
        String param = "grant_type=client_credential" + "&appid=" + appid + "&secret=" + appSecret;
        String accTemp = HttpSend.sendGet(url, param);
        JSONObject jsonObject = JSONObject.parseObject(accTemp);
        System.out.println("1--->" + jsonObject);
        accessToken = jsonObject.getString("access_token"); // 获取到了access_token,调用接口都要用到的,有时效
        // 封装要发送的json
        Map<String, Object> map = new HashMap();
        map.put("touser", wechatOpenId);//你要发送给某个用户的openid 前提是已关注该公众号,该openid是对应该公众号的,不是普通的openid
        map.put("template_id", "672dPs0Jwl9zLvhVrncI0nyEHxX3Mx-fPNLBcIEb05A");//模板消息id
        //map.put("url","https://www.vipkes.cn");//用户点击模板消息,要跳转的地址
        // 封装miniprogram 跳转小程序用,不跳不要填
        Map<String, String> mapA = new HashMap<>();
        mapA.put("appid", ""); //小程序appid
        mapA.put("pagepath", ""); //小程序页面pagepath
        map.put("miniprogram", mapA);

        // 以下就是根据模板消息的格式封装好,我模板的是:问题反馈结果通知  可以和我一样试试
        // 封装first
        Map firstMap = new HashMap();
        firstMap.put("value", "会员积分消费提醒!"); //内容
        firstMap.put("color", "#173177"); //字体颜色
        String newname;
        try {
            newname = (java.net.URLDecoder.decode(name, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            newname = name;
        }

        // 封装keyword1 提交的问题
        Map XM = new HashMap();
        XM.put("value", newname);
        XM.put("color", "#fff");

        // 封装keyword2此处也可以是商品名
        Map KH = new HashMap();
        KH.put("value", Id);
        KH.put("color", "#fff");
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 封装keyword3此处可以是商品价格
        Map CONTENTS = new HashMap();
        CONTENTS.put("value", "尊敬的用户,您的账户于" + simpleDateFormat.format(date) + "增加了" + amount + "积分");
        CONTENTS.put("color", "#fff");


        Map remarkMap = new HashMap();
        remarkMap.put("value", "消息惠顾");
        remarkMap.put("color", "#fff");

        // 封装data
        Map dataMap = new HashMap();
        dataMap.put("first", firstMap);
        dataMap.put("XM", XM);
        dataMap.put("KH", KH);
        dataMap.put("CONTENTS", CONTENTS);
        dataMap.put("remark", remarkMap);

        map.put("data", dataMap);
        String r = HttpUtil.getJsonData(JSONObject.parseObject(JSON.toJSONString(map)), "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken); //发送模板消息,这里有个工具类,我给你哟
        System.out.println("-->" + r);
    }


}

4发送消息

package com.mall.common.utils;


import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtil {

    public static String getJsonData(JSONObject jsonParam, String urls) {
        StringBuffer sb = new StringBuffer();
        try {
            // 创建url资源
            URL url = new URL(urls);
            // 建立http连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置允许输出
            conn.setDoOutput(true);
            // 设置允许输入
            conn.setDoInput(true);
            // 设置不用缓存
            conn.setUseCaches(false);
            // 设置传递方式
            conn.setRequestMethod("POST");
            // 设置维持长连接
            conn.setRequestProperty("Connection", "Keep-Alive");
            // 设置文件字符集:
            conn.setRequestProperty("Charset", "UTF-8");
            // 转换为字节数组
            byte[] data = (jsonParam.toString()).getBytes();
            // 设置文件长度
            conn.setRequestProperty("Content-Length", String.valueOf(data.length));
            // 设置文件类型:
            conn.setRequestProperty("contentType", "application/json");
            // 开始连接请求
            conn.connect();
            //OutputStream out = new DataOutputStream(conn.getOutputStream()) ;
            //防止消息乱码
            OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
            // 写入请求的字符串
            out.write(jsonParam.toString());
            out.flush();
            out.close();

            System.out.println(conn.getResponseCode());

            // 请求返回的状态
            if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {
                System.out.println("连接成功");
                // 请求返回的数据
                InputStream in1 = conn.getInputStream();
                try {
                    String readLine = new String();

                    BufferedReader responseReader = new BufferedReader(new InputStreamReader(in1, "UTF-8"));
                    while ((readLine = responseReader.readLine()) != null) {
                        sb.append(readLine).append("\n");
                    }
                    responseReader.close();
                    System.out.println(sb.toString());

                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } else {
                System.out.println("error++");

            }

        } catch (Exception e) {

        }

        return sb.toString();

    }

    /**
     * @auther: cxl
     * @Description 发送post请求  参数String
     * @date: 2019/4/28 19:38
     */
    public static String post(String jsonParam, String urls) {
        StringBuffer sb = new StringBuffer();
        try {
            // 创建url资源
            URL url = new URL(urls);
            // 建立http连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置允许输出
            conn.setDoOutput(true);
            // 设置允许输入
            conn.setDoInput(true);
            // 设置不用缓存
            conn.setUseCaches(false);
            // 设置传递方式
            conn.setRequestMethod("POST");
            // 设置维持长连接
            conn.setRequestProperty("Connection", "Keep-Alive");
            // 设置文件字符集:
            conn.setRequestProperty("Charset", "UTF-8");
            // 转换为字节数组
            //byte[] data = (jsonParam.toString()).getBytes();
            // 设置文件长度
            // conn.setRequestProperty("Content-Length", String.valueOf(data.length));
            // 设置文件类型:
            conn.setRequestProperty("contentType", "application/text");
            // 开始连接请求
            conn.connect();
            //防止消息乱码
            OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
            // 写入请求的字符串
            out.write(jsonParam.toString());
            out.flush();
            out.close();
            System.out.println(conn.getResponseCode());
            // 请求返回的状态
            if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {
                System.out.println("连接成功");
                // 请求返回的数据
                InputStream in1 = conn.getInputStream();
                try {
                    String readLine = new String();
                    BufferedReader responseReader = new BufferedReader(new InputStreamReader(in1, "UTF-8"));
                    while ((readLine = responseReader.readLine()) != null) {
                        sb.append(readLine).append("\n");
                    }
                    responseReader.close();
                    System.out.println(sb.toString());
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } else {
                System.out.println("error++");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

}

5以下问题是之后出的问题

此处如果不写utf-8本地postman测试不一定会乱码 ,上传线上有几率乱码,我遇到了,被骂死,哈哈,其他的真没什么问题,openid是他们提供的,我不太清楚,然后千万别乱给微信公众号,他们给错公众号害得我一直显示未关注公众号,擦,说了他们不信

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过java实现微信公众号发送微信消息 的相关文章

随机推荐

  • 大文件如何做断点续传

    一 断点续传 断点续传指的是在下载或上传时 将下载或上传任务人为的划分为几个部分 每一个部分采用一个线程进行上传或下载 如果碰到网络故障 可以从已经上传或下载的部分开始继续上传下载未完成的部分 而没有必要从头开始上传下载 用户可以节省时间
  • C语言字符串的替换

    C语言字符串的替换 我的思路 遍历字符串 判断是否与修改的字符一至 include
  • vue3 报错解决:无法找到模块“xxx.vue”的声明文件 xxx隐式拥有 “any“ 类型

    报错原因 typescript 只能理解 ts 文件 无法理解 vue文件 解决方法 在项目根目录或 src 文件夹下创建一个后缀为 XXX d ts 的文件 并写入以下内容 declare module vue import Compon
  • pdsh 2.29 安装

    下载 wget https storage googleapis com google code archive downloads v2 code google com pdsh pdsh 2 29 tar bz2 解包 tar jxvf
  • dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序

    dma buf 由浅入深 一 最简单的 dma buf 驱动程序 dma buf 由浅入深 二 kmap vmap dma buf 由浅入深 三 map attachment dma buf 由浅入深 四 mmap dma buf 由浅入深
  • Windows 64位 Python以及PyCharm社区版的下载安装(步骤清晰版)

    新买的笔记本啥都没有 还得重装 Python 下载 先去官网下载 https www python org 点击下载 进入页面后下滑 找到你想要的版本 点击右边的Download 我安装的版本比较老3 7 2的 推荐也不要选最新的 因为包什
  • Instrument API介绍

    1 Instrumentation介绍 JVMTI JVM Tool Interface 是 Java 虚拟机所提供的 native 编程接口 是 JVMPI Java Virtual Machine Profiler Interface
  • Redis使用教程

    1 Redis 基础 Redis是用C语言开发的一个开源的高性能键值对 Key value 数据库 他通过提供多种键值数据类型来适应不同场景的存储需求 Redis支持的键值数据类型如下 字符串类型 String zhanshen 哈希 ha
  • smith chart

    我说可能比较无力 直接看以下的链接 https www maximintegrated com en design technical documents tutorials 7 742 html http en wikipedia org
  • Java HashSet

    Set 集 集合中的对象不按特定方式排序 并且没有重复对象 List 列表 集合中的对象按索引位置排序 可以有重复对象 允许按照对象在集合中的索引位置检索对象 Map 映射 集合中的没一个元素包含键对象和值对象 不允许有重复的键对象 Jav
  • VSCode打不开或者闪退解决方法

    VSCode打不开或者闪退解决方法 VSCode打不开或者闪退解决方法 一 兼容性测试环境下运行 二 非管理员身份下运行 VSCode打不开或者闪退解决方法 vscode这款开发工具近期出现了闪退 打不开的情况 如下图所示出现了一个框随后就
  • 如何用Python绘制多种风玫瑰图

    前言 风玫瑰是由气象学家用于给出如何风速和风向在特定位置通常分布的简明视图的图形工具 它也可以用来描述空气质量污染源 风玫瑰工具使用Matplotlib作为后端 安装方式直接使用pip install windrose 导入模块 Pytho
  • DNS解析错误分析

    1 如何去查询DNS解析 解析命令 ping host dig 图 1 解析命令 2 dig命名查询的内容解析 图 2 dig查询内容 其中查询状态分为 NOERROR 代表没有错误 NXDOMAIN 否定回答 不存在此记录 REFUSED
  • 光电二极管(Photo-Diode)工作原理 与输出电压计算

    光电二极管 Photo Diode 是由一个PN结组成的半导体器件 具有单方向导电特性 光电二极管是在反向电压作用之下工作的 在一般照度的光线照射下 所产生的电流叫光电流 如果在外电路上接上负载 负载上就获得了电信号 而且这个电信号随着光的
  • lrzsz hisi 移植

    configure prefix INSTALL make CC aarch64 mix210 linux gcc
  • C++:vector

    目录 一 关于vector 二 vector的相关函数 三 相关函数的使用 构造函数 size 编辑 push back 迭代器iterator reserve resize find insert erase sort 一 关于vecto
  • 亚马逊运营:A9排序算法与A10排序算法对比

    文章目录 1 A9算法 2 A10算法 4 技巧 5 参考 1 A9算法 当我们在亚马逊电商平台上搜索一个query 对应返回多个商品 商品排序越靠前 曝光机会越多 越能够被用户点击进而提高转化 满足搜索query的商品特别多 那么亚马逊搜
  • Android Studio 3.0 清除项目用不到的资源

    自己也是一直找 一直找 真正要清除无用资源需要通过Android studio的 Remove Unused Resources选项功能来清除无用资源 操作步骤 选中工程 右键选中Refactor 从Refactor中选中Remove Un
  • Econometrics/Stata再学习(一)

    Tips 1 For large data set memory 2 price index 长时间数据要注意平价 3 在做调查之前 一定要先思考想要什么样的图 是否又方差差异 大体趋势的形式 再去设计问卷问题 调查策略 从相关性到因果关系
  • 通过java实现微信公众号发送微信消息

    感谢好多老哥提供的文档 哈哈 这里我就只是代码贴出来 方便以后copy 1获取token String token Wechat getAccess token appId appSecret getString access token