微信扫带参数二维码,微信回调

先申请公众号的测试账号:微信公众平台

在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。

请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

重点:想获取用户的unionID,就需要将这个测试公众号,配置到微信开放平台

 url:填写后点击提交微信会请求,所以你项目需要先部署,并且微信服务器可以访问到

token:随便填写,代码中会使用到

 @RequestMapping("/weChatCallBack")public String weChatCallBack(HttpServletRequest request) throws Exception {String msgSignature = request.getParameter("signature");String msgTimestamp = request.getParameter("timestamp");String msgNonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");String encrypt = request.getParameter("encrypt");if (StringUtils.isNotBlank(echostr)) {//第一次填写回调地址使用,回调地址通过,后面微信就不会请求了if (WXPublicUtils.verifyUrl(msgSignature, msgTimestamp, msgNonce, encrypt)) {return echostr;}} else {//这个是处理逻辑String msg = weChatService.weChatCallBack(request);}return "success";}

 验证过程

 /*** 验证Token** @param msgSignature 签名串,对应URL参数的signature* @param timeStamp    时间戳,对应URL参数的timestamp* @param nonce        随机数* @return 是否为安全签名* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息*/public static boolean verifyUrl(String msgSignature, String timeStamp, String nonce, String encrypt)throws AesException {// 这里的 WXPublicConstants.TOKEN 填写你自己设置的Token就可以了String signature = SHA1Util.getSHA1("此处填写你在页面中的token", timeStamp, nonce, encrypt);if (!signature.equals(msgSignature)) {throw new AesException(AesException.ValidateSignatureError);}return true;}/*** 用SHA1算法生成安全签名** @param token     票据* @param timestamp 时间戳* @param nonce     随机字符串* @param encrypt   密文* @return 安全签名*/public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException {try {String[] array = new String[]{token, timestamp, nonce};StringBuffer sb = new StringBuffer();// 字符串排序Arrays.sort(array);for (int i = 0; i < array.length; i++) {sb.append(array[i]);}String str = sb.toString();// SHA1签名生成MessageDigest md = MessageDigest.getInstance("SHA-1");md.update(str.getBytes());byte[] digest = md.digest();StringBuffer hexstr = new StringBuffer();String shaHex = "";for (int i = 0; i < digest.length; i++) {shaHex = Integer.toHexString(digest[i] & 0xFF);if (shaHex.length() < 2) {hexstr.append(0);}hexstr.append(shaHex);}return hexstr.toString();} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.ComputeSignatureError);}}public class AesException extends Exception {public final static int OK = 0;public final static int ValidateSignatureError = -40001;public final static int ParseXmlError = -40002;public final static int ComputeSignatureError = -40003;public final static int IllegalAesKey = -40004;public final static int ValidateAppidError = -40005;public final static int EncryptAESError = -40006;public final static int DecryptAESError = -40007;public final static int IllegalBuffer = -40008;private int code;private static String getMessage(int code) {switch (code) {case ValidateSignatureError:return "签名验证错误";case ParseXmlError:return "xml解析失败";case ComputeSignatureError:return "sha加密生成签名失败";case IllegalAesKey:return "SymmetricKey非法";case ValidateAppidError:return "appid校验失败";case EncryptAESError:return "aes加密失败";case DecryptAESError:return "aes解密失败";case IllegalBuffer:return "解密后得到的buffer非法";default:return null; // cannot be}}public int getCode() {return code;}public AesException(int code) {super(getMessage(code));this.code = code;}}

这个是微信回调

public String weChatCallBack(HttpServletRequest request) {// 获得微信端返回的xml数据StringBuilder returnXml = new StringBuilder();Map<String, String> map = new HashMap<>(8);try (InputStream is = request.getInputStream(); InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(isr)) {String str;while ((str = br.readLine()) != null) {//返回的是xml数据returnXml.append(str);}log.info("微信传来消息:{}", returnXml.toString());map = WXPublicUtils.xmlToMap(returnXml.toString());} catch (Exception e) {log.error("处理微信公众号请求信息,失败", e);}// 区分消息类型String msgType = map.get("MsgType");// 普通消息if ("text".equals(msgType)) {// 暂不开发 处理文本消息} else if ("image".equals(msgType)) {// 暂不开发 处理图片消息} else if ("voice".equals(msgType)) {// 暂不开发 处理语音消息} else if ("video".equals(msgType)) {// 暂不开发 处理视频消息} else if ("shortvideo".equals(msgType)) {// 暂不开发 处理小视频消息} else if ("location".equals(msgType)) {// 暂不开发 处理地理位置消息} else if ("link".equals(msgType)) {// 暂不开发 处理链接消息}// 事件推送else if ("event".equals(msgType)) {// 事件消息String event = map.get("Event");//带参数的二维码中的参数 scene_6ba76c65-7825-4507-a79c-84260ca1f087String eventKey = map.get("EventKey");String openId = map.get("FromUserName");if (eventKey.startsWith(Consts.QRSCENE)) {eventKey = eventKey.split("_")[1];}//根据openId换subscribe信息String jdbAppId = "微信appid";String accessToken = "获取微信accessToken";WeChatSubscribe subscribe = weChatApi.isSubscribeByOpenId(accessToken, openId);if ("subscribe".equals(event)) {log.info("订阅事件或未关注扫描二维码事件");} else if ("unsubscribe".equals(event)) { // 取消订阅事件log.info("处理取消订阅事件,暂时不做任何处理");} else if ("SCAN".equals(event)) {log.info("已关注扫描二维码事件");} else if ("LOCATION".equals(event)) {// 暂不开发 处理上报地理位置事件} else if ("CLICK".equals(event)) {// 暂不开发 处理点击菜单拉取消息时的事件推送事件} else if ("VIEW".equals(event)) {// 暂不开发 处理点击菜单跳转链接时的事件推送}}return "success";}/*** XML格式字符串转换为Map** @param strXML XML字符串* @return XML数据转换后的Map* @throws Exception*/public static Map<String, String> xmlToMap(String strXML) throws Exception {try {Map<String, String> data = new HashMap<>();DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));Document doc = documentBuilder.parse(stream);doc.getDocumentElement().normalize();NodeList nodeList = doc.getDocumentElement().getChildNodes();for (int idx = 0; idx < nodeList.getLength(); ++idx) {Node node = nodeList.item(idx);if (node.getNodeType() == Node.ELEMENT_NODE) {org.w3c.dom.Element element = (org.w3c.dom.Element) node;data.put(element.getNodeName(), element.getTextContent());}}try {stream.close();} catch (Exception ex) {// do nothing}return data;} catch (Exception ex) {log.warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML);throw ex;}}/*** 将Map转换为XML格式的字符串** @param data Map类型数据* @return XML格式的字符串* @throws Exception*/public static String mapToXml(Map<String, String> data) throws Exception {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();Document document = documentBuilder.newDocument();Element root = document.createElement("xml");document.appendChild(root);for (String key : data.keySet()) {String value = data.get(key);if (value == null) {value = "";}value = value.trim();Element filed = document.createElement(key);filed.appendChild(document.createTextNode(value));root.appendChild(filed);}TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer = tf.newTransformer();DOMSource source = new DOMSource(document);transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformer.setOutputProperty(OutputKeys.INDENT, "yes");StringWriter writer = new StringWriter();StreamResult result = new StreamResult(writer);transformer.transform(source, result);String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");try {writer.close();} catch (Exception ex) {}return output;}

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

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

相关文章

深入理解微信二维码扫码登录的原理

文章目录 1、二维码应用场景及安全问题2、二维码登录的本质3、二维码验证机制的原理解析4、深入理解二维码在登录的交互过程5、总结感悟 1、二维码应用场景及安全问题 二维码使用广泛&#xff0c;生活处处都有二维码的使用场景。 就拿我前几天遇到的事情来说一说&#xff0c;…

opencv调用微信的二维码识别引擎

导读 用过二维码识别的小伙伴们都知道&#xff0c;微信的二维码识别确实要比开源的二维码识别zxing和zbar要强不少&#xff0c;zxing和zbar对小的二维码以及模糊的二维码基本上是识别不出来的&#xff0c;有时候一张包含二维码的图片可能你缩放一下就可能导致识别不出来&#…

微信扫码登陆(1)---扫码登录流程讲解、获取授权登陆二维码

扫码登录流程讲解、获取授权登陆二维码 具体流程可以看微信官网的扫码登录文档 地址&#xff1a;准备工作 | 微信开放文档 其实官方文档已经讲的非常清楚而且讲的也很明白。 一、扫码登录流程讲解 1、首先准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAut…

生成微信二维码,微信扫码登录网站

注意 微信扫码登录&#xff0c;有两种实现方式&#xff1a; 方式1、依赖公司在【微信开放平台】用【公司营业执照】注册的账号&#xff0c;才能实现扫码登录 方式2、借助个人或者公司的微信公众号&#xff0c;生成微信带参二维码&#xff0c;实现扫码关注公众号后登录 大家要明…

安科瑞AWT100无线数据采集通信终端

安科瑞AWT100无线数据采集通信终端 安科瑞 崔丽洁

佳信客服全渠道接入手册

包括网页、微信、app、微博、邮箱、字节小程序等几种常见渠道接入配置&#xff0c;今天手把手教你如何配置。 网页渠道插入配置和使用 企业可以通过在web网站或微官网植入网页插件代码&#xff0c;让您的客户可以通过web网站和微官网的“联系客服”按钮&#xff0c;与企业客服…

NC与单一窗口数据对接丨外贸软件

在国际贸易通关过程中&#xff0c;所涉及相关部门的信息管理&#xff0c;主要是以数字化流程系统为主&#xff0c;让每个部门业务的申请、办理、回复采用电子化和互联网化。由于每个环节部分的数据壁垒未打通&#xff0c;数据无法协同共享&#xff0c;导致在口岸通关的过程中&a…

小满OKKICRM和畅捷通T+接口打通对接实战

数据源平台:小满OKKICRM 小满科技一直以“人工智能大数据”为核心驱动力&#xff0c;并融入多年深耕CRM行业的经验&#xff0c;为外贸客户提供多场景的解决方案。凭借卓越的服务水准&#xff0c;小满科技先后斩获“年度最佳外贸SaaS服务商”、“2019杰出品牌形象奖”、“2020最…

最新码支付源码+微信/支付宝/qq/秒挂支付/uid+三网监控+易支付H5接口 +聚合免签系统

&#xff08;码支付不支持虚拟主机&#xff09;强烈建议使用&#xff1a;[服务器]&#xff08;标准版、系统选Centos、其他配置默认即可后续可升级配置&#xff09;&#xff0c;刚入门选择最低配置或者活动机器均可。服务器环境要求的配置&#xff1a;PHP 7.3 Mysql 5.7 Sup…

vagrant下的虚拟机与windows主机通信,vagrant可以接受数据,主机ping一下显示请求超时,此时应该更换ip地址的最后一位,可能是ip地址冲突的原因,而不是防火墙是否的原因。

vagrant下的虚拟机与windows主机通信&#xff0c;vagrant可以接受数据&#xff0c;主机ping一下显示请求超时&#xff0c;此时应该更换ip地址的最后一位&#xff0c;可能是ip地址冲突的原因&#xff0c;而不是防火墙是否的原因。

网吧电脑显示连不上服务器,Pubwin客户机连不上服务器怎么办?

前面小编分享过文章《pubwin2009客户机的配置方法》&#xff0c;下面小编说说客户机使用过程中常见的一个问题&#xff1a;pubwin2009客户机连接不上服务器&#xff1f;遇到这种问题该如何解决呢。 pubwin2009客户机连接不上服务器&#xff0c;主要是因为控制台列表中&#xff…

虚拟机CentOS7网络Ping不通问题

目录 1、情境复现 2、查看路由信息 3、尝试重启网络服务 4、按照提示查看网络服务状态 5、检查ifcfg-ens33配置是否正确 6、检查VM虚拟网络编辑器子网IP是否正确 7、引入Network与NetworkManage的概念 8、查看NetworkManage状态 9、关闭NetworkManage及开机自启 10、…

ChatGLM服务器部署微调(一)

项目下载 下载地址&#xff1a;https://github.com/THUDM/ChatGLM-6B/tree/main 远程环境搭建以及配置 因为我是在服务器上运行&#xff0c;所以先搭建一下远程环境&#xff0c;如果不知道的话&#xff0c;可以看我之前这篇博客 详细完整pycharm远程连接服务器&#xff0c;…

【历史上的今天】12 月 9 日:微软推出 Windows 2.0;五十年前的极客科技展;第一个获得专利的人

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2021 年 12 月 9 日&#xff0c;在 1968 年的今天&#xff0c;Douglas Engelbart 在一场重要会议上&#xff08;正文将会介绍&#xff09;演示了世界上的第一个鼠标&am…

【历史上的今天】10 月 26 日:NetBSD 系统发布;Windows 8 诞生;微软推出 Surface 系列

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 10 月 26 日&#xff0c;历史上的今天&#xff0c;英国足协在伦敦成立&#xff0c;制定了第一个足球规则&#xff0c;宣告了现代足球运动的诞生&#xff1b;足…

校验密码复杂度(规则:长度8-30,必须包含数字、字母、特殊符号)、校验用户名(规则:长度4-19,包含数字、字母,不包含特殊字符)

校验密码复杂度&#xff08;规则&#xff1a;长度8-30&#xff0c;必须包含数字、字母、特殊符号&#xff09; 校验用户名&#xff08;规则&#xff1a;长度4-19&#xff0c;包含数字、字母&#xff0c;不包含特殊字符&#xff09;

密码长度至少6位,包括任意字符

页面标签 < asp:RegularExpressionValidator ID "revPassword" ControlToValidate "txtPassword" Display "Dynamic" ValidationExpression "([\s\S]{6,})" runat "server" ErrorMessage "密码长度至少6位" &…

在26个字符大小写和9个数字组成的列表中随机生成10个长度为8密码。

import random lst[] #建一个空列表 print(ord(a)) #拿到a的数字编码 97 print(ord(z)) #拿到z的数字编码 122 print(ord(A)) #拿到A的数字编码 65 print(ord(Z)) #拿到Z的数字编码 90 for i in ran…

新闻稿怎么写?

首先咱们要熟记新闻稿的六大要素和三要点&#xff1a; 新闻 六要素&#xff1a; 1、时间 2、地点 3、人物 4、事件 5、经过 6、结果 新闻稿怎么写 简单来说呢&#xff0c;就是咱们在在XXX时间,XXX地点&#xff0c;XXX人物&#xff0c;举办了XXX活动或者说做了什么事&#xff0c…

#A. gzx 的数学题

只要a b的结果不是 1&#xff0c;那答案就是 1&#xff0c;否则答案就是2。 注意数据范围&#xff0c;需要使用 long long #include <bits/stdc.h> #define int long long using namespace std; int a,b; signed main() {scanf("%lld%lld",&a,&b);if…