java处理公众号(服务号)获取用户的Openid拦截框架 公众号开发
框架思路如图:
函数献上:
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 条