目的

本次实现的目的是:在微信公众号项目中,可能在每次访问页面的时候需要带上openid或者授权,查数据库太耗性能、多次多个地方去调授权接口也不是最佳的方案,如果能利用拦截器拦截到每次请求访问后台,这个时候在拦截器里判断是否已经有这个粉丝的openid,如果获取到了openid,就不用去走授权获取用户信息接口了,那么从哪里取这个openid呢,可以从Redis或其他缓存库里取,我使用了的拦截器处理:从Session里去取openid,取openid的前提是在第一次授权获取用户信息后,你需要将openId存到session里去,然后每次请求拦截器会拦截相关Api请求,从session中获取openid,然后判断openid,以此来做业务判断,如果获取不到就去走授权接口;

一、实现

  1.创建一个拦截器,拦截器配置如下,对拦截器不熟悉的请看:如何自定义一个拦截器

    在spring-mvc.xml文件中新增一个拦截器  (注:如果是SpringBoot项目,请按照SpringBoot创建拦截器方式创建拦截器)

 <!-- 拦截器配置,拦截顺序:先执行后定义的,排在第一位的最后执行。--><mvc:interceptors>   <!-- 微信授权拦截器   --><mvc:interceptor><mvc:mapping path="/mobile/**" /><bean class="com.thinkgem.jeesite.modules.sys.interceptor.WXOAuthInterceptor" /></mvc:interceptor>      </mvc:interceptors>

  2.新建一个拦截器类WXOAuthInterceptor

  WXOAuthInterceptor.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import com.thinkgem.jeesite.common.service.BaseService;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.wechat.service.WXOAuthService;/*** 微信* * <pre>*   * @author cao_wencao  * @date 2018年8月13日* </pre>*/
@Slf4j
public class WXOAuthInterceptor extends BaseService implements HandlerInterceptor {@Autowiredprivate WXOAuthService wXOAuthService;@Override@Transactional(readOnly = false)public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {        // 获取 seesion openidlog.warn("==============执行顺序: 1、preHandle================");String openid = (String) request.getSession().getAttribute("openid");if (StringUtils.isNotBlank(openid)){return true;}String code = request.getParameter("code"); // 获取参数中 的 code 参数if (StringUtils.isNotBlank(code)) {wXOAuthService.userInfo(request, response);} else {wXOAuthService.oauth(request, response);}return true;}@Override@Transactional(readOnly = false)public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {log.warn("==============执行顺序: 2、postHandle================");
//      request.getSession().setAttribute("openid", "oJIGa0RLwXB8r5vxYphyKCOQGxz1"); // 设置 Session Openid//     // 获取 seesion openid}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {log.warn("==============执行顺序: 3、afterCompletion================");}}

   

3.授权接口服务类WXOauthService

注:WXOauthService中userInfo方法为请求授权接口,在请求授权获取用户信息后需要将openid存进session里去,这样在拦截器中才可以取到粉丝的openid

import java.io.IOException;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.app.entity.user.Follow;
import com.thinkgem.jeesite.modules.app.service.user.FollowService;
import com.thinkgem.jeesite.modules.app.service.user.MemberService;
import com.thinkgem.jeesite.modules.wechat.receiveVo.FansVo;/*** 网页授权 服务* @author caowencao**/
@Service
@Transactional(readOnly = true)
public class WXOAuthService {private static final Logger logger = LoggerFactory.getLogger(WXOAuthService.class);@Autowiredprivate WxMpService wxMpService;@Autowiredprivate FollowService followService;@Autowiredprivate MemberService memberService;/*** 网页授权* @param request* @param response* @throws IOException */public void oauth(HttpServletRequest request, HttpServletResponse response) throws Exception{String backUrl = request.getRequestURL().toString();  //取得当前 URLString redirectUri = wxMpService.oauth2buildAuthorizationUrl(backUrl, WxConsts.OAuth2Scope.SNSAPI_USERINFO,"1");logger.info("redirectUri地址={}", redirectUri);// 日志response.sendRedirect(redirectUri);}/*** 获取用户信息* @param request* @param response* @throws IOException */@Transactional(readOnly = false)public void userInfo(HttpServletRequest request, HttpServletResponse response) throws Exception{String code = request.getParameter("code");if(StringUtils.isBlank(code))oauth(request, response);   //继续授权// 通过code换取access tokenWxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();String openId = null;try {wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);openId = wxMpOAuth2AccessToken.getOpenId();logger.info("openId={}", openId);String lang = "zh_CN";WxMpUser wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, lang);// TODO 操作保存用户信息到数据库// 保存通过授权拿到的用户信息followService.saveOauthFollowInfo(wxMpUser);
//            Follow follow = followService.findFollowByOpenId(openId);
//            if (null == follow && null != wxMpUser) {
//                // 保存通过授权拿到的用户信息
//                followService.saveOauthFollowInfo(wxMpUser);
//            }logger.info("网页授权获取用户信息 :" + wxMpUser.toString());FansVo fans = new FansVo();// 获取粉丝账号String account =  memberService.getAccountByOpenid(openId);if (!StringUtils.isBlank(account)) {fans.setAccount(account);fans.setOpenid(openId);}           request.getSession().setAttribute("fans", fans); //  session中设置粉丝账号和openidrequest.getSession().setAttribute("openid", openId); //设置 Session Openid}catch (WxErrorException e) {logger.error("【微信网页授权】{}", e.getMessage());oauth(request, response);throw new RuntimeException("网页授权失败!");}}}

好了,到这里使用拦截器获取微信openID、授权获取用户信息就实现了,像这样封装复用性比较高;

Java微信公众号开发之使用拦截器获取粉丝openID相关推荐

  1. 微信openid绑定java,微信公众号支付(一)如何获取用户openId

    一.获取apikey,appsecret与商户号 注册公众号.商户号 二.获取用户的OpenId 1.设置[授权回调页面域名] 官方解释:用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回 ...

  2. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  3. java微信公众号开发token验证失败的问题及解决办法

    java微信公众号开发token验证失败的问题及解决办法 参考文章: (1)java微信公众号开发token验证失败的问题及解决办法 (2)https://www.cnblogs.com/beardu ...

  4. Java微信公众号开发梳理

    Java微信公众号开发梳理 现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.因此做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说 ...

  5. Java微信公众号开发微信网页授权之前端传递code方式获取用户信息

    本片博客讲解的网页授权分为两步,前端先传递backUrl(回调地址)到后台网页授权接口,该接口拿到回调地址后组装授权连接,重定向到前端页面,前端页面截取Code,传入后端获取用户信息方法,获取用户信息 ...

  6. Java微信公众号开发(一:接入平台,验证token)

    Java微信公众号开发(一:接入平台,验证token) 开发环境: 环境:JDK1.8 框架:springBoot 首先,在我们接入微信公众平台之前,我们需要注册微信公众号的开发者账号,获取开发者ID ...

  7. JAVA微信公众号开发第8篇JSSDK图片上传预览

    简介 博主微信JSSDK&图片上传预览基于微信分享做拓展,所以一些配置操作请点击查阅JAVA微信公众号开发第7篇JSSDK&微信分享博文 页面 <html><head ...

  8. 急急急求微信公众号开发接口-php如何实现获取用户发送的微信表情,并返回一个链接,用户点击进去链接就是刚才发的表情,用户可以保存表情?

    求微信公众号开发接口-php如何实现获取用户发送的微信表情,并返回一个链接,用户点击进去链接就是刚才发的表情,用户就可以保存表情到手机? 需求描述 1.用户在公众号对话框发送微信表情(GIF) 2.公 ...

  9. Java微信公众号开发之网页授权获取用户基本信息

    本篇博客讲解的网页授权只需要前端传递一个backUrl(回调地址) 到后台接口,后台接口会完成整个授权流程,无需前端做更多工作: 一. 前言 微信公众号开发,需要用到网页授权获取用户信息,通过OAut ...

最新文章

  1. Java基础super关键字、final关键字、static关键字、匿名对象整理
  2. PMCAFF携手百度,干货从未如此精彩(现场快讯)
  3. 快看!你连接世界的新入口,在那朵云上
  4. JSON.stringify()中文乱码
  5. Django(part50)--Web请求认证
  6. oracle账号密码修改后特别容易锁定_Oracle数据库用户锁定原因以及处理方式(ORA-28000)...
  7. PHP留言板之提交留言
  8. 日常网页bug页面收集
  9. cataclysm【题解】【考试】
  10. web of science /pubmed主要可检索字段
  11. java 水晶按钮_报告水晶报告没有复制按钮
  12. 在2016年,Linux是否还需要Windows的支持呢
  13. 新浪微博回调地址redirect_url(授权回调页)的设置格式
  14. EDK2编译报错,请帮我看看这个是什么错误
  15. 几个连接虚拟机和云服务器的软件
  16. 用html做完整网页效果
  17. NEO4J-链路预测算法03-优先链接算法(Preferential Attachment)应用场景简介
  18. 红蓝对抗——蓝队手册
  19. 电大计算机阅读英语作文,电大 英语网考翻译题库(绝对有命中题)
  20. 控制台三角形星号及巴基斯坦国旗

热门文章

  1. 扬州宇安电子 招聘FPGA逻辑工程师
  2. 转:DSP28335使用FIFO的串口中断总结
  3. 微信小程序开发文档——开放能力
  4. 2017年蓝桥杯C组真题及解析
  5. ACCESS表达式中的叹号“!”和点号“.”的区别
  6. java财务管理源代码_java 个人财务管理系统 入门级源码
  7. 史上最全的BAT Mysql面试题在这里
  8. 幂迭代(power iterations)算法
  9. ABP中使用MySql数据库
  10. ASM(五) 利用TreeApi 解析生成及转换Class