🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述

在这里插入图片描述


在Java中对接微信公众号并向指定关注用户发送消息,主要依赖微信公众号的消息模板功能。以下是关键步骤和代码实现:


⚙️ 一、核心前提条件

  1. 公众号类型:需服务号或认证后的订阅号(个人可用测试号)。
  2. 用户关注:目标用户必须已关注公众号。
  3. 获取用户OpenID:每个用户有唯一OpenID(通过网页授权或后台接口获取)。
  4. 消息模板:在公众号后台申请模板消息,获取template_id

🔧 二、开发步骤与Java代码实现

1. 服务器URL验证(首次配置必做)

微信通过GET请求验证服务器有效性,需实现校验逻辑:

@WebServlet("/wx")
public class WxServlet extends HttpServlet {private static final String TOKEN = "your_token"; // 与公众号配置的Token一致protected void doGet(HttpServletRequest request, HttpServletResponse response) {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");// 1. 排序并拼接Token、timestamp、nonceString[] arr = {TOKEN, timestamp, nonce};Arrays.sort(arr);String concatStr = String.join("", arr);// 2. SHA1加密String sha1 = DigestUtils.sha1Hex(concatStr); // Apache Commons Codec// 3. 校验签名if (sha1.equals(signature)) {response.getWriter().print(echostr); // 返回echostr表示验证成功}}
}

注意:需使用内网穿透工具(如cpolar、natapp)将本地服务暴露为公网URL,供微信访问。


2. 获取Access Token

调用微信API获取接口凭证(有效期2小时,需缓存):

public String getAccessToken() throws IOException {String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"+ "&appid=APPID&secret=APPSECRET"; // 替换为实际AppID和AppSecretHttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();HttpResponse<String> response = client.send(request, BodyHandlers.ofString());JSONObject json = new JSONObject(response.body());return json.getString("access_token"); // 返回Token
}

优化:使用Redis缓存Token,避免频繁调用。


3. 发送模板消息

构造JSON请求体,调用微信消息接口:

public void sendTemplateMessage(String openid, String templateId) throws IOException {// 1. 准备消息数据Map<String, Object> data = new HashMap<>();data.put("first", Map.of("value", "订单通知", "color", "#173177"));data.put("orderNo", Map.of("value", "202408051234"));data.put("status", Map.of("value", "已发货"));// 2. 构造完整请求体JSONObject body = new JSONObject();body.put("touser", openid);body.put("template_id", templateId);body.put("url", "https://yourdomain.com/order"); // 用户点击跳转链接body.put("data", data);// 3. 调用接口String apiUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + getAccessToken();HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder().uri(URI.create(apiUrl)).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(body.toString())).build();HttpResponse<String> response = client.send(request, BodyHandlers.ofString());System.out.println("发送结果:" + response.body()); // 解析errcode判断成功与否
}

表:模板消息参数说明

参数必填说明
touser用户OpenID(如oOM-e52ersdi7a4wZTOQHUQOwGuw
template_id模板ID(如AYZc280-hh7QeO5eM8Usl7SlD5wzQ_I8tQq1e9HlmhQ
data模板内容,需与申请模板时的关键词匹配(如firstorderNo等)
url用户点击消息后跳转的链接

⚠️ 三、注意事项与常见问题

  1. 消息类型限制

    • 模板消息:适用于业务通知(如订单状态),需用户触发交互后7天内发送。
    • 客服消息:用户主动发送消息后48小时内可任意回复(无需模板)。
    • 表:消息类型对比
      特性模板消息客服消息
      发送条件需用户触发交互用户主动发消息后
      时效性7天内48小时内
      内容格式固定模板自由文本/图文
  2. 调试工具

    • 测试号申请:微信公众平台测试账号。
    • 内网穿透工具:cpolar(稳定)或natapp(免费)。
  3. 错误码处理

    • 40001:Access Token无效 → 重新获取。
    • 41028:FormID失效 → 检查用户交互是否超期。
    • 完整错误码:微信全局错误码文档。

🚀 四、进阶优化建议

  1. 使用SDK简化开发
    推荐WxJava封装底层请求:

    // 示例:WxJava发送模板消息
    WxMpService wxService = new WxMpServiceImpl();
    wxService.setWxMpConfigStorage(new WxMpInMemoryConfigStorage()); // 设置AppID/Secret
    WxMpTemplateMessage message = WxMpTemplateMessage.builder().toUser(openid).templateId(templateId).build();
    message.addData(new WxMpTemplateData("status", "已完成"));
    wxService.getTemplateMsgService().sendTemplateMsg(message);
    
  2. 消息安全与性能

    • Token管理:使用Redis缓存Access Token,定时刷新避免超限(每日2000次)。
    • 异步发送:将消息发送任务放入线程池,避免阻塞主业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917715.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917715.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917715.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【盘古100Pro+开发板实验例程】FPGA学习 | 3X3图像矩阵生成 | 图像实验指导手册

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1. 实验简介 实验目的&#xff1a; 实现 3X3 图像矩阵对应 9 个像素点图像数据的读取。 实验环境&#xff1a; Wind…

【通用视觉框架】基于OpenCvSharp+WPF+YOLO开发的仿VisionMaster的通用视觉框架软件,全套源码,开箱即用

【通用视觉框架】基于OpenCvSharpWPFYOLO开发的仿VisionMaster的通用视觉框架软件&#xff0c;全套源码&#xff0c;开箱即用 基于OpenCvSharp、WPF和YOLO的组合&#xff0c;构建一个兼具图像处理能力、可视化交互和实时检测的工业级视觉框架。其核心是将底层算法与上层界面无…

微信小程序转Vue2组件智能提示词

角色 小程序转Vue2组件工程师&#xff08;ElementUI专精&#xff09; 核心能力 技术专长&#xff1a;作为世界顶尖前端工程师&#xff0c;专注于将小程序组件&#xff08;.wxml/.wxss/.js/.json&#xff09;精准转换为Vue2ElementUI组件&#xff0c;转换逻辑零偏差&#xff0c;…

JVM 学习总结

文章目录内存结构程序计数器什么是程序计数器&#xff1f;核心作用&#xff1a;为什么需要程序计数器&#xff1f;实现原理主要特点示例&#xff1a;PC 寄存器如何工作总结Java 虚拟机栈什么是 Java 虚拟机栈&#xff1f;栈帧的内部结构主要特点总结线程诊断本地方法栈堆堆内存…

目标检测检出率,误检率,ap,map等评估python代码

1.deepseek版本import numpy as np from collections import defaultdictdef calculate_iou(box1, box2):"""计算两个边界框的交并比&#xff08;IoU&#xff09;:param box1: [x1, y1, x2, y2]:param box2: [x1, y1, x2, y2]:return: IoU"""# 计…

python的高校班级管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 在高校教…

Scrapy 工作流程深度解析:引擎驱动的完美协作

一、Scrapy 核心组件全景图 #mermaid-svg-KWCKN9n4urijbSws {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KWCKN9n4urijbSws .error-icon{fill:#552222;}#mermaid-svg-KWCKN9n4urijbSws .error-text{fill:#552222;…

PCIe Base Specification解析(七)

文章目录3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人脸识别登录失败,重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决

Windows 11 使用Windows Hello使用人脸识别登录失败&#xff0c;重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决&#xff1a;遇到此种情况时&#xff1a;1、在“开始”右键——设置——账号——登录选项2、需要在PIN这里先进行删除此登录选项&#xff…

qq scheme

QQ intent scheme跳转 1.跳转指定说说(root) 2.跳转指定说说(非root) 3. 跳转聊天框 4. 跳转用户主页 5. 跳转加群 6. 跳转指定用户空间 1.跳转指定说说(root) 该方法需root权限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C语言基础_随机数、数组、函数、指针

0、随机数&#xff1a; 要用C语言产生随机数&#xff0c;首先在预处理程序部分要引入stdlib.h头文件&#xff0c;然后就可以用rand()在后续程序中生成随机数了。如果不设置随机数种子srand()&#xff0c;后面生成的随机数序列就是以41开头的一个固定序列&#xff0c;因此一般以…

PHP‑ORT扩展构建纯PHP机器学习的推荐系统

结合 PHP‑ORT 构建推荐系统的核心思想是&#xff1a;使用 ONNX 格式的机器学习模型&#xff0c;在 PHP 中本地执行推理&#xff0c;实时给出推荐结果。下面是一个完整的架构设计与实现路径&#xff0c;适合你快速上手。&#x1f3af; 场景目标 你想在一个 PHP 网站中实现推荐功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目录 一、PromptPilot 二、基于产品评价的用户情感分析 2.1 使用PromptPiolt工具进行提示词生成 2.2 基于prompt的模型调试 2.3 基于prompt的批量数据测评 2.4 基于多轮对话的prompt测试 如今&#xff0c;我们正身处一个 AI 技术飞速迭代的时代。人工智能早已不再是实验室…

MSPM0开发学习笔记:二维云台结合openmv实现小球追踪

文章目录前言一、硬件选择二、原理介绍&#xff08;UART&#xff09;三、硬件连线三、软件代码1、视觉部分代码&#xff08;Openart&#xff09;2、控制部分代码&#xff08;MSPM0&#xff09;&#xff08;1&#xff09; UART部分&#xff08;2&#xff09; 计算函数部分&#…

【CTF-WEB-SQL】SQL注入基本流程(sql-labs的Less11)(用burp抓取post然后用sqlmap盲注)

题目 从第11less开始&#xff0c;就是POST表单了burp抓取数据包将抓取到的数据包存放到桌面&#xff0c;保存为post.txt数据包内容如下&#xff1a;POST /Less-11/ HTTP/1.1 Host: 223.112.39.132:44537 Content-Length: 39 Cache-Control: max-age0 Accept-Language: zh-CN,zh…

WPF 与 Winform :Windows 桌面开发该用谁?

WPF 与 Winform :Windows 桌面开发该用谁? 一、 WPF 与 Winform的概念 WPF:颜值与实力并存的 “后起之秀” Winform:简单直接的 “老前辈” 二、WPF 与 Winform 的核心差异 1. 设计理念:分离 vs 耦合 2. 布局系统:灵活适配 vs 固定坐标 3. 视觉效果:绚丽动画 vs 朴素原生…

【Git学习】入门与基础

目录 Git的安装 Git 配置用户信息 Git 初始化本地仓库 Git 工作区、暂存区和版本库 Git 跟踪文件 Git 修改文件 Git 删除文件 Git 撤销本地文件的修改 Git 取消暂存 Git 跳过暂存区 Git 版本回退 Git 撤销提交 Git 设置忽略文件 Git 比较文件差异 Git 代码托管平台…

idea添加gitlab访问令牌

1.按下图所示顺序操作gitlab,获取到对应的token;2.填写对应的gitlab地址和第一步获取的token

人工智能领域、图欧科技、IMYAI智能助手2025年5月更新月报

2025年5月IMYAI平台技术动态与模型更新综述 摘要&#xff1a; 本文整理了2025年5月期间IMYAI平台发布的主要技术更新、新模型上线信息及功能调整公告&#xff0c;涵盖DeepSeek、Gemini、Claude、即梦、Suno等模型动态及平台功能优化。 正文&#xff1a; 一、 模型更新与上线Dee…

机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利

一、机器人权利&#xff1a;真实还是虚幻&#xff1f;机器人权利的讨论源于技术进步对传统法律与伦理体系的冲击&#xff0c;其真实性取决于技术发展阶段与社会接受度的互动。当前&#xff0c;机器人权利仍呈现“虚幻与真实交织”的特征&#xff1a;技术基础&#xff1a;从工具…