请通过浏览器功能收藏网页

java处理公众号(服务号)获取用户的Openid拦截框架 公众号开发

发布时间:2018-06-20 14:12:02  作者:本站编辑  来源:本站原创  浏览次数:
www.javainfo.com.cn 上干货 欢迎收藏

框架思路如图:

微信服务号截取框架.jpg


函数献上: 

1  定义过滤器 处理每条请求  将没有OPENID的转到接口调用上,存在OPENID的放行;

 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,

ServletException {

  System.out.println("local");

   HttpServletRequest hRequest = (HttpServletRequest) request;

   String openid = (String) hRequest.getSession().getAttribute("openid");

   //前台没有OPENID的情况

   if("".equals(openid) || null == openid){

   // 获取请求路径

   String contextPath = hRequest.getContextPath();           

String resultUrl = hRequest.getRequestURL().toString();

//附加路径携带的参数

String param = hRequest.getQueryString();

if (param != null) {

resultUrl += "?" + param;

}

try {

resultUrl = java.net.URLEncoder.encode(resultUrl, "utf-8");

} catch (Exception e) {

e.printStackTrace();

}

((HttpServletResponse) response).sendRedirect(contextPath +                     "/wxpasser/userEnter.jspx?returnBackUrl="+ resultUrl);

return;

   }else{    

     log.error(openid + "-->>"+  hRequest.getRequestURL().toString()   );

     System.out.println("拥有OPENID 信息 ,放行");

         chain.doFilter(request, response);

   }

}


2 有OPENID的放行,系统根据OPENID记录其行为,没有OPENID的  转到微信接口调用  

        /**

* 拼接URI  登录验证跳转  格式化URL

* @param request

* @param response

* author WJ 

*/

@RequestMapping(value = "/wxpasser/userEnter.jspx", method = RequestMethod.GET)

public void userEnter(HttpServletRequest request, HttpServletResponse response,ModelMap model) {

try {

// 获取回调界面的URI //此URI 已经 encode

String returnBackUrl = request.getParameter("returnBackUrl");

String uri = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

//替换请求信息

uri = uri.replace("APPID", WeixinUtil.AppID);

uri = uri.replace("REDIRECT_URI", WeixinUtil.urlEncode(WeixinUtil.backAuthUri + "?returnBackUrl=") + returnBackUrl); // 需要encoder

uri = uri.replace("SCOPE", "snsapi_base"); // 用户基础信息

uri = uri.replace("STATE", "123456");

// 获取用户授权 并添加跳转URL

response.sendRedirect(uri);

} catch (IOException e) {

e.printStackTrace();

}

}


3 编写回调函数

  

         /**

* 获取微信用户的 信息 , 只有第一次登录的时候 才会走此验证

* @throws Exception 

*/

@RequestMapping(value = "/wxpasser/oauth.jspx", method = RequestMethod.GET)

public void weixinOAuth(HttpServletRequest request, HttpServletResponse response ,ModelMap model) throws Exception {


// 获取传递过来的 回调界面的URI

String returnBackUrl = request.getParameter("returnBackUrl");

//System.out.println("/wxpasser/oauth= "+returnBackUrl);

//用户验证结果     如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE

String code = request.getParameter("code");

//String state = request.getParameter("state");

//System.out.println("code="+ code +" ;state=" + state); 

//获取用户授权码后  获取用户信息

        String userAcOpenid = WeixinUtil.getUserInfoAccessToken(WeixinUtil.AppID, WeixinUtil.Secret, code);

//System.out.println("openId=" + userAcOpenid.split("=")[1]);

//System.out.println("========================================");

//已经得到了OPENID   保存在服务器端 

request.getSession().setAttribute("openid", userAcOpenid.split("=")[1]);

                //重定向到原申请URI

response.sendRedirect(returnBackUrl);

}


4 至此整个服务号的接口调用 获取OPENID的过程就完成了




如有疑问 请留言 欢迎提供建议

评论已有 0