首页 > 代码库 > 微信企业号OAuth2验证接口实例(使用SpringMVC)
微信企业号OAuth2验证接口实例(使用SpringMVC)
微信企业号OAuth2验证接口(使用SpringMVC)
企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0来获取员工的身份信息。
注意,此URL的域名,必须完全匹配企业应用设置项中的‘可信域名‘,否则获取用户信息时会返回50001错误码。
可信域名设置不包含"http://",只需域名或IP即可。
OAuth2验证可以使用多种方式,此处使用注解方式。设计思路是在需要获取用户信息的GET请求上添加注解,然后在调用的时候判断是否包含此注解,然后做处理流程。
每次请求包含2种情况:
1.不需要获取用户信息,直接跳转到指定视图;
2.需要获取用户信息,此处分2种情况:
a.session中存储了之前获取的用户信息,则直接跳转到指定视图;
b.session中不包含用户信息,则需要构造带回调参数的URL去微信API服务器获取code参数,然后通过code参数调用API换取Userid并保存到session,然后再次跳转到初始请求的视图页面。
验证OAuth2注解OAuthRequired
常量类,此处可以替换为持久化数据读取;
OAuth2 处理控制器OAuth2Controller
企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0来获取员工的身份信息。
注意,此URL的域名,必须完全匹配企业应用设置项中的‘可信域名‘,否则获取用户信息时会返回50001错误码。
可信域名设置不包含"http://",只需域名或IP即可。
OAuth2验证可以使用多种方式,此处使用注解方式。设计思路是在需要获取用户信息的GET请求上添加注解,然后在调用的时候判断是否包含此注解,然后做处理流程。
每次请求包含2种情况:
1.不需要获取用户信息,直接跳转到指定视图;
2.需要获取用户信息,此处分2种情况:
a.session中存储了之前获取的用户信息,则直接跳转到指定视图;
b.session中不包含用户信息,则需要构造带回调参数的URL去微信API服务器获取code参数,然后通过code参数调用API换取Userid并保存到session,然后再次跳转到初始请求的视图页面。
具体处理流程如下图:
此处源码包括:微信企业号的接入及消息的简单处理,在此基础上添加OAuth2的验证实例。
源码下载地址:http://download.csdn.net/detail/rzg813/8015527
具体实现代码:
创建拦截器:OAuth2Interceptor
package org.oms.qiye.interceptor; import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class OAuth2Interceptor implements HandlerInterceptor { /** * 在DispatcherServlet完全处理完请求后被调用 * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("**执行顺序: 3、afterCompletion**"); } /** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView modelAndView) throws Exception { System.out.println("**执行顺序: 2、postHandle**"); } /** * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链, * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion() */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("**执行顺序: 1、preHandle**"); String url = request.getRequestURL().toString(); HttpSession session = request.getSession(); // 先判断是否有注解 HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); OAuthRequired annotation = method.getAnnotation(OAuthRequired.class); if (annotation != null) { System.out.println("OAuthRequired:你的访问需要获取登录信息!"); Object objUid = session.getAttribute("UserId"); if (objUid == null) { String resultUrl = request.getRequestURL().toString(); String param=request.getQueryString(); if(param!=null){ resultUrl+= "?" + param; } System.out.println("resultUrl="+resultUrl); try { resultUrl = java.net.URLEncoder.encode(resultUrl, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //请求的路径 String contextPath=request.getContextPath(); response.sendRedirect(contextPath + "/oauth2.do?resultUrl=" + resultUrl); return false; } } return true; } }
验证OAuth2注解OAuthRequired
package org.oms.qiye.interceptor; import java.lang.annotation.*; /** * 验证OAuth2注解 * @author Sunlight * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface OAuthRequired { }
常量类,此处可以替换为持久化数据读取;
package org.oms.qiye.util; public class Constants { /** * 常量说明: * 此处定义的常量需要持久化,可以保存在数据库中,在需要的地方读取。 * 在多企业号中,最好以每个应用来定义。 */ public static final int AGENTID = 1; public static final String TOKEN = "sunlight"; public static final String CORPID = "你的企业号ID"; public static final String ACCESS_TOKEN = "你的企业号_ACCESS_TOKEN"; public static final String encodingAESKey = "s8vFF4f6AWay3uAdJh79WD6imaam4BV6Kl4eL4UzgfM"; }
OAuth2 处理控制器OAuth2Controller
package org.oms.qiye.web; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.oms.qiye.pojo.AccessToken; import org.oms.qiye.util.Constants; import org.oms.qiye.util.QiYeUtil; import org.oms.qiye.util.Result; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; /** * OAuth2 处理控制器 * @author Sunlight * */ @Controller public class OAuth2Controller { /** * 构造参数并将请求重定向到微信API获取登录信息 * * @param index * @return */ @RequestMapping(value = http://www.mamicode.com/{ "/oauth2.do", "/oauth2" })>
需要验证OAuth2控制器UserControllerpackage org.oms.qiye.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.oms.qiye.interceptor.OAuthRequired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** * 需要验证OAuth2控制器 * @author Sunlight * */ @Controller public class UserController { /** * 加载个人信息,此处添加了@OAuthRequired注解 * @param model * @return */ @RequestMapping(value=http://www.mamicode.com/{"/userInfo.do"})>
发起https请求并获取结果HttpRequestUtil.class微信企业号调用类 {"errcode":0,"errmsg":"ok"} 此结果表示调用方法成功返回QiYeUtil.class
返回结果处理类Result.class
枚举EnumMethod.class
以上类不在列出,在其他文章已存在!
处理页面user.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Model And List</title> </head> <body> <h1>Welcome To SpringMVC! This is OAuth2 UserInfo</h1> <h3>获取到的Userid是:${UserId}</h3> </body> </html>
SpringMVC配置文件:mvc-servlet.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <context:component-scan base-package="org.oms.qiye.web"></context:component-scan> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value=http://www.mamicode.com/"/WEB-INF/jsp/">>服务器测试结果图:
手机微信客户端测试结果图:
转载请注明出处,以免惨不忍睹!
技术交流请加入QQ群:点击链接加入群【微信企业号开发交流】:http://jq.qq.com/?_wv=1027&k=RgbtOX
QQ群:89714226
微信企业号OAuth2验证接口实例(使用SpringMVC)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。