Java微信公众号发送消息-保姆级教程附源码

官方文档:

全局返回码文档 :

1. 概念说明:

    消息会话(这里用到模板消息) 群发消息:订阅号为每天1次,服务号为每月4次

2. 开发准备:

  1. 开发者在公众平台网站中创建服务号、获取接口权限后方可开始

3. 测试demo(更改配置信息即可使用)

3.1. 服务器配置

这里坑比较多,服务器配置不是随便填一个url就完事了,需要后端接口配合校验。

界面:

测试号界面:

3.1.1.配置填写说明

    EncodingAESKey: 由开发者手动填写或随机生成,将用作消息体加解密密钥 消息加解密方式 :明文模式、兼容模式和安全模式

3.1.2.校验服务器有效性:

校验请求说明:

3.1.3.URL后端接口代码和校验代码(servlet)

项目路径是/xjsrm,因此服务器url地址就是:

直接将http://localhost:8080/xjsrm/wx地址填到服务配置的url可以吗?答案是不可以!

3.1.4.配置内网穿透,完成本地调试

3.1.4.1. 内网穿透的必要性:

3.1.4.2. 用到的工具cpolar:

    也可以使用花生壳、natapp、ngrok等;但不建议使用natapp、ngrok,这两个工具都不能直接访问到服务资源,中间会多一层手动校验(提示用户是否要访问该网站),会造成不必要的麻烦。

3.1.4.3. cpolar配置内网穿透的教程

    参考大佬的博文 从 2.内网穿透开始看到3.测试公网访问 即可

3.1.4.4. 获取本地项目的公网路径

配置完cpolar后在在线隧道列表中找到本地项目的地址,我项目是localhost:8080,因此公网地址对应(最好用https协议) 、

因此完整的服务器Url就是:

浏览器访问该url,看后端是否接受到了请求,如果接收到说明接口没问题,此时将URL填到对应的配置栏中点击提交即可。

3.1.5. 可能存在的问题

此时查看sandboxinfo这个包。如果出现 errorcode=-1多半是内网穿透工具的问题。

出现其他错误代码可以去错误大全中根据信息排查

ngrok错误排查示例:

3.2 模板消息

模板消息的官方文档:

从官方给出的请求示例入手,看需要准备的接口和数据:

3.2.1. 搞定 template_id 即模板消息id:

新增模板消息(以测试号为例)

模板内容可设置参数(模板标题不可),供接口调用时使用,参数需以{ {开头,以.DATA}}结尾(具体传参看后续代码)

3.2.2. 搞定 touser 即openid

查看用户管理的官方文档;,通过官方接口获取

3.2.3. 从获取openid的请求中我们发现需要access_token:

获取access_token官方文档:

3.2.4. 发送模板消息的url参数

这个是发送消息后用户点击卡片跳转的地址(自定义)可以不填

3.2.5. topcolor

消息卡片的顶部颜色(自定义)

3.2.5. data

消息的内容(了解结构即可,后续代码中会体现)

3.3. 源码

拷贝完再理解

3.3.1 模板消息DTO

3.3.2. 模板消息内容DTO

import java.io.Serializable;

/**
* @Description 模板消息内容类
* @author isymi
* @version
* @date 2023年5月29日下午4:33:27
*
 */
public class WeChatTemplateMsg implements Serializable{

	/**
     * 消息实参
     */
    private String value;
    /**
     * 消息颜色
     */
    private String color;
 
 
    public WeChatTemplateMsg(String value) {
        this.value = value;
        this.color = "#173177";
    }
 
    public WeChatTemplateMsg(String value, String color) {
        this.value = value;
        this.color = color;
    }

	@Override
	public String toString() {
		return "WeChatTemplateMsg [value=" + value + ", color=" + color + "]";
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}


}

3.3.3. access_token缓存类:

3.3.4.http请求工具类:

3.3.5. 最终的Servlet(controller自行转换)(为方便观看所有逻辑都写在这里了,自行优化):

3.4.测试

浏览器访问

经验分享 程序员 微信小程序 职场和发展