微信公众号配置 Token 认证以及消息推送功能(二)

简介: 微信公众号配置 Token 认证以及消息推送功能(二)

公众号推送模板消息

模板消息功能插件

开通成功以后会在功能栏下出现模板消息,右侧是我们从模板库引入的一个模板,稍后推送会用到

推送模版消息接口介绍

官方文档:模版消息接口

按照官方文档操作步骤如下:

POST 请求 data 数据需要传递的参数介绍:

注:url、miniprogram 都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可;当用户的微信客户端版本不支持跳小程序时,将会跳转至 url

获取 Token 接口凭证

获取 token 接口凭证,获取到的 token 有效时间为 2 小时,在我们程序正常运行的时候,不可能每次都重启,我们可以使用定时器去定时更新我们 token 接口凭证

token 接口凭证类源码如下:

/**
 * 公众号推送消息所用的实体类
 * @author vnjohn
 * @since 2023/2/19
 */
@Data
public class AccessToken {
    /**
     * 公众号通知类型:1服务号 2订阅号
     */
    private Integer noticeType;
    private Integer schoolId;
    private String accessToken;
    private int expiresIn;
}
/**
 * @author vnjohn
 * @since 2023/2/19
 */
public class TokenUtil {
    public static AccessToken accessToken = null;
    private final static Logger logger = LoggerFactory.getLogger(TokenUtil.class);
    /**
     * 获取接口访问凭证
     * 刷新 access_token 110 分钟刷新一次,服务器启动的时候刷新一次(access_token 有效期是120分钟,我设置的是每 110 分钟刷新一次)
     *
     * @return 认证信息
     */
    @Scheduled(initialDelay = 1000, fixedDelay = 60 * 1000 * 110)
    private static AccessToken getAccessToken() {
        String requestUrl = WxConstant.TOKEN_URL.replace("APPID", WxConstant.GZH_APP_ID)
                                                .replace("SECRET", WxConstant.GZH_SECRET);
        // 发起GET请求获取凭证
        JSONObject jsonObject = JSONObject.parseObject(HttpUtil.sendPost(requestUrl, "GET", null));
        if (null != jsonObject) {
            try {
                TokenUtil.accessToken = new AccessToken();
                TokenUtil.accessToken.setAccessToken(jsonObject.getString("access_token"));
                TokenUtil.accessToken.setExpiresIn(jsonObject.getIntValue("expires_in"));
                logger.info("AccessToken>>>>>>>>>>>>>" + jsonObject.toString());
            } catch (Exception e) {
                TokenUtil.accessToken = null;
                // 获取token失败
                logger.error(e.getMessage());
            }
        }
        return TokenUtil.accessToken;
    }
}

模版消息 Send 工具类

/**
 * @author vnjohn
 * @since 2023/2/19
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TemplateData {
    /**
     * 只能是 value 属性不能是 name 属性
     */
    private String value;
    private String color;
}
/**
 * @author vnjohn
 * @since 2023/2/19
 */
public class SendTemplateMsgUtil {
    private final static Logger logger = LoggerFactory.getLogger(SendTemplateMsgUtil.class);
    private final static String TO_URL = "http://weixin.qq.com/download";
    /**
     * 点击消息跳转相关参数map
     *
     * @return
     */
    public static Map<String, String> getMiniProgramMap() {
        //点击消息跳转相关参数map
        Map<String, String> miniProgramMap = new HashMap<String, String>();
        miniProgramMap.put("appid", WxConstant.APPLET_APP_ID);
        miniProgramMap.put("path", "pages/me/me");
        return miniProgramMap;
    }
    /**
     * 定时推送 打卡消息通知
     *
     * @param openId
     */
    public static void SendWeChatPunchClockMsg(String openId, String studentName, String category, String content) {
        logger.info(TokenUtil.accessToken.toString());
        AccessToken accessToken = TokenUtil.accessToken;
        // 接口地址
        String sendMsgApi = WxConstant.MSG_API.replace("ACCESSTOKEN", accessToken.getAccessToken());
        // 消息模板ID
        String template_id = WxConstant.PUNCH_TEMPLATE_ID;
        // 整体参数map
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("touser", openId);
        paramMap.put("template_id", template_id);
        paramMap.put("url", TO_URL);
        paramMap.put("miniprogram", getMiniProgramMap());
        paramMap.put("data", getDataMap(studentName, category, content, 1));
        logger.info(HttpUtil.sendPost(sendMsgApi, "POST", paramMap));
    }
    /**
     * 消息主题显示相关map
     *
     * @param msgType 不同的值走不同的推送
     * @return
     */
    public static Map<String, Object> getDataMap(String param1, String param2,
                                                 String param3, Integer msgType) {
        Map<String, Object> dataMap = new HashMap<>();
        if (msgType.equals(1)) {//打卡通知
            dataMap.put("first", new TemplateData("亲爱的" + param1 + "家长," + param1 + "今天的作业如下:", "#173177"));
            dataMap.put("name", new TemplateData(param1, "#173177"));
            dataMap.put("subject", new TemplateData(param2, "#173177"));
            dataMap.put("content", new TemplateData(param3, "#173177"));
        } else if (msgType.equals(2)) {//收款通知
            dataMap.put("first", new TemplateData(param1 + "家长你好,你的孩子需要收取费用:", "#173177"));
            dataMap.put("keyword1", new TemplateData(param1, "#173177"));//param1 为学生姓名
            dataMap.put("keyword2", new TemplateData(param2, "#173177"));//缴费类型
            dataMap.put("keyword3", new TemplateData(param3, "#173177"));//缴费金额
            dataMap.put("remark", new TemplateData("为有助于学校各项工作的顺利开展,请您务必在缴费截止日期前缴费", "#173177"));
        } else if (msgType.equals(3)) {//消息通知
            dataMap.put("first", new TemplateData("您好,为方便对学生进行管理,特通知如下:", "#173177"));
            dataMap.put("keyword1", new TemplateData(param1, "#173177"));//keyword1  param1 为学校
            dataMap.put("keyword2", new TemplateData(param2, "#173177"));//keyword2  param2 为通知人
            dataMap.put("keyword3", new TemplateData(DateUtil.dateToString(new Date()), "#173177"));//keyword3   为通知时间
            dataMap.put("keyword4", new TemplateData(param3, "#173177"));//keyword4  param3  为通知内容
            dataMap.put("remark", new TemplateData("为有助于学校各项工作的顺利开展", "#173177"));
        }
        return dataMap;
    }
}

推送模板消息接口测试

传入刚刚网页授权所拿到的 openId、模板 id 进行测试,在获取 Token 接口凭证时报错:invalid IP

因为该 IP 未设置白名单,进入公众号后台设置 IP 白名单

重新启动以后,已拿到 token 接口凭证,之后我们可以通过 postman 进行发送模板消息请求

@GetMapping("/wx/sendMsg")
public void sendMsg(@RequestParam String openId,@RequestParam String studentName,@RequestParam String category,@RequestParam String content){
    SendMsgUtil.SendWeChatPunchClockMsg(openId,studentName,category,content);
}

Post man 测试推送消息接口:

手机上正常接收到消息提醒

总结

该文章介绍在使用公众号开发功能时,涉及到的菜单、消息回复、推送等功能时,前面需要的一些准备工作,以及如何配置后端服务进行交互,同时提供了 Token 认证配置、网页授权、模版消息推送功能相关的源码给到大家

如果觉得博文不错,关注我 vnjohn,后续会有更多实战、源码、架构干货分享!

大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!

目录
相关文章
人工智能 关系型数据库 OLAP
540 0
|
9月前
|
消息中间件 NoSQL 安全
WePush 一款基于模拟点击实现的微信消息推送机器人,安全稳定不封号
WePush 是一个基于微信 Windows 客户端开发的消息推送系统,采用模拟人工点击技术实现消息发送,具有安全稳定、零封号风险的特点。系统通过 HTTP API 接收消息请求并利用 Redis 消息队列异步处理任务,支持群聊和个人消息推送。依赖 FastAPI、wxauto 和 Redis,适用于系统监控提醒等场景,需使用指定版本微信客户端运行。
1079 60
|
10月前
|
小程序
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
702 1
【04】微信支付商户申请下户到配置完整流程-微信开放平台移动APP应用通过-微信商户继续申请-微信开户函-视频声明-以及对公打款验证-申请+配置完整流程-优雅草卓伊凡
|
10月前
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
675 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
11月前
|
小程序 数据安全/隐私保护 开发者
【02】微信支付商户申请下户到配置完整流程-微信开放平台申请APP应用-微信商户支付绑定appid-公众号和小程序分别申请appid-申请+配置完整流程-优雅草卓伊凡
【02】微信支付商户申请下户到配置完整流程-微信开放平台申请APP应用-微信商户支付绑定appid-公众号和小程序分别申请appid-申请+配置完整流程-优雅草卓伊凡
814 3
|
11月前
|
小程序
【01】微信支付商户申请下户到配置完整流程-微信商户申请-资料准备以及提交-微信商户密钥申请-申请+配置完整流程-优雅草卓伊凡
【01】微信支付商户申请下户到配置完整流程-微信商户申请-资料准备以及提交-微信商户密钥申请-申请+配置完整流程-优雅草卓伊凡
389 2
【01】微信支付商户申请下户到配置完整流程-微信商户申请-资料准备以及提交-微信商户密钥申请-申请+配置完整流程-优雅草卓伊凡
|
11月前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
6059 38
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
11月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
3367 12
|
存储 小程序 安全
微信的开发管理都需要配置什么?
【10月更文挑战第17天】微信的开发管理都需要配置什么?
309 0