Java对微信网页授权登录的实现

文章类别 in java

开发微信网页的童鞋应该都会涉及到微信授权登录了,微信官方文档对微信使用的步骤已经很明确的进行了说明了:

1 第一步:用户同意授权,获取code

2 第二步:通过code换取网页授权access_token

3 第三步:刷新access_token(如果需要)

4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

5 附:检验授权凭证(access_token)是否有效

我们主要是用java来对微信用户进行授权的实现,获取用户的信息保存到数据库中,之前的做法是在将授权页面交给前端,让前端获取code然后请求后端接口获取openid来获取用户信息,那样子的做法不是很好,因为对前端来说授权页面可能不仅仅是首页,而且还要与后端做多一步的数据对接,很是麻烦,所以现在是用后端直接授权获取用户信息然后再重定向到前端的页面。

具体操作如下:

首先创建一个Servlet:

public class wechatOAuthServlet extends HttpServlet {
	 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//TODO
    }
}

这里用wechatOAuthServlet继承HttpServlet并重写doGet和doPost方法,doGet直接调用doPost,所以我们对网页授权的具体操作在doPost中操作!

这个wechatOAuthServlet在web.xml中设置:

	<servlet>
        <servlet-name>getWechatUser</servlet-name>
        <servlet-class>com.wistbean.action.app.wechat.wechatOAuthServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>getWechatUser</servlet-name>
        <url-pattern>/app/wechat/wechatOAuthServlet.do</url-pattern>
    </servlet-mapping>

很简单,当客户端发起/app/wechat/wechatOAuthServlet.do请求时就调用我们的wechatOAuthServlet这个类的doPost方法。

我们对获取微信code的回调url也设置是这个/app/wechat/wechatOAuthServlet.do的urlEncode:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60 &redirect_uri=这里是urlEncode后的链接(www.wistbean.com/app/wechat/wechatOAuthServlet.do)&response_type= code&scope=snsapi_userinfo&state=STATE#wechat_redirect

doPost方法如下代码解释:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//获取客户端请求是否有code参数,如果有,说明用户已经同意授权,微信请求了我们的redirect_uri并携带了code参数,如果没有,说明用户还没有同意授权,仅仅是访问了我们的url。
        String code = request.getParameter("code");
        if(code == null || code.equals(""))
        {
			//这里是没有code的情况,那么将我们的url进行encode,然后根据微信文档将参数传进去,然后将链接回调到我们设置好的redierctURL,这时候用户就会看到微信登录授权页面,如果此时用户点击确认登录,那么微信就会请求我们这个uri并携带code参数。
            String wx_redirect_uri = URLEncoder.encode("http://www.wistbean.com/pro/app/wechat/getWechatUserServelet.do");
            String redierctURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+ ConfigUtil.API_ID+"&redirect_uri="+wx_redirect_uri+"&response_type=" +
                    "code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            response.sendRedirect(redierctURL);
        }else
        {

			//用户同意了授权,我们获得了code参数,那么就可以根据code获取用户信息了。然后保存或更新用户的信息,返回用户的id加到cookie给前端,将连接回调到前端的页面去。
            AppFunctionDao dao = (AppFunctionDao) SpringUtil.getBean("appFunctionDaoImpl");
            String sjson = "{name:'memberlogin', data:{code:'" + code + "'}}";
            JSONObject json = JSONObject.fromObject(sjson);
            String data = dao.updateData(json);//保存完用户信息后返回用户id
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setCharacterEncoding("UTF-8");
            Cookie cookie = new Cookie("userinfo",data);//添加cookie传入用户id给前端
            cookie.setMaxAge(24*60*60*15);
            cookie.setDomain(".wisteban.com");
            cookie.setPath("/");
            response.addCookie(cookie);
            response.sendRedirect("http://www.wistbaen.com/pro-wx/");
        }


    }

这样子前端就可以通过cookie判断用户是否登录了,若需要用户登录那么前端只要请求/app/wechat/wechatOAuthServlet.do这个链接就可以了!