(一)java微信授权登录

  • Post author:
  • Post category:java


最近工作中,接触到微信开发(公众号服务号开发)。

由于第一次接触微信开发,所以第一步先去看微信开发文档。


微信公众平台开发文档

接下来,我们要使用微信来进行授权登录。

微信授权的话,获取用户信息有两种:

1.静默获取用户信息、

2.弹出授权界面,用户确认之后获取用户信息(这种方法能够获取到更多信息)。

开发准备,登录微信公众平台后台->基本配置->公众号开发信息:

1.获取到AppID

2.AppSecret

3.设置IP白名单


4.添加网页授权域名

公众号设置->功能设置



这一步,小伙伴本地开发的话没有域名,可以使用内网穿透软件,这里我用的是NATAPP,这样我们就能得到一个域名了,

然后按照微信的流程来绑定授权域名就好了。

获取用户信息,需要openid,然而获取openid的话要通过这个接口先获得一个code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

这里我们用的是弹出授权页面snsapi_userinfo

后台授权接口代码

    @RequestMapping("/")
    public void login(HttpServletResponse response) {
                //这里是回调的url
                String redirect_uri = URLEncoder.encode("http://回调页面的路径", "UTF-8");
                String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
                        "appid=APPID" +
                        "&redirect_uri=REDIRECT_URI"
                        "&response_type=code" +
                        "&scope=SCOPE" +
                        "&state=123#wechat_redirect";
                response.sendRedirect(url.replace("APPID","你的APPID").replace("REDIRECT_URL",redirect_url).replace("SCOPE","snsapi_userinfo"));
    }

使用微信web开发工具访问该接口,会弹出授权确认界面


用户点击确认登录之后跳转到我们的回调接口,并携带上code参数

redirect_uri/?code=CODE&state=STATE

,那我们就通过code来获取openid了。

获取code后,请求以下链接获取access_token与openid:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


后台回调接口代码

    @RequestMapping("/index")
    public void index(String code) {
                String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
            //开始请求url地址,第一次请求通过code获取openid与access_token     
             UrlConnUtils.get(url.replace("APPID", "你的APPID").replace("SECRET", "你的SECRET")
                      .replace("CODE", code), new GetDataUrlConnListener() {                
                     @Override
                     public void onSuccess(HttpURLConnection connection) throws IOException {
                        String data = MyUtils.inputStreamToString(connection.getInputStream());
                        JSONObject jsonObject = JSONObject.parseObject(data);
                        if (jsonObject.getString("openid") != null) {
                            //拉取用户信息
                            String openid = jsonObject.getString("openid");
                            String access_token = jsonObject.getString("access_token");
                            String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
                             //第二次请求,用openid与access_token获取用户的信息
                            UrlConnUtils.get(url.replace("OPENID", openid).replace("ACCESS_TOKEN", access_token), new GetDataUrlConnListener() {
                                @Override
                                public void onSuccess(HttpURLConnection connection) throws IOException {
                                    String data = MyUtils.inputStreamToString(connection.getInputStream());                                   
                                    System.out.println(data);//输出微信返回的用户信息
                        }
                    }
                });
    }

第一次返回的数据:

{
    "access_token":"9_zB3*****************w",
    "expires_in":7200,
    "refresh_token":"9_Uze***************9WTQ",
    "openid":"o*************ug",
    "scope":"snsapi_userinfo"
}

第二次返回的数据:(用户的信息)

{
"openid":"o***********g",
"nickname":"Smile",
"sex":1,
"language":"zh_CN",
"city":"厦门",
"province":"福建",
"country":"中国",
"headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTLs8SZLLWjyib0Q\/132",
"privilege":[]
}

这样就大功告成了!



版权声明:本文为xiaoyanic原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。