使用第三方微信登录

        这两天了解了下使用微信第三方登录相关问题,这样方便用户登录,不用担心密码遗忘的问题,所以记录下微信登录的简单流程

        首先在在微信开放平台注册,记住要选择开发者,每个微信都可以成为开发者,点击打开微信开放平台链接

        或者在微信公众平台申请一个服务的公众号

        两者的区别可以自行百度

第三方微信接口登录流程图:使用第三方微信登录

  用户首先请求登录第三方应用(app.web等),一般现在用户登录会有很多登录方式,邮箱/手机号/用户名密码/第三方等,这里可以判断用户的登录方式,如果是微信登录就是接下来的流程:

1.请求第三方应用登录

2.第三方应用请求微信授权登录,是遵循OAuth2.0的协议授权码模式

3.微信开放平台会请求用户是否授权登录

4.用户确认授权登录(是或者否)

5.微信会返回给第三方应用一个code(授权临时票据,需要使用code去微信申请token令牌)

6.根据返回的code+appId+appsecret去获取access_token,其中   appId是服务器在微信平台认证后会自动生成,代表这这个第三方应用的唯一标识,   appsecret是密匙,加密解密使用,也是在服务器在微信平台认证后生成的   access_token 就是令牌,可以去获取用户微信的基本信息(头像,昵称,性别,地址)有效期是2个小时

好了 流程嘚吧完了,接下来上代码


1.用户扫描二维码

https://open.weixin.qq.com/connect/qrconnect?appid=xxxxxxxxf&redirect_uri=xxxxxxxxxxxx&response_type=code&scope=snsapi_login&state=#wechat_redirect

2.redirect_uri是扫描成功后需要跳转的页面(跳转会带有参数code和state/如果用户没有授权则不会返回code,但是会返回state)

/**

     * 微信引导页进入的方法

     * @return

     */

    @RequestMapping("/loginByWeiXin")

    public String loginByWeiXin(HttpServletRequest request, Map<String, Object> map) {

        // 获取code和state 个参数

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

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

        System.out.println("code -------" + code + ", state ------- " + state);

        

        if(code != null && !"".equals(code)) {

            // 授权成功获取用户token和openID

            OAuthInfo authInfo = WeiXinUtil.getAccess_token(code);

            String openid = authInfo.getOpenid();

            String access_token = authInfo.getAccess_token();

            

            if(access_token == null) {

                // Code 使用过 异常

                System.out.println("Code 使用过 异常.....");

                return "redirect:" + 跳转的路径;

            }

            

            // 查询微信号是否绑定第三方平台

            SysUser sysUser = weiXinService.getUserByWeiXinID(openid);

            if(sysUser == null) {

                //获取随机字符串长度是57的

                String randomStr = StringUtil.getRandomString(57);

                request.getSession().setAttribute(openid, randomStr);

                // 尚未绑定账号

                System.out.println("尚未绑定账号.....");

                return "redirect:/index.jsp?openid=" + openid + "&state=" + randomStr;

            }

            userController.doSomeLoginWorkToHomePage(sysUser.getMcid(), map);

            // 登录成功

            return "homePage";

        } 

        // 未授权

        return "redirect:" + 路径;

    

    }

3.根据code获取token(实体类OAuthInfo封装微信返回来的用户信息)

public static OAuthInfo getAccess_token(String code){

        

     

        String authUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code ";

        authUrl= authUrl.replace("APPID", Param.APPID);

        authUrl = authUrl.replace("SECRET", Param.SECRET);

        authUrl = authUrl.replace("CODE", code);

        String jsonString = HTTPRequestUtil.sendPost(authUrl,"");

        System.out.println("jsonString: " + jsonString);

        OAuthInfo auth = null;

        try {

            auth = (OAuthInfo) JacksonUtil.parseJSONToObject(OAuthInfo.class, jsonString);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return auth;

    }

 

返回的用户信息格式:


"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"      //客户授权后才会有这个字段
}

好了 只是为了记录下 微信登录流程 如果有错误欢迎指出  共同进步