java实现微信网页授权登录

开发前的准备:
1.需要有一个公众号(我这里用的测试号),拿到AppID和AppSecret;
2.进入公众号开发者中心页配置授权回调域名。具体位置:接口权限-网页服务-网页账号-网页授权获取用户基本信息-修改
注意,这里仅需填写全域名(如www.qq.com、www.baidu.com),勿加 http:// 等协议头及具体的地址字段;

我们可以通过使用Ngrok来虚拟一个域名映射到本地开发环境,网址https://www.ngrok.cc/
这里推荐一篇Ngrok的下载使用博客:使用Ngrok进行内网穿透(Windows)
开启内网穿透如下图:
在这里插入图片描述
在测试平台页面也进行设置:
在这里插入图片描述
同时拉下去进行网页授权配置:
在这里插入图片描述
在这里插入图片描述
同时还需要扫一下这个二维码
在这里插入图片描述
授权步骤:
1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

3、通过网页授权access_token和openid获取用户基本信息

在这里插入图片描述
具体请参考: 微信网页授权开发文档

要实现的效果是,在从公众号打开平台的时候获取到微信公众号的授权:

首先根据APPID获取到 code

/**
     * 微信端首页跳转
     * @return
     */
    @GetMapping()
    public String index(HttpServletRequest request){
        try {
            String urlHead = request.getScheme() + "://" + request.getServerName() + request.getContextPath();
            String redirect_uri = urlHead + "/wx/main";
//            redirect_uri = URLEncoder.encode(redirect_uri, "utf-8");
            redirect_uri = URLEncoder.encode("http://demo.pantryn.com/wx/main", "utf-8");
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
            return "redirect:" + url + "";
        } catch (Exception e) {
            return null;
        }
    }

根据code值,去获取openid code只有五分钟的时效

//    主页
    @RequestMapping("/main")
    public ModelAndView main(HttpServletRequest request, HttpServletResponse response,String code, String userId) {
        ModelAndView modelAndView = new ModelAndView("wx/index");
        //获取到返回的参数
        try {
/*// 从request中获取Cookie,拿到的是一个Cookie数组
            Cookie[] cookies = request.getCookies();
// 然后迭代之
            if (cookies != null && cookies.length > 0) { //如果没有设置过Cookie会返回null
                for (Cookie cookie : cookies) {
                    if ("openid".equals(cookie.getName())&&!"".equals(cookie.getValue().trim())){
                        return modelAndView;
                    }

                }
            }*/
            //首先拿到微信公众号的AppID、AppSecret等参数
            if (userId != null) {
                WxUser wxUserByPhone = wxUserMapper.selectWxUserById(Long.parseLong(userId));
                modelAndView.addObject("cardId", wxUserByPhone.getCardid());
                modelAndView.addObject("name", wxUserByPhone.getName());
                modelAndView.addObject("phone", wxUserByPhone.getPhone());
            }
            String url = null;
            if (code != null) {
                /**
                 *  2 第二步:通过code换取网页授权access_token
                 */
                //用户授权,获取code
                url = "https://api.weixin.qq.com/sns/oauth2/access_token";
                Map<String, Object> param = new HashMap<>();
                param.put("appid", appId);
                logger.info("---wxAppid-----" + appId);
                param.put("secret", appSecret);
                param.put("code", code);
                param.put("grant_type", "authorization_code");
                String tokenInfo = HttpClientUtils.httpGetRequest(url, param, "UTF-8");
                JSONObject wxResponse = JSONObject.parseObject(tokenInfo);
                if (wxResponse.containsKey("errcode")) {
                    logger.error("---------wxTokenError------" + wxResponse.get("errcode") + "---------" + wxResponse.get("errmsg"));

                }
                logger.info("---code-----" + JSON.toJSONString(wxResponse));
                String pageToken = wxResponse.get("access_token").toString();
                String expires_in = wxResponse.get("expires_in").toString();
                String refresh_token = wxResponse.get("refresh_token").toString();
                String openid = wxResponse.get("openid").toString();
                String scope = wxResponse.get("scope").toString();

                /**
                 *  4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
                 */
                /*String urlUser = "https://api.weixin.qq.com/sns/userinfo?"
                        + "access_token=" + accTok.getAccess_token() + ""
                        + "&openid=" + accTok.getOpenid() + ""
                        + "&lang=zh_CN";

                String httpUser = WeixinUtil.httpRequest(urlUser, requestMethod, outputStr);
                System.out.println("拉取用户信息==" + httpUser);

                WechatUser wechatUser = JSON.parseObject(httpUser, WechatUser.class);
                wechatUser.setAccess_token(accTok.getAccess_token());*/
                /**
                 *  5 附:检验授权凭证(access_token)是否有效
                 */
                param.clear();
                param.put("access_token", pageToken);
                param.put("openid", openid);
                String check = HttpClientUtils.httpGetRequest("https://api.weixin.qq.com/sns/auth", param, "UTF-8");
                logger.info("---check-----" + check);

//                System.out.println("openId:+++++++++++++++++++++++++++++"+openid);

                //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
                Cookie cookie = new Cookie("openid", openid);//创建一个cookie,cookie的名字是lastAccessTime
                //设置Cookie的有效期为7天
                cookie.setMaxAge(7 * 24 * 60 * 60);
                //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
                response.addCookie(cookie);

                return modelAndView;

            } else {
                //如果access_token失效,则再次进行调用,并存储access_token值,access_token有效期为2个小时
                this.index(request);
            }
        } catch (Exception e) {

            e.printStackTrace();

        }

        return modelAndView;
    }

获取到的openid存在cookie中

然后用户登录或者注册的时候从 cookie中取出openid存到用户表表中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 Java实现微信登录,需要使用微信开放平台提供的开发工具包。 步骤如下: 1. 注册微信开放平台账号,并创建应用。 2. 在应用中配置授权回调域名。 3. 下载微信开放平台 Java SDK,并将其导入到项目中。 4. 在项目中使用以下代码获取授权链接: ``` String redirectUri = "你的授权回调域名"; String state = "随机字符串"; String scope = "snsapi_login"; // 请求用户授权时向用户显示的可进行授权的列表。 // 创建 Oauth2 API 实例 Oauth2API oauth2API = new Oauth2API(WxConfig.getWxConfig()); // 获取授权链接 String authorizationUrl = oauth2API.getAuthorizationUrl(redirectUri, scope, state); ``` 5. 将授权链接发送给用户,让用户点击授权链接。 6. 在授权回调页面中,使用以下代码获取用户信息: ``` String code = request.getParameter("code"); String state = request.getParameter("state"); // 创建 Oauth2API 实例 Oauth2API oauth2API = new Oauth2API(WxConfig.getWxConfig()); // 通过 code 换取网页授权 access_token OAuthAccessToken oauthAccessToken = oauth2API.getOAuthAccessToken(code); // 获取用户信息 UserAPI userAPI = new UserAPI(WxConfig.getWxConfig()); User user = userAPI.getUserInfo(oauthAccessToken.getOpenid()); ``` 7. 使用用户信息进行登录操作。 注意 ### 回答2: 要实现微信登录功能,可以使用Java的第三方开源库,例如微信开放平台提供的SDK(Software Development Kit)。 首先,你需要在微信开放平台注册一个应用,并获取到微信开放平台分配的AppID和AppSecret。 然后,在你的Java项目中导入微信SDK,并进行相应的配置。可以通过配置文件或者代码方式将AppID和AppSecret设置到SDK中。 接下来,你需要在你的系统中提供一个微信登录的入口,通常是在登录页面上增加一个微信登录按钮。用户点击该按钮后,你的系统将向微信服务器发送认证请求。 微信服务器会返回一个带有临时票据code的回调地址。你的系统需要获取这个code,并将其作为参数发送到微信服务器请求access_token和openid。 获取到access_token和openid后,你需要校验这些信息的合法性。同时,你可以通过access_token获取用户的微信昵称、头像等基本信息。 接下来,你可以根据从微信获取到的openid,在你的系统中进行用户认证。可以将openid作为用户的唯一标识,与你系统中的用户信息进行关联。 最后,根据你的系统需求,你可以进行用户相关操作,例如创建新用户、直接登录、绑定已有账户等。 总之,实现微信登录的过程包括获取微信授权、校验票据、获取用户信息以及与系统用户进行关联等步骤。通过使用Java的第三方库,可以简化开发过程,实现便捷的微信登录功能。 ### 回答3: Java可以通过使用微信开放平台提供的开发接口实现微信登录功能。 首先,需要在微信开放平台上创建一个开发者账号,并创建一个应用。获取到应用的AppID和AppSecret,这将用于在代码中进行鉴权。 然后,在Java中使用第三方登录的框架,比如Spring Security,来实现微信登录功能。首先需要使用AppID和AppSecret向微信服务器发送请求,获取到access_token,这是用于访问用户资源的凭证。 在用户点击微信登录按钮后,Java代码将生成一个微信授权登录的URL,用户点击后将跳转至微信登录页面。用户在微信中输入用户名和密码完成登录后,微信服务器会重定向至预先设置的回调URL,并带上一个code参数。Java代码通过获取到的code和AppID、AppSecret,再次向微信服务器发送请求,获得用户的基本信息,如openid、昵称等。 最后,Java代码将获取到的微信用户信息存储到数据库中,或是生成一个token返回给前端,用于后续的用户鉴权和访问控制。 通过以上步骤,Java就可以实现微信登录功能了。需要注意的是,由于微信平台的接口可能会有更新和变化,建议在实施之前仔细阅读微信官方文档,并及时更新代码以适应最新的API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值