JAVA微信公众号完整版教程扫一扫登录/自动回复/客服消息

微信公众号二维码扫码登录(SpringBoot Java实现) 用户扫描公众号的二维码,实现登录当前平台。 若未关注公众号,则关注后触发登录;若已关注,则直接登录。 登录时通过union_id判断用户是否在系统注册,若未注册则跳转到注册页面或提示未注册。 阅读详情

开篇整理

之前写过一篇关于微信/企业微信/钉钉授权登录的博文,阅读量还挺高,正好此次在工作中有需要微信公众号扫码登录的项目,利用工作间隙捋一下整个的代码开发流程,本文主要还是以后端JAVA为主,前端其实配合的地方不是很多主要是后端完成大部分的工作。
很多小伙伴其实对于微信公众号的开发文档看的很迷,功能写的很全,但如果第一次开发微信的功能多少都有点懵逼,哈哈哈,我就是懵逼的其中一员!
废话不多说接下来我们开始·····

Maven依赖

 <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.liyiorg</groupId>
            <artifactId>weixin-popular</artifactId>
            <version>2.8.24</version>
        </dependency>

配置公众测试号

  • 配置信息修改,注意书写外网可访问接口即可

在这里插入图片描述

后续方法中使用的wxService

  • 必要提醒:此处配置微信参数,配置好方法即可在后续方法中直接调用微信的WxMpService相当方便建议配置会省很多事情
/**
 * @author hanfeng
 * @date 2021/12/4
 */
@Component
public class WeChatMpConfig {

    @Autowired
    private SysConfigFileUrl configFileUrl;

    @Bean
    public WxMpService wxMpService(){
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }

    @Bean
    public WxMpConfigStorage wxMpConfigStorage(){
        WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl();
        wxMpDefaultConfig.setAppId(configFileUrl.getMpAppId());
        wxMpDefaultConfig.setSecret(configFileUrl.getMpAppSecret());
        return wxMpDefaultConfig;
    }
}

配置服务器所需接口

  • 后端需写两个接口接受微信服务器的回调即上方/wechat/callback接口,名称无所谓只要外网能访问到就行。可参考微信开发文档配置地址微信官方接口说明如下:
    在这里插入图片描述

  • 服务器验证-具体实现逻辑代码如下(直接CV进行实验即可)注意:此处接受方法为GET上方图片有说明,所以此接口只是配合微信做一个服务器验证操作

	 /**
     * 微信验证回调
     *
     * @param request
     * @param response
     */
    @GetMapping(value = "/callback")
    public void init(HttpServletRequest request, HttpServletResponse response) {
        log.info("==微信回调Token验证==");
        try {
            String nonce = request.getParameter("nonce");
            String timestamp = request.getParameter("timestamp");
            String signature = request.getParameter("signature");
            String echoStr = request.getParameter("echostr");
            //1.对三个字符进行排序
            List<String> params = CollUtil.newArrayList(nonce, timestamp, #此处填写上方服务器配置所填写的Token);
            Collections.sort(params);
            //list转换成string
            String tmpStr = ArrayUtil.toString(params);
            //2.将三个参数字符串转换成字符串进行sha1加密
            String sha1 = SecureUtil.sha1(tmpStr);
            log.info("加密之前:" + signature + "加密之后" + sha1);
            //3.比对两者的加密参数是否相等
            if (sha1.equals(signature)) {
                //4.验证成功返回给微信服务器消息验证
                OutputStream outputStream = response.getOutputStream();
                outputStream.write(URLUtil.encode(echoStr).getBytes());
                outputStream.flush();
                outputStream.close();
                log.info("微信验证成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 服务器事件推送-微信官方说明如下:微信对应文档说明
    在这里插入图片描述
  • 接收微信服务器事件推送接口POST方法,完成此步骤即可实现接受微信的事件推送,具体思路根据微信回调的事件不同进行不同的处理,此处只是举例子不一定要写 注意:此方法为POST
	/**
     * 微信推送事件处理
     *
     * @param request
     * @param response
     */
    @PostMapping(value = "/callback")
    public void Event(HttpServletRequest request, HttpServletResponse response) {

        log.info("==微信推送事件回调处理==");
        //依赖于dom4j 框架自带该依赖包springboot框架中
        SAXReader saxReader = new SAXReader();
        try {
            BufferedReader reader = request.getReader();
            org.dom4j.Document read = saxReader.read(reader);
            Element rootElement = read.getRootElement();
            Iterator iterator = rootElement.elementIterator();
            Map<String, Object> map = new HashMap<>();
            //此步骤主要为了拿到微信回调的xml参数进行map处理方便后续使用
            while (iterator.hasNext()) {
                Element element = (Element) iterator.next();
                map.put(element.getName(), element.getStringValue());
            }
            //获取对应的参数值 需要看具体的字段对应的含义参考上方图片中有
            String ticket = map.get("Ticket") + "";
            log.info("ticket===" + ticket);
            String eventType = map.get("Event") + "";
            log.info("eventType===" + eventType);
            String toUserName = map.get("ToUserName") + "";
            log.info("toUserName===" + toUserName);
            String fromUserName = map.get("FromUserName") + "";
            log.info("fromUserName===" + fromUserName);
            String createTime = map.get("CreateTime") + "";
            log.info("createTime===" + createTime);
            String msgType = map.get("MsgType") + "";
            log.info("msgType===" + msgType);
            //此步骤目前可不要 但后续扫码登录会用到,所以将ticket存储到redis中方便后续调用
            //如未配置redis可暂时删除
            /**if (StrUtil.isNotEmpty(ticket) && !"null".equals(ticket)) {
                log.info(WX_TICKET_KEY_PREFIX + ticket);
                redisService.setCacheMap(WX_TICKET_KEY_PREFIX + ticket, map);
                redisService.expire(WX_TICKET_KEY_PREFIX + ticket,10L,TimeUnit.MINUTES);
            }*/
            //判断是否重复通知
            if (wxMessageKey.exists(fromUserName + "-" + toUserName + "-" + createTime)) {
                log.info(fromUserName+"微信消息通知重复");
                return;
            }
            //如果为事件类型 VIEW 为授权登录无需发送消息通知
            if ("event".equals(msgType)&&!"VIEW".equals(eventType)) {
                List<WxMpKefuMessage> keFuMessages = new ArrayList<>();
                /**处理订阅事件 即用户关注公众号操作*/
                 if("subscribe".equals(eventType)){
                     WxMpKefuMessage subscribeKeFuMessage = new WxMpKefuMessage();
                     subscribeKeFuMessage.setToUser(fromUserName);
                     subscribeKeFuMessage.setMsgType(WX_MESSAGE_TEXT);
                     subscribeKeFuMessage.setContent("欢迎来到优快云 \n\n工作时间:08:30 - 17:30");
                     keFuMessages.add(subscribeKeFuMessage);
                 } else if("unsubscribe".equals(eventType)){
                     //取消关注公众号目前不做记录
                 }
                 //扫码登录后发送客服消息提示文字
                WxMpKefuMessage keFuMessage = new WxMpKefuMessage();
                keFuMessage.setToUser(fromUserName);
                keFuMessage.setMsgType(WX_MESSAGE_TEXT);
                keFuMessage.setContent("您好,您已登录成功!");
                keFuMessages.add(keFuMessage);
                //处理取消订阅消息 此方法具体逻辑在下方
                this.doSendKeFusMessage(keFuMessages);
                log.info("eventType:" + eventType + ",fromUserName:" + fromUserName + ",toUserName:" + toUserName + ",msgType:" + msgType + ",createTime:" + createTime);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	/**
     * 客服接口-发消息
     *
     * @param lstWxMpTemplate
     */
    public void doSendKeFusMessage(List<WxMpKefuMessage> lstWxMpTemplate) {
        WxMpKefuService kefuService = wxMpService.getKefuService();
        for (WxMpKefuMessage news : lstWxMpTemplate) {
            try {
                boolean message = kefuService.sendKefuMessage(news);
                log.info("发送客服消息结果:" + message);
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        }
    }

获取微信accessToken

  • 此处获取accessToken方法具体如下:
 @ApiOperation("获取token")
    @GetMapping("/token")
    public String accessToken() {
        String accessToken = "";
        try {
        	//此处依然为存入redis如不需要可直接忽略
            /**Object token = redisService.getCacheObject(WX_TOKEN_KEY_PREFIX);
            if (token != null) {
                return token.toString();
            }*/
            //这里的accessToken与通过code获取的token不同需存储到缓存留着调用
            WxMpApiUrl.Other getAccessTokenUrl = WxMpApiUrl.Other.GET_ACCESS_TOKEN_URL;
            String url = String.format(
                    getAccessTokenUrl.getPrefix() + getAccessTokenUrl.getPath(),
                    wxMpConfigStorage.getAppId(),
                    wxMpConfigStorage.getSecret());
            accessToken = HttpUtil.get(url);
            JSONObject jsonObject = JSONUtil.parseObj(accessToken);
            if (jsonObject.getStr("access_token") != null) {
                accessToken = jsonObject.getStr("access_token");
               /* redisService.setCacheObject(WX_TOKEN_KEY_PREFIX, accessToken, WX_EXPIRATION, TimeUnit.SECONDS);*/
            }
            log.info("获取token:" + accessToken);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return accessToken;
    }
Java实现基于微信测试公众号授权扫码登录自建项目 如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。请求方法access_token=第三步获取到的access_token&openid=测试公众号的OPENID&lang=zh_CN"sex": 1,三、自建项目:前端二维码生成,后端接口进行登录验证授权。 阅读详情

相关推荐

intellij下使用springboot实现微信公众号回复功能

最近公司原本的公众号要发布3.0版本,所以自己申请了一个微信公众号进行测试,第一步就是实现了通过微信接收信息转发至java后台解析并回复的消息的简单功能,经过一番研究终于实现,现在贡献出代码和大家一起分享。首先百度微信公众平台,进入官网进行公众号的注册,企业可与注册服务号,个人订阅号即可满足大部分功能,申请成功后即可进入到公众平台的相关功能界面自动回复有两种实现方法,一种是平台自带的回复功能,另一种

qq_37485700的博客 3781

手把手教程用Java实现微信公众号扫码登录功能

微信现今是我们必不可少的社交工具了,围绕微信这个生态实际上有很多东西可以做,今天就通过`Java SpringBoot`项目来用微信公众号参数二维码实现扫码登录。实现的方式很多,今天介绍一下我的思路。

黑夜开发者的博客 5261

Java开发微信公众号之被动回复用户消息-回复文本消息

一、前言 小伙伴们,大家好,关于微信系列的文章好久没有更新了,偶尔看到有小伙伴在文末评论说文章太浅显了,想让我写点有进阶性的东西,其实一开始写微信相关文章的目的是帮助更多零基础的微信开发者快速了解、接入、熟悉到微信公众号开发,快速融入到这个环境中,以及学习如何使用当下比较流行的WxJava这一款SDK框架开发我们自己的微信公众号后台,实现一些常用的: 文本消息回复、图片消息回复、自定义菜单、菜单点击事件、以及模板消息推送、自定义带参数二维码流量分销等功能,因此本篇文章将以在接入开发者后,如何使用Java语言

Thinkingcao的专栏 5863

java实现公众号扫码登录和扫码关注(详细)

java后端公众号扫码登录和扫码关注登录,详细步骤,一看就懂。

real_wang_的博客 7519

ANSYS APDL 后处理:用*GET和ETABLE命令把节点/单元应力结果导出到TXT文件(附完整命令流)

本文详细介绍了在ANSYS APDL中使用*GET和ETABLE命令导出节点和单元应力数据到TXT文件的完整方案。通过节点解和单元解的核心逻辑分析,提供了从基础到进阶的数据导出方法,包括节点应力、单元应力数据的提取与格式化输出,以及高级技巧如选择性导出与数据过滤。帮助工程师高效完成有限元分析后处理工作。

weixin_26805597的博客 630

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 704

一扫即入,如何通过微信公众号扫码登录网站?

这篇文章一起聊聊微信公众号二维码登录是怎么回事,它的工作流程是什么,它怎么保证你的身份安全。以及,如果你是一个开发者,如何在自己的网站上增加扫码登录。

未读代码 5991

win10下面安装MTK USB VCOM 驱动

win10下面安装MTK USB VCOM 驱动1.概述2.驱动准备3.主要步骤3.1禁用win10对没有签名驱动限制3.2通过设备管理器安装mtk usb vcom驱动3.3工具版本问题4.禁用win10对没有签名的驱动限制4.1在设置中打开 更新和安全4.2进入恢复4.3在高级启动中点击立即重新启动4.4电脑重启后的几个动作5.通过设备管理器安装MTK USB VCOM 驱动5.1准备驱动5....

qimi123456的专栏 3万+

微信公众号自动回复及多客服功能实现

目录前期准备1、微信公众平台基本设置2、开发所需参数功能步骤1、填写服务器配置2、验证服务器地址的有效性3、依据接口文档实现业务逻辑具体实现1、微信接入2、自定义回复及多客服接入 默认微信公众平台对公众号的自动回复、多客服等功能都是可以直接使用的。 但是由于一些因素(扫码登录)开放了微信公众号接口,导致以上功能需要自己对接,无法直接使用平台提供的功能。 以下是我对公众号自动回复和多客服实现的一些心得。 效果: 前期准备 1、微信公众平台基本设置 公众号官网:https://mp.weixin.qq.com

Mr_Wanter 3710

机器视觉避坑指南:为什么你的Halcon划痕检测总漏检?(附优化方案)

本文深入剖析了Halcon在表面划痕检测中漏检率高的常见原因,如灰度值波动、噪声干扰及形态学参数设置不当。针对复杂背景与低对比度划痕,提出了超越官方例程的多尺度纹理分析与特征融合优化方案,旨在帮助开发者构建更鲁棒、稳定的机器视觉检测流程,有效提升检出率。

weixin_29057163的博客 234

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2354

《微信开放平台与Java:微信公众号扫码登录、发送模板消息》

本文介绍了基于Java和Spring Boot实现微信公众号扫码登录及模板消息发送功能的完整方案。文章首先对比了不同类型公众号的权限差异,建议使用微信测试号进行开发学习。详细讲解了服务器配置、内网穿透、接口验证等前期准备工作,并提供了项目依赖配置和工具类实现。核心功能包括:1)通过微信API生成带场景值的临时二维码;2)使用Guava Cache缓存access_token和用户openid;3)扫码事件触发后发送模板消息通知。技术实现上采用Retrofit调用微信API,XStream处理XML消息。

2302_79380280的博客 1228

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

qq_40073899的博客 559

微信公众号消息推送,自动回复

里面的key需要换成自己在高德申请的,当然也可以用过百度,腾讯等等都可以,这里用的就是根据经纬度获取当前地址。还能设置回复很多消息,都是聪明人,自己搞吧,定时任务刚写完,下载的可以进行更新代码。下面的俩都是api接口官网,可以自己去申请,都有好多免费的api接口。这里使用的是高德地图的接口,使用的目的是。,经纬度获取用的就是微信公众号申请的定位。里面找,代码复制就可以进行使用。推送天气的接口改为输入关键字推送。点击登录,然后扫码登录就行。如果使用人数多,可以使用。

重生之我不会写代码 5704

基于STM32XX的LCD液晶显示屏(HS19264G06A、驱动芯片:ST7525)驱动C程序设计

define USE_HW_SPI 1 // 1:使用硬件SPI, 0:使用软件模拟SPI。

myron6688的博客 234

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

微信公众号扫码登录对接

源码地址:https://github.com/zzxx1234/webchat-server.git。

zznnniuu的博客 1319

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

微信小程序生态8-基于weixin-java-mp实现微信公众号被动回复消息

在微信里有这样一个公众号【华为运动健康】,当点击最新排行的时候,公众号就会发送今天最新的运动步数给你。如下图:这里有两种格式的消息1、有头像框,有聊天框——普通消息2、消息有样式、颜色等——模板消息本篇文章主要介绍的就是如何让微信公众号自动回复消息参考文档链接:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html开发之前,给大家介绍一个weixin-java-to

summon的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java微信群自动回复_手把手教大家快速构建自动回复机器人

聊天机器人可以说在我们生活中的应用非常普遍了。它们依托于互联网资源,回答用户的日常问题,或者主动提醒和推荐。比如,苹果的Siri,微软的Cortana这种的语音机器人;又或者购物时常见的机器人客服。如果你想自己做一个自动回复的聊天机器人,赶紧看过来!@小丁老师今天给大家分享快速构建自动回复机器人的技术心得今天给大家介绍一个比较有意思的开源包wxpy,可用来实现微信号的自动回复操作。01进...

weixin_39989215的博客 3091

JAVA图灵 自动回复_微信测试号开发之六 图灵自动回复文本消息

原文:https://blog.youkuaiyun.com/qq_37936542/article/details/78553525介绍:使用图灵机器人来自动回复文本类的消息(一):图灵官网注册、登录,然后获取key值(key是调用图灵回复接口的必须参数)官网网址:http://www.tuling123.com/登录后进入机器人设置,找到APIkey(二):编写实现回复的代码importcom.faste...

weixin_33821493的博客 287

JAVA 实现微信公众号的生成带参数二维码和扫码后被动回复消息

公司新需求实现带参数二维码和对应扫码后回复相应信息的功能。 1.实现带参数二维码功能 public class QrTest { private static Logger logger = LogManager.getLogger(QrTest.class); private final static String subPlatform = "prod1"; private final static String appid = "11111111111111111111

weixin_31172555的博客 5333

微信公众号开发实战:从接入到消息回复一文搞定

本文是一份快速入门微信公众号开发的实战指南,主要包含以下内容: 公众号类型选择建议(服务号/订阅号) 开发前准备:注册配置、服务器设置 核心开发流程: 接入验证(含完整Java代码实现) 消息接收与回复处理(文本/图片/图文) 自定义菜单创建 模板消息发送 网页授权获取用户信息 主动消息推送 关键注意事项: AccessToken缓存机制 常见问题解决方案 消息加解密配置 文章采用代码驱动的方式,提供可直接运行的Spring Boot实现代码,涵盖微信公众号开发的主要接口,帮助开发者快速搭建基础功能框架。

2603_95882547的博客 1489

java微信公众号自动回复a标签

Java微信公众号自动回复a标签 在现代社交网络中,微信已经成为人们日常生活中必不可少的一个通讯工具。微信公众号是一个很有用的功能,可以让用户获取信息、参与互动等。其中,自动回复是微信公众号的一个很重要的功能,可以让公众号更智能、更便捷地回复用户的消息。 本文将介绍如何使用Java编写一个自动回复微信公众号消息的程序,实现...

weixin_40662385的博客 382
上一篇: 关于List添加对象重复问题/list内参数被修改引用地址
下一篇: Spring Cloud/Boot启动报错Consider defining a bean of type ServerCodecConfigurer
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值