1、微信公众号配置类,采用springboot配置文件存储相关信息和密钥


@ConfigurationProperties(prefix = "wx.offiaccount")
@Component
@Slf4j
public class WxConfig {private String appSecret;//开发者密码(AppSecret)private String appId;//开发者ID(AppID)private String token;//令牌(Token)private String accessToken;private List<String> ipList;@Autowiredprivate RestTemplate restTemplate;@PostConstructpublic void init(){refreshAccessToken();refreshIPAddress();}public void refreshAccessToken(){String url = "https://api.weixin.qq.com/cgi-bin/token?";String grant_type = "client_credential";ResponseEntity<Map> responseEntity = restTemplate.getForEntity(url + "grant_type=" + grant_type + "&appid=" + appId + "&secret=" + appSecret, Map.class);Map body = responseEntity.getBody();accessToken = (String) body.get("access_token");log.info("accessToken refresh:{}",accessToken);}public void refreshIPAddress(){String url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?";ResponseEntity<Map> res = restTemplate.getForEntity(url + "access_token=" + accessToken, Map.class);Map body = res.getBody();List<String> ips = (List<String>) body.get("ip_list");log.info("ip address:{}",ips);ipList = ips;}public void setAppSecret(String appSecret) {this.appSecret = appSecret;}public void setAppId(String appId) {this.appId = appId;}public void setToken(String token) {this.token = token;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public String getAppSecret() {return appSecret;}public String getAppId() {return appId;}public String getToken() {return token;}public String getAccessToken() {return accessToken;}public List<String> getIpList() {return ipList;}public void setIpList(List<String> ipList) {this.ipList = ipList;}
}
accessToken有效期两个小时,项目启动后用@PostConstruct注解实现启动后自动执行初始化,可以用定时任务刷新,回调ip同理

2、接收微信回调消息,微信回调采用xml格式数据

@ApiOperation("接收微信返回消息")@RequestMapping(value = "/getMsg",method = {RequestMethod.GET,RequestMethod.POST})public String msg(@RequestParam Map<String,String> param, HttpServletRequest request) throws IOException, DocumentException {String ip = ServletUtil.getClientIP(request);if (!wxConfig.getIpList().contains(ip)){log.info("非法IP:{}",ip);return "回调IP非法";}ServletInputStream inputStream = request.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = null;StringBuffer xmlData = new StringBuffer();while ((s = bufferedReader.readLine()) != null ){xmlData = xmlData.append(s);}log.info("微信消息:{}",param);log.info("微信推送:{}",xmlData);Document document = DocumentHelper.parseText(xmlData.toString());Element rootElement = document.getRootElement();Iterator iterator = rootElement.elementIterator();HashMap<String, String> msg = new HashMap<>();while (iterator.hasNext()){Element element = (Element) iterator.next();log.info("解析xml参数:key=>{},value=>{}",element.getName(),element.getTextTrim());msg.put(element.getName(),element.getTextTrim());}log.info("解析xml参数map:{}",msg);String openId = msg.get("FromUserName");String event = msg.get("Event");String eventKey = msg.get("EventKey");//关注行为 排除非扫码关注的情况:无eventKeyif (WXEventEnum.SUBSCRIBE.getValue().equals(event) && StringUtils.isNotEmpty(eventKey)){String content = "公众号关注成功";wxApi.sendMsg(content,openId);//设置关注后的状态为1LambdaQueryWrapper<UserEntity> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(UserEntity::getOpenId,openId);int count = authService.count(queryWrapper);if (count > 0){LambdaUpdateWrapper<UserEntity> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(UserEntity::getOpenId,openId).set(UserEntity::getWxSubscribe,BooleanEnum.TRUE.getCode());authService.update(updateWrapper);}redisTemplate.opsForValue().set(eventKey, openId, ConstantPool.QRSCENE_TIME, TimeUnit.MINUTES);}//扫码行为if (WXEventEnum.SCAN.getValue().equals(event)){redisTemplate.opsForValue().set(ConstantPool.QRSCENE + eventKey, openId, ConstantPool.QRSCENE_TIME, TimeUnit.MINUTES);}//取关  清除openIdif (WXEventEnum.UNSUBSCRIBE.getValue().equals(event)){LambdaUpdateWrapper<UserEntity> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(UserEntity::getOpenId,openId).set(UserEntity::getWxSubscribe,BooleanEnum.FALSE.getCode());authService.update(updateWrapper);}//1)将token、timestamp、nonce三个参数进行字典序排序// 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。//timestamp   时间戳//nonce  随机数//echostr    随机字符串
//        String timestamp = param.get("timestamp");
//        String nonce = param.get("nonce");
//        String signature = param.get("signature");
//        String echostr = param.get("echostr");
//        ArrayList<String> list = new ArrayList<>();
//        list.add(wxConfig.getToken());
//        list.add(timestamp);
//        list.add(nonce);
//        log.info("排序前{}",list);
//        Collections.sort(list);
//        //2)将三个参数字符串拼接成一个字符串进行sha1加密
//        String ecryptStr = DigestUtils.sha1Hex(list.get(0) + list.get(1) + list.get(2));
//        log.info("加密后参数:{}",ecryptStr);
//        //3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信signature
//        if (StringUtils.equals(ecryptStr,signature)) {
//            log.info("参数相同");
//            return echostr;
//        }return null;}

消息接收枚举类

public enum WXEventEnum implements BaseEnum{SUBSCRIBE(0,"subscribe"),//订阅UNSUBSCRIBE(1,"unsubscribe"),//取消订阅SCAN(2,"SCAN") //扫码;private int code;private String value;WXEventEnum(int code, String value) {this.code = code;this.value = value;}public String getValue(){return this.value;}@Overridepublic int getCode() {return this.code;}
}

java关注微信公众号登录相关推荐

  1. 基于 Java Spring Security 的关注微信公众号即登录的设计与实现 ya

    太长不看版本 本文通过一个实际的具有一定商业价值的项目,展示了 API 优先的开发方法.通过薅羊毛的方式,落地了 Free Arch 架构. 背景和价值 通过微信公众号积累粉丝并进行商业活动宣传,是新 ...

  2. Java 扫描微信公众号二维码,关注并自动登录网站

    场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: 1.系统生成带参数(此参数自定义为唯一值)的临时二维码(微信公众平台有提供该接口,可查看一下开发文档): 2.用户使 ...

  3. Java实现微信公众号扫描二维码未关注时跳转关注界面已关注跳转业务界面

    以下只是测试代码写得不太整齐规范,但是主要思路以及要注意的都写了: 前提:需要申请认证的微信公众号:获取对应的APPID和APPSECRET:并且还需要获取到用户信息权限(点击"修改&quo ...

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

    文章目录 前言 一.环境准备 二.使用步骤 1. 使用微信工具包 2. 创建数据表 3. 登录页面代码逻辑 4. 验证微信公众号登录 总结 前言 微信现今是我们必不可少的社交工具了,围绕微信这个生态实 ...

  5. WordPress插件-Erphp Weixin Scan关注微信公众号一键登录网站

    介绍: Erphp Weixin Scan是某板兔开发的一款关注微信公众号一键登录网站的WordPress插件. 目前只有认证的服务号有生成带参数的二维码接口权限(注意不要使用测试号,测试号虽然有服务 ...

  6. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  7. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  8. .NET C#使用微信公众号登录网站

    这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下 适用于:本文适用于有一定微信开发基础的用户 引言:花了300大洋申请了微信公众平 ...

  9. Java实现微信公众号客服功能和本地联调

    Java实现微信公众号客服功能 微信公众平台设置 生产环境 公众号 设置 [开发]–> [基本配置]–> [服务器配置] 注: a.服务器地址(URL) 是开发者用来接收微信消息和事件的接 ...

最新文章

  1. R绘制堆叠的密度图(Stacked Area Chart)
  2. java中1代表什么_请问java中81是什么意思?
  3. Java Web知识梳理
  4. 皮一皮:看看地铁有多挤...
  5. 皮一皮:直男这下懂了吧...
  6. Iterator 和 Iterable的区别
  7. virtuoso从电路图导入版图_基于Virtuoso 平台的单片射频收发系统电路仿真与版图设计...
  8. [Java拾遗三]JavaWeb基础之Servlet
  9. 拍个自拍,让Python告诉你,军训过后你黑了几度?
  10. debian/deepin 15.3 15.4安装jdk 1.7 (或jdk 7),配置默认环境
  11. fastdfs上传文件时候报错
  12. shocked的歌曲 类似shell_Shell Shocked
  13. 第五十节,面向对象基本介绍
  14. 95-190-450-源码-window-Trigger-ContinuousProcessingTimeTrigger
  15. SQL:postgresql查询七天内数据
  16. ipq4019 识别板卡型号的过程
  17. Facebook努力回归中国,微博会被人们放弃吗?
  18. Lesson 12 Goodbye and good luck 再见,一路顺风
  19. 计算机专业国际竞赛,国际计算机竞赛深度剖析
  20. python运势预测程序_运势.py · Scar/Python-Spider - Gitee.com

热门文章

  1. 白乔原创:实战软件DIY
  2. win10如何显示我的电脑在桌面
  3. vnc远程工具的使用教程
  4. maven下载jar包时lastUpdated问题
  5. 初步使用计算机的教学反思,静夜思教学反思(精选10篇)
  6. C++模板与泛型编程:模板特例化
  7. LeetCode 416分割等和子集
  8. jstack 命令使用经验总结和线程性能诊断脚本
  9. 学习笔记 JavaScript 动画
  10. python网络爬虫学习的汇总