微信服务(公众)号实现用户关注自动注册成为会员

大家好,我是雄雄。交流技术可以进入到我的社区【雄雄的小课堂】

在这里插入图片描述

前言

看本篇文章之前,可以先看看前面两篇:
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现

微信公众平台安全模式下传输xml数据包时解密方式

前面这两篇文章主要实现的,当用户关注了服务号或者订阅号之后,通过触发事件,然后会给开发者配置的接口中,传输加密的xml格式数据,后台通过解密xml格式数据,拿到自己想要的东西。

解密xml数据,提取内容

在前两篇文章中也提到过,我们开启服务器配置时,需要在后台写两个同名接口,只是一个是get方式请求,另一个是post方式请求,具体的在这不在赘述。

现在我们来看看代码的实现。

/*** 接收用户事件* @param requestBody* @return*/@RequestMapping(value = "/validationWeCat",method = RequestMethod.POST)public String validationWeCat(@RequestBody String requestBody){if(Strings.isNotBlank(requestBody)){log.info("进入了validationWeCat的post方法,由用户触发的,值是:"+requestBody);//解析xml数据JSONObject jsonObject = WeChatUtils.toParseTheXmlData(requestBody);int code = jsonObject.getInteger("code");if(code==200){//获取关注的密文String miwen = jsonObject.getString("encrypt");//解密String jiemiText = WeChatUtils.decodeNewUsers(miwen);//解密完之后还是个xml数据,继续解析JSONObject jiemiObject = WeChatUtils.toParseTheXmlData(jiemiText);if(jiemiObject.getInteger("code")==200){//获取消息类型String msgType =  jiemiObject.getString("msgType");switch (msgType){//文本case "text" :break;//事件case "event" ://触发事件执行的方法eventCase(jiemiObject);break;// 语音case "voice" :break;// 视频case "video" :break;// 音乐case "music" :break;// 图文case "news" :break;// 图片case "image" :break;// 小视频case "shortvideo" :break;// 地理位置case "location" :break;// 链接case "link" :break;default:break;}}else{log.error("解析xml报错");}}else{log.error("解析xml报错");}}return requestBody;}
/*** 触发的是事件* @param jsonObject*/public void eventCase(JSONObject jsonObject){//获取事件类型String event =  jsonObject.getString("event");switch (event){//关注case "subscribe" ://获取微信号String weChatNum = jsonObject.getString("toUserName");//获取openidString openid = jsonObject.getString("fromUserName");Member member = new Member();member.setWechat(weChatNum);member.setOpenIdGzh(openid);//默认名字是:微信用户member.setName("公众号用户");boolean flag = saveMember(member);if(!flag){log.error("添加会员报错");}break;//取消关注case "unsubscribe" :break;// 用户已关注时的事件推送case "SCAN" :break;// 用户已关注时的事件推送case "LOCATION" :break;// 点击菜单拉取消息时的事件推送case "CLICK" :break;// 点击菜单跳转链接时的事件推送case "VIEW" :break;default:break;}}
/*** 添加会员的业务逻辑*/public boolean saveMember(LtMember ltMember){return memberService.save(ltMember);return false;}

上面就是添加会员的基本操作,涉及到了一个工具类,我这边也放出来吧,此工具类主要是用来解析xml数据的,代码如下:

package org.jeecg.modules.utils;import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.config.WeChatContant;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.util.HashMap;
import java.util.LinkedHashMap;/*** @author: muxiongxiong* @date: 2022年08月17日 下午 10:06* 公众号:雄雄的小课堂* 博客:https://blog.csdn.net/qq_34137397* 个人站:http://www.穆雄雄.com* 个人站:http://www.muxiongxiong.cn* @Description: 微信工具类,主要是用来加密和解密信息*/
@Slf4j
public class WeChatUtils {/*** 解析xml数据的工具类* @param xmlTest* @return*/public static JSONObject toParseTheXmlData(String xmlTest){//new LinkedHashMap<>() 表示让集合添加的时候有顺序JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());try {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//这里也不知道是啥意思dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);dbf.setXIncludeAware(false);dbf.setExpandEntityReferences(false);DocumentBuilder db = dbf.newDocumentBuilder();StringReader sr = new StringReader(xmlTest);InputSource is = new InputSource(sr);Document document = db.parse(is);//得到根节点Element root = document.getDocumentElement();//用户关注触发事件之后微信传过来加密的信息NodeList encryptNode = root.getElementsByTagName("Encrypt");//开发者微信号NodeList toUserNameNode = root.getElementsByTagName("ToUserName");//发送方帐号(一个OpenID)NodeList fromUserNameNode = root.getElementsByTagName("FromUserName");//消息类型,eventNodeList msgTypeNode = root.getElementsByTagName("MsgType");//事件类型,subscribe(订阅)、unsubscribe(取消订阅)NodeList eventNode = root.getElementsByTagName("Event");//消息创建时间 (整型)NodeList createTimeNode = root.getElementsByTagName("CreateTime");//事件 KEY 值,qrscene_为前缀,后面为二维码的参数值NodeList eventKeyNode = root.getElementsByTagName("EventKey");//二维码的ticket,可用来换取二维码图片NodeList ticketNode = root.getElementsByTagName("Ticket");//地理位置纬度NodeList latitudeNode = root.getElementsByTagName("Latitude");//地理位置经度NodeList longitudeNode = root.getElementsByTagName("Longitude");//地理位置精度NodeList precisionNode = root.getElementsByTagName("Precision");//获取该节点下的值,将值添加到jsonobject中if(encryptNode.getLength()>0){String encrypt = encryptNode.item(0).getTextContent();jsonObject.put("encrypt",encrypt);}if (toUserNameNode.getLength()>0) {String toUserName = toUserNameNode.item(0).getTextContent();jsonObject.put("toUserName",toUserName);}if (fromUserNameNode.getLength()>0) {String fromUserName = fromUserNameNode.item(0).getTextContent();jsonObject.put("fromUserName",fromUserName);}if (msgTypeNode.getLength()>0) {String msgType = msgTypeNode.item(0).getTextContent();jsonObject.put("msgType",msgType);}if (eventNode.getLength()>0) {String event = eventNode.item(0).getTextContent();jsonObject.put("event",event);}if (createTimeNode.getLength()>0) {String createTime = createTimeNode.item(0).getTextContent();jsonObject.put("createTime",createTime);}if (eventKeyNode.getLength()>0) {String eventKey = eventKeyNode.item(0).getTextContent();jsonObject.put("eventKey",eventKey);}if (ticketNode.getLength()>0) {String ticket = ticketNode.item(0).getTextContent();jsonObject.put("ticket",ticket);}if (latitudeNode.getLength()>0) {String latitude = latitudeNode.item(0).getTextContent();jsonObject.put("latitude",latitude);}if (longitudeNode.getLength()>0) {String longitude = longitudeNode.item(0).getTextContent();jsonObject.put("longitude",longitude);}if (precisionNode.getLength()>0) {String precision = precisionNode.item(0).getTextContent();jsonObject.put("precision",precision);}jsonObject.put("code",200);jsonObject.put("msg","操作成功");}catch (Exception exception){jsonObject.put("code",500);jsonObject.put("msg","出异常了");jsonObject.put("error",exception.getMessage());}return jsonObject;}
}}

至此,就可以实现关注后自动将会员注册到我们实际库中。后面的业务根据这个架构往下写就行,就比较简单了。

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

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

相关文章

完成图片拖拽

<html> <head><meta charset"UTF-8"><title>拖拽</title><style type"text/css">#box1{width: 100px;height: 100px;background-color: yellow;position:absolute;}#box2{width: 100px;height: 100px;background-colo…

深入探索 Java 热部署

转载自 深入探索 Java 热部署 简介 在 Java 开发领域&#xff0c;热部署一直是一个难以解决的问题&#xff0c;目前的 Java 虚拟机只能实现方法体的修改热部署&#xff0c;对于整个类的结构修改&#xff0c;仍然需要重启虚拟机&#xff0c;对类重新加载才能完成更新操作。对…

手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

背景公司去年开始使用dotnet core开发项目。公司的总体架构采用的是微服务&#xff0c;那时候由于对微服务的理解并不是太深&#xff0c;加上各种组件的不成熟&#xff0c;只是把项目的各个功能通过业务层面拆分&#xff0c;然后通过nginx代理&#xff0c;项目最终上线。但是这…

如何在面试中介绍自己的项目经验

转载自 如何在面试中介绍自己的项目经验 在面试时&#xff0c;经过寒暄后&#xff0c;一般面试官会让介绍项目经验 。常见的问法是&#xff0c;说下你最近的&#xff08;或最拿得出手的&#xff09;一个项目。 根据我们的面试经验&#xff0c;发现有不少候选人对此没准备&am…

Configuration Extensions - 简化配置,让你配置支持变量

在开发“RabbitCloud”项目时&#xff0c;使用配置文件发现会有很多重复值&#xff0c;所以我基于”Microsoft.Extensions.Configuration”写了一个扩展库&#xff0c;来丰富对配置的支持。实际案例——“RabbitCloud”之前&#xff0c;我是这样的因为公司ip和家里机器的ip不一…

如何配置frp到linux服务器和windows本地,服务端支持自启动

大家好&#xff0c;我是雄雄&#xff0c;如果你觉得文章还不错的话&#xff0c;欢迎在文末点赞和评论。 前言 最近这段时间都在开发微信服务&#xff08;公众&#xff09;号相关技术&#xff0c;对于写了好几年的后端程序的我来说&#xff0c;开发小程序和服务号&#xff0c;刚…

错误代码:88000, 错误信息:without comment privilege hint: [7oJ0533w689] rid: 630432cd-15944cf6-083e04fc

大家好&#xff0c;我是雄雄。 问题复现 这个问题&#xff0c;是我在操作&#xff1a;给微信公众平台上添加图文到草稿箱时&#xff0c;遇到的。 报错信息如下&#xff1a; {"errcode":88000,"errmsg":"without comment privilege hint: [7oJ0533w6…

asp.net core AuthenticationMiddleware 在WebApi中的的使用

在.net framework 4.5架构下使用认证&#xff08;Authentication&#xff09;授权(Authorization)。IIS使用HttpModule进行认证&#xff08;Authentication&#xff09;&#xff0c;我们可以选择自己实现认证方式并在web.config中配置&#xff0c;当然也可以选择IIS默认提供的几…

WebSocket In ASP.NET Core(二)

Introduce上篇博文中&#xff0c;介绍了WebSocket的基本原理&#xff0c;以及一个简单的Demo用来对其有一个大致的认识。这篇博文讲的是我们平常在网站上可能会经常遇到的——实时聊天&#xff0c;本文就是来讲在.NET-Core使用WebSocket来实现一个“乞丐版”的在线实时聊天Demo…

不支持POST请求方法,支持以下GET、

大家好&#xff0c;我是雄雄。 刚刚在用**FeignClient**注解的时候&#xff0c;报了个错&#xff0c;不支持POST请求方法&#xff0c;支持以下GET、。 字面意思上看&#xff0c;好像是让把请求方式从post改成get. 但是&#xff0c;我检查了下我的代码&#xff0c;get提交方式…

P3701 -「伪模板」主席树【网络流,最大流】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3701 题目大意 给出若干个人的克制关系 给出两边每个人的种类和血量。当两个人pkpkpk后&#xff0c;双方各−1hp-1hp−1hp&#xff0c;同一边的YYYYYYYYY可以给每个同一方的J1hpJ\ 1hpJ 1hp&#xf…

微服务如何实现各个模块之间相互调用

大家好&#xff0c;我是雄雄&#xff0c;现在是:2022年8月23日21:08:53 前言 在做微服务项目时&#xff0c;我们可能都会遇到这样的情况&#xff0c;那就是A服务需要调用B服务中的某个接口&#xff0c;那有这样的需求时&#xff0c;我们应该怎么处理呢&#xff1f; 实现 使用…

2017年秋招美团Java程序员开发,看我如何拿到offer

转载自 2017年秋招美团Java程序员开发&#xff0c;看我如何拿到offer 本人是一名本科毕业非计算机专业的程序员&#xff0c;面了阿里&#xff0c;结果没过&#xff0c;最后面上了美团&#xff0c;热乎乎的面经&#xff0c;昨天面的美团&#xff0c;虽然面完了HR面&#xff0c…

ASP.NET Core 运行原理剖析

1.1. 概述在ASP.NET Core之前&#xff0c;ASP.NET Framework应用程序由IIS加载。Web应用程序的入口点由InetMgr.exe创建并调用托管。以初始化过程中触发HttpApplication.Application_Start()事件。开发人员第一次执行代码的机会是处理Application_StartGlobal.asax中的事件。在…

使用wxJava开发微信服务(公众)号,实现新建素材的功能

大家好&#xff0c;我是雄雄。 前言 微信服务&#xff08;公众号&#xff09;号开发&#xff0c;前面已经整理过了几篇文章了&#xff0c;如下&#xff1a; java实现微信服务&#xff08;公众&#xff09;号用户关注时&#xff0c;获取openid&#xff0c;安全模式下的加密解密…

经典指针程序互换(一)

#include<stdio.h> huan(int *p,int *q){int t;t*p;*p*q;*qt;}int main(){ int a3,b10; huan(&a,&b);printf("%d %d",a,b); }这里我最疑惑的是不是改变*p的值就改变了a的值&#xff0c;为此&#xff0c;我专门敲了段代码&#xff0c;验证一下 #inclu…

Spring MVC 到底是如何工作的

转载自 Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分——Spring Web MVC的强大功能及其内部工作原理。 这篇文章的源代码可以在GitHub上找到。 项目安装 在本文中&#xff0c;我们将使用最新、最好的Spring Framework 5。我们将重点介绍Spring的经典…

Entity Framework中的字符串插值引发担忧

将内插字符串&#xff08;Interpolated Strings&#xff09;自动地转化为参数化SQL语句&#xff0c;这是Entity Framework Core 2提供的一个新特性。虽然该特性从设计上是为了避免出现SQL语句编写上的问题&#xff0c;但是有人担心这会导致更多的SQL注入攻击。下面给出一个正确…

jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?

大家好&#xff0c;我是雄雄。 目录 这里写目录标题目录bug说明解决bug的过程解决方法结论今天在用jeecg-boot集成了的xxl-job的时候&#xff0c;遇到了个奇葩的问题&#xff08;其实一点都不奇葩&#xff09;&#xff0c;投入了几个人&#xff0c;一起看这个问题&#xff0c;看…

nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】

正题 题目大意 求n个数的全排列的第k个。 解题思路 首先康拓逆展开 ∑ii<nxi(n−i)!\sum^{i<n}_i x_i(n-i)!∑ii<n​xi​(n−i)! 求每个时候第xxx大的数 然后因为n(n−1)!n!n(n-1)!n!n(n−1)!n! so我们可以直接用余数 这是n3n3n3时是序列&#xff0c;我们可以发现我…