/** * 微信WEB辅助类,需要微信用户参与的页面可以继承此类解决授权问题 * Created by yangyan on 2015/6/4. */ public class WeChatUserSupportController { Logger log = LoggerFactory.getLogger(WeChatUserSupportController.class); /** * 微信授权用户的TOKEN存储在session中的key */ public static final String SESSION_KEY_USER_TOKEN = "wx_token"; @Autowired WeChat weChat; @Autowired WeChatApp weChatApp; /** * 判断当前访问微信用户是否授权 * * @return */ protected boolean isAuthed() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); Object attribute = request.getSession() == null ? null : request.getSession().getAttribute(SESSION_KEY_USER_TOKEN); return attribute != null; } /** * 获取当前微信授权微信用户的token * * @return */ protected UserAccessToken getToken() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); Object attribute = request.getSession() == null ? null : request.getSession().getAttribute(SESSION_KEY_USER_TOKEN); return (UserAccessToken) attribute; } /** * 获取当前微信用户的OpenId * * @return */ protected String getOpenId() { UserAccessToken token = this.getToken(); if (token != null) { return token.getOpenid(); } return null; } /** * 授权只获取用户的openId时使用此方法跳转 * * @param redirectUrl * @param state * @return */ protected ModelAndView baseAuth(String redirectUrl, String state) { String authorizationBaseUrl = weChat.getUserApi().getAuthorizationBaseUrl(redirectUrl, state); return new ModelAndView(new RedirectView(authorizationBaseUrl, false)); } /** * 授权需要获取用户的OpenId和基本信息时使用此方法调转 * * @param redirectUrl * @param state * @return */ protected ModelAndView userAuth(String redirectUrl, String state) { String authorizationBaseUrl = weChat.getUserApi().getAuthorizationUserInfoUrl(redirectUrl, state); return new ModelAndView(new RedirectView(authorizationBaseUrl, false)); } /** * 此方法的功能是使用code换取微信用户的token,然后将token保存在用户的session中。应该在自己的HTTP请求处理方法中构造callback,然后调用此方法 * * @param state * @param code * @param callback * @return */ protected ModelAndView callbackAuth(String code, String state, OAuthCallback callback) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse(); UserAccessToken accessToken = null; if (callback == null) { try { response.getWriter().print("Error,callback is required"); } catch (IOException e) { e.printStackTrace(); } } if (StringUtils.isNotBlank(code)) { try { accessToken = weChat.getUserApi() .getAccessToken(code); } catch (Exception e) { log.error("微信用户授权发生异常", e); return callback.failure(request, response, state, new AppException("微信用户授权时发生异常", e)); } } if (accessToken != null) { request.getSession(true).setAttribute(SESSION_KEY_USER_TOKEN, accessToken); return callback.success(request, response, state); } else { return callback.failure(request, response, state, null); } } /** * 授权结果回调处理抽象类,不同场景下的授权回调处理应该继承此类根据不同的场景做处理 */ public static abstract class OAuthCallback { /** * 授权成功的时候进入此方法执行 * * @param state 授权返回时带有的参数 * @return 跳转到什么地方 */ public abstract ModelAndView success(HttpServletRequest request, HttpServletResponse response, String state); /** * 授权失败的时候进入此方法执行 * * @param state 授权返回时带有的参数 * @param exception 授权抛出的异常 * @return 跳转到什么地方 */ public abstract ModelAndView failure(HttpServletRequest request, HttpServletResponse response, String state, AppException exception); } }
了解 工作生活心情记忆 的更多信息
Subscribe to get the latest posts sent to your email.