java实现微信网页授权登录

java实现微信网页授权登录

开发前的准备:
1.需要有一个公众号(我这里用的测试号),拿到AppID和AppSecret;
申请测试号网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
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获取用户基本信息

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

代码实现
先看一下项目结构:
在这里插入图片描述

AuthUtil工具类:

public class AuthUtil {

    public static final String APPID = "wx2937ac88882f085d";
    public static final String APPSECRET = "b5fc16834dc96242a61b070679f3b7fc";
    //回调地址
    public static final String backUrl="http://079af792.ngrok.io/callBack";
    public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{
        JSONObject jsonObject = null;
        //首先初始化HttpClient对象
        DefaultHttpClient client = new DefaultHttpClient();
        //通过get方式进行提交
        HttpGet httpGet = new HttpGet(url);
        //通过HTTPclient的execute方法进行发送请求
        HttpResponse response = client.execute(httpGet);
        //从response里面拿自己想要的结果
        HttpEntity entity = response.getEntity();
        if(entity != null){
            String result = EntityUtils.toString(entity,"UTF-8");
            jsonObject = jsonObject.fromObject(result);
        }
        //把链接释放掉
        httpGet.releaseConnection();
        return jsonObject;
    }
}

1、引导用户进入授权页面同意授权,获取code

   @RequestMapping(value="wxlogin")
    public void wx(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //第一步:引导用户进入授权页面同意授权,获取code
        StringBuilder builder = new StringBuilder("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
        builder.append(AuthUtil.APPID);
        builder.append("&redirect_uri=");
        builder.append(URLEncoder.encode(AuthUtil.backUrl));//开发文档要求转换
        builder.append("&response_type=code");
        builder.append("&scope=snsapi_userinfo");
        builder.append("&state=STATE#wechat_redirect");
        //授权页面地址
        //将StringBuilder转换成String
        String url=builder.toString();
        //重定向到授权页面
        response.sendRedirect(url);
    }  

2、通过第一步获取的code换取网页授权access_token和openid
这一步需要在控制器中获取微信回传给我们的code,通过这个code来请求access_token,通过access_token和openid获取用户基本信息:

  @RequestMapping(value="callBack")
    public String wxcallback(@RequestParam("code") String code, Model model)throws IOException {
        System.out.println("code:" + code);
        //获取code后,请求以下链接获取access_token
        StringBuilder builder = new StringBuilder("https://api.weixin.qq.com/sns/oauth2/access_token?appid=");
        builder.append(AuthUtil.APPID);
        builder.append("&secret=");
        builder.append(AuthUtil.APPSECRET);
        builder.append("&code=");
        builder.append(code);
        builder.append("&grant_type=authorization_code");

        //通过网络请求方法来请求上面这个接口
        //将StringBuilder转换成String
        String url=builder.toString();
        JSONObject jsonObject = AuthUtil.doGetJson(url);

        System.out.println("==========================jsonObject" + jsonObject);
        //从返回的JSON数据中取出access_token和openid,拉取用户信息时用
        String token = jsonObject.getString("access_token");
        String openid = jsonObject.getString("openid");

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

        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
        StringBuilder builder1 = new StringBuilder("https://api.weixin.qq.com/sns/userinfo?access_token=");
        builder1.append(token);
        builder1.append("&openid=");
        builder1.append(openid);
        builder1.append("&lang=zh_CN");
        //通过网络请求方法来请求上面这个接口
        //将StringBuilder转换成String
        String infoUrl=builder1.toString();
        JSONObject userInfo = AuthUtil.doGetJson(infoUrl);

        System.out.println("userInfo=======" + userInfo);

        //第1种情况:使用微信用户信息直接登录,无需注册和绑定
//        model.addAttribute("info",userInfo);
//        return "wx/wxtest1";
//

        //第2种情况:查看数据库是否存在相对应用户
        try {
            Wxuser wxuser = new Wxuser();
            wxuser = wxMapper.findnameByopenId(openid);
            if (wxuser != null) {
                //已绑定
                model.addAttribute("info",userInfo);
                model.addAttribute("name", wxuser.getName());
                return "wx/wxtest2";

            } else {
                //未绑定
                model.addAttribute("openid", openid);
                return "wx/wxtest3";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "wx/fail";   //跳转到登录失败页面
    }   

数据库查询等操作是使用了mybatis
WxMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.WxMapper">
    <select id="findnameByopenId"   parameterType="String" resultType="com.example.pojo.Wxuser" >
    select name from user where openid = #{value}
  </select>
    <insert id="addWxuser" parameterType="com.example.pojo.Wxuser">
        insert into user(
       openid,name,sex
        )
        values(
        	#{openid},
			#{name},
			#{sex}
        )

    </insert>
</mapper>
  
@Repository
public interface WxMapper {
    public Wxuser findnameByopenId(String openid);
    public void  addWxuser(Wxuser wxuser);
}

前端显示页面是使用thymeleaf模板
wxtest1 无需验证数据库登录成功时的页面

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>登陆成功!</div>
<div>用户昵称:<p th:text="${info.nickname}"></p>}</div>
<div>用户头像:<img  width="100" th:src="${info.headimgurl }"></div>
</body>
</html>  

wxtest2 验证成功后跳转的页面

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>登陆成功!</div>
<div>用户昵称:<font th:text="${info.nickname}"></font></div>
<div>用户头像:<img  width="100" th:src="${info.headimgurl }"></div>
<div>用户姓名:<font  width="100" th:text="${name}"/></div>
</body>
</html>

wxtest3 验证失败进行绑定跳转的页面

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/addwxuser" method="post">
   姓名: <input type="text" name="name" />
   性别:  <input type="text" name="sex" />
    <input type="hidden" name="openid" th:value="${openid }" />
    <input type="submit" value="提交并绑定" />
</form>
</body>
</html>

整个WxController

@Controller
public class WxController {
    @Autowired
   private WxMapper wxMapper;

    @RequestMapping(value="wxlogin")
    public void wx(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //第一步:引导用户进入授权页面同意授权,获取code
        StringBuilder builder = new StringBuilder("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
        builder.append(AuthUtil.APPID);
        builder.append("&redirect_uri=");
        builder.append(URLEncoder.encode(AuthUtil.backUrl));//开发文档要求转换
        builder.append("&response_type=code");
        builder.append("&scope=snsapi_userinfo");
        builder.append("&state=STATE#wechat_redirect");
        //授权页面地址
        //将StringBuilder转换成String
        String url=builder.toString();
        //重定向到授权页面
        response.sendRedirect(url);
    }


    @RequestMapping(value="callBack")
    public String wxcallback(@RequestParam("code") String code, Model model)throws IOException {
        System.out.println("code:" + code);
        //获取code后,请求以下链接获取access_token
        StringBuilder builder = new StringBuilder("https://api.weixin.qq.com/sns/oauth2/access_token?appid=");
        builder.append(AuthUtil.APPID);
        builder.append("&secret=");
        builder.append(AuthUtil.APPSECRET);
        builder.append("&code=");
        builder.append(code);
        builder.append("&grant_type=authorization_code");

        //通过网络请求方法来请求上面这个接口
        //将StringBuilder转换成String
        String url=builder.toString();
        JSONObject jsonObject = AuthUtil.doGetJson(url);

        System.out.println("==========================jsonObject" + jsonObject);
        //从返回的JSON数据中取出access_token和openid,拉取用户信息时用
        String token = jsonObject.getString("access_token");
        String openid = jsonObject.getString("openid");

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

        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
        StringBuilder builder1 = new StringBuilder("https://api.weixin.qq.com/sns/userinfo?access_token=");
        builder1.append(token);
        builder1.append("&openid=");
        builder1.append(openid);
        builder1.append("&lang=zh_CN");
        //通过网络请求方法来请求上面这个接口
        //将StringBuilder转换成String
        String infoUrl=builder1.toString();
        JSONObject userInfo = AuthUtil.doGetJson(infoUrl);

        System.out.println("userInfo=======" + userInfo);

        //第1种情况:使用微信用户信息直接登录,无需注册和绑定
//        model.addAttribute("info",userInfo);
//        return "wx/wxtest1";
//

        //第2种情况:查看数据库是否存在相对应用户
        try {
            Wxuser wxuser = new Wxuser();
            wxuser = wxMapper.findnameByopenId(openid);
            if (wxuser != null) {
                //已绑定
                model.addAttribute("info",userInfo);
                model.addAttribute("name", wxuser.getName());
                return "wx/wxtest2";

            } else {
                //未绑定
                model.addAttribute("openid", openid);
                return "wx/wxtest3";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "wx/fail";   //跳转到登录失败页面
    }

    @RequestMapping(value="addwxuser")
     public String addWXuser(String name,String openid,String sex){
        Wxuser wxuser = new Wxuser();
        wxuser.setName(name);
        wxuser.setOpenid(openid);
        wxuser.setSex(sex);
        wxMapper.addWxuser(wxuser);
        return "wx/success";//跳转绑定成功页面

    }
}



效果:
在这里插入图片描述
在这里插入图片描述

而实现扫二维码授权登录原理也跟这里差不多。不过需要域名和服务号。
这里推荐一篇实现二维码授权网页登录:
微信开放平台————拼接获取扫码地址

  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答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。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值