微信公众号 接口配置

1、登录微信公众平台-->设置与开发-->基本配置页面,打开服务器配置

2、在网站后台添加两个接口get请求验证和post请求消息转发,url为上图填写的url,

    
@RestController
@RequestMapping("/officialAccount/")
public class OfficialAccountController extends BaseController {@GetMapping("/wechat")public String validate(@RequestParam(value = "signature") String signature,@RequestParam(value = "timestamp") String timestamp,@RequestParam(value = "nonce") String nonce,@RequestParam(value = "echostr") String echostr) {return WeChatHelper.checkSignature(signature, timestamp, nonce) ? echostr : null;}/*** 此处是处理微信服务器的消息转发的*/@PostMapping("/wechat")public String processMsg(HttpServletRequest request) {//System.out.println("message received, start process message!");// 调用核心服务类接收处理请求return processRequest(request);}
}

WeChatHelper 为解密验证的代码

package com.ruoyi.stock.applet.util;import com.ruoyi.common.utils.DateUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;public class WeChatHelper {/*** 验证签名** @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String signature, String timestamp, String nonce) {String[] arr = new String[] {WeChatConstant.TOKEN, timestamp, nonce};// 将token、timestamp、nonce三个参数进行字典序排序sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 将字节数组转换为十六进制字符串** @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串** @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}private static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}/*** 解析微信发来的请求(xml)** @param request* @return* @throws Exception*/@SuppressWarnings({"unchecked"})public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {// 将解析结果存储在HashMap中Map<String, String> map = new HashMap<>();// 从request中取得输入流InputStream inputStream = request.getInputStream();// 读取输入流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();// 得到根元素的所有子节点List<Element> elementList = root.elements();// 遍历所有子节点for (Element e : elementList) { map.put(e.getName(), e.getText()); }// 释放资源inputStream.close();inputStream = null;return map;}public static String mapToXML(Map map) {StringBuffer sb = new StringBuffer();sb.append("<xml>");mapToXML2(map, sb);sb.append("</xml>");try {return sb.toString();} catch (Exception e) {}return null;}private static void mapToXML2(Map map, StringBuffer sb) {Set set = map.keySet();for (Iterator it = set.iterator(); it.hasNext(); ) {String key = (String)it.next();Object value = map.get(key);if (null == value) { value = ""; }if (value.getClass().getName().equals("java.util.ArrayList")) {ArrayList list = (ArrayList)map.get(key);sb.append("<" + key + ">");for (int i = 0; i < list.size(); i++) {HashMap hm = (HashMap)list.get(i);mapToXML2(hm, sb);}sb.append("</" + key + ">");} else {if (value instanceof HashMap) {sb.append("<" + key + ">");mapToXML2((HashMap)value, sb);sb.append("</" + key + ">");} else {sb.append("<" + key + "><![CDATA[" + value + "]]></" + key + ">");}}}}/*** 回复文本消息** @param requestMap* @param content* @return*/public static String sendTextMsg(Map<String, String> requestMap, String content) {Map<String, Object> map = new HashMap<String, Object>();map.put("ToUserName", requestMap.get(WeChatConstant.FromUserName));map.put("FromUserName", requestMap.get(WeChatConstant.ToUserName));map.put("MsgType", WeChatConstant.RESP_MESSAGE_TYPE_TEXT);map.put("CreateTime", DateUtils.getDate());map.put("Content", content);return mapToXML(map);}/*** 回复图文消息** @param requestMap* @param items* @return*/
//	public static String sendArticleMsg(Map<String, String> requestMap, List<ArticleItem> items) {
//		if (items == null || items.size() < 1) {
//			return "";
//		}
//		Map<String, Object> map = new HashMap<String, Object>();
//		map.put("ToUserName", requestMap.get(WeChatConstant.FromUserName));
//		map.put("FromUserName", requestMap.get(WeChatConstant.ToUserName));
//		map.put("MsgType", "news");
//		map.put("CreateTime", DateUtils.getDate());
//		List<Map<String, Object>> Articles = new ArrayList<Map<String, Object>>();
//		for (ArticleItem item : items) {
//			Map<String, Object> itemMap = new HashMap<String, Object>();
//			Map<String, Object> itemContent = new HashMap<String, Object>();
//			itemContent.put("Title", item.getTitle());
//			itemContent.put("Description", item.getDescription());
//			itemContent.put("PicUrl", item.getPicUrl());
//			itemContent.put("Url", item.getUrl());
//			itemMap.put("item", itemContent);
//			Articles.add(itemMap);
//		}
//		map.put("Articles", Articles);
//		map.put("ArticleCount", Articles.size());
//		return mapToXML(map);
//	}}

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

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

相关文章

亚马逊评论和销量的关系都有哪些呢?

评论和销量的关系非常密切。当然不是评论越多越好&#xff0c;更合理的评论对产品的关键词排名帮助更大。就连亚马逊也会推荐一些资源&#xff0c;所以推荐和曝光越多&#xff0c;销量也会增加越多。这也是为什么卖家都在努力增加Review数量&#xff0c;甚至花钱找人做评测还免…

亚马逊评论的类型有哪些?都该怎么操作呢?

亚马逊评论对于亚马逊卖家店铺来说很重要的&#xff0c;评论又多又好的产品自然更受欢迎&#xff0c;但是评论肯定不只一种&#xff0c;那么亚马逊评论的类型有哪些&#xff1f;都该怎么操作呢&#xff1f; 亚马逊评论分为以下几种&#xff1a; 1、直评 直评是买家可以不用购…

视频会议解决方案-最新全套文件

视频会议解决方案-最新全套文件 一、建设背景二、建设思路业务挑战 三、建设方案四、获取 - 视频会议全套最新解决方案合集 一、建设背景 随着中国经济的迅速发展&#xff0c;很多企业的发展也进入快车道&#xff0c;分支机构越来越多&#xff0c;形成了遍布全国范围甚至全球范…

微软:明年 7 月之前,所有会议线上举行

By 超神经 内容提要&#xff1a;这场疫情对科技行业带来了重大影响。自 2 月以来&#xff0c;被迫取消或转至线上的科技峰会已经数不胜数。现在&#xff0c;微软已经决定&#xff0c;将明年下半年之前的所有活动转至线上&#xff0c;科技会议或许就此迎来变革&#xff1f; 关键…

智能会议纪要生成,从音视频到一键生成会议特征数据

★★★ 本文源自AI Studio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 零.项目背景 目标&#xff1a;针对会议场景的长视频或者长语音&#xff0c;自动生成会议记录并通过摘要生成技术形成会议摘要。 一.技术流程 1.通过moviepy 提取视频中的音频&am…

本地电脑腾讯会议PPT演讲者模式

在腾讯会议中进行PPT汇报的时候&#xff0c;有些情况我们是想要看到备注的&#xff0c;即如何实现对自己是演讲者模式&#xff0c;而对其他人展示的是报告全屏内容呢&#xff1f; 不同操作系统的电脑实现方式还不同&#xff0c;下面分别介绍&#xff1a; 对于mac系统&#xf…

会中切换网络总掉线?腾讯会议用这种方案让你好好开会

&#x1f449;腾小云导读 也许你有这样的体验&#xff1a;当你加入腾讯会议开会&#xff0c;老板正在发布重要任务时&#xff0c;你恰好要进电梯时 wifi 切换成了 cellular&#xff0c;画面开始「转菊花」&#xff0c;网络断开重连却需要好久&#xff0c;最终老板的指示你一个字…

腾讯会议的各种使用办法

如何关闭某一成员突然打开的麦克风 1.点击管理成员 2.点击关闭麦克风或者关闭视频即可 如何更换背景 1.点击设置 2.点击虚拟背景和美颜 3.选择已有背景或者点击支持图片/视频从本地进行上传 调整声音 1.点击设置 2.点击音频 3.点击音量调节

Zoom会议使用指南

一、使用手册 1、加入会议 1.1 下载ZOOM 下载ZOOM客户端&#xff1a;https://ruanshi1.8686c.com/prod/4.4.55389.0716/ZoomInstaller.exe 1.2 点击加入会议 1.3 点击会议URL或输入会议ID https://cnegroup.zoom.us/j/768131602 1.4 开始会议 2、召开会议 2.1登录Zoom 2.…

使用 Microsoft Teams 开会到底有多少途径——建会

疫情原因公司开始远程办公&#xff0c;过程不赘述&#xff0c;最终选择了 Microsoft Teams 作为开会的工具。 通过这几个月的摸索&#xff0c;终于算是上手了&#xff0c;开始时被 Teams 开会整懵圈了&#xff0c;每天收到各种工单&#xff0c;问怎么开会。后来发现 Teams 开会…

使用 Microsoft Teams 开会到底有多少途径——参会

上一篇关于Teams建会的文章发完之后&#xff0c;总想着把参会的赶紧写了&#xff0c;结果发现两个月就这么过去了&#xff0c;趁着最近不忙&#xff0c;赶紧更新 接前文 使用 Microsoft Teams 开会到底有多少途径——建会添加链接描述 和建会一样&#xff0c;参会也是条条大路…

油猴脚本尝试

现在是这样的&#xff0c;我这边有个运维系统&#xff0c;里面有个日志&#xff0c;我们经常要复制&#xff0c;然后我们复制的时候需要打开内容&#xff0c;然后去选中复制。 类似于这种&#xff0c;我觉得这个时候&#xff0c;去选中复制就很麻烦&#xff0c;右边这里不是有…

油猴插件/脚本还不会使用?看这篇文章就够了, 各种实用的插件/脚本使用技巧

本文是众多使用技巧中其中的一篇, 全部使用技巧点击链接查看, 或直接查看本专栏其他文章, 保证你收获满满 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页 了解更多计算机学科的精品思维导图整理 本文可以转载&…

油猴插件安装以及好用的脚本推荐

现在浏览器不搞几个插件和IE浏览器有啥区别&#xff0c;因此今天推荐一下及其强力的油猴&#xff08;Tampermonkey&#xff09;插件。 一、Tampermonkey插件安装 想使用插件首先要安装插件&#xff0c;我这里以Edge浏览器举例。 1、先打开浏览器的扩展项&#xff0c;然后在搜…

Tampermonkey油猴脚本的简单实现教程

先把上面的描述信息修改成自己的 这里假装你已经在浏览器上安装好了油猴插件&#xff0c;并且点击了 号进入了新增脚本页面 重点修改 *name 自定义一个脚本名称 *include 目标网址 *connect 目标网站域名 *require 可以在这里加载jQuery *grant 会用到的方法&#xff0c;一…

Tips【油猴Tampermonkey】脚本安装教程

前言 我本人喜欢在百度网盘上存一些东西&#xff0c;但是网盘的下载限速真的恶心到惊人&#xff0c;于是搜索了知乎等处&#xff0c;发现油猴这个扩展程序&#xff0c;其中百度网盘下载助手是我最中意的&#xff0c;但是我的chrome浏览器不好用&#xff0c;不知道为什么哈&…

“油猴”的五大神级脚本

上一片文章介绍过谷歌的五大神级拓展 其中压箱底的就是“油猴”了&#xff0c;油猴的厉害之处就在于它丰富的脚本&#xff0c;这些脚本可以让你自由的干你想干的事&#xff0c;今天我就介绍五个我用着十分顺手的脚本。 当然由于我不刷微博所以关于这方面的脚本就不做介绍了。 …

油猴脚本(Tampermonkey)的安装和使用小结

0x00 前言 文章中的文字可能存在语法错误以及标点错误&#xff0c;请谅解&#xff1b; 如果在文章中发现代码错误或其它问题请告知&#xff0c;感谢&#xff01; 浏览器&#xff1a;Firefox 93.0 0x01 油猴脚本(Tampermonkey)安装和使用 1.油猴脚本(Tampermonkey)简介 Ta…

【油猴Tampermonkey】脚本安装教程+自用脚本推荐

转自&#xff1a;52破解 本帖最后由 Pandolar 于 2017-6-5 17:21 编辑 ①&#xff1a;软件简介&#xff1a; Tampermonkey&#xff0c;这是一个伟大的Chrome扩展。可以说&#xff0c;就算Chrome没有其他扩展&#xff0c;只有Tampermonkey&#xff0c;Chrome依然能吸引到一大群…

【阿里面试】最近一个朋友去阿里面试 P6 跟我分享了一下面试题

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO TOP红人 Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕…