java的网站通过微信登录

来源:互联网 发布:如何黑进路由器 知乎 编辑:程序博客网 时间:2024/05/15 00:57

网站通过微信登录需要用到微信开发平台。

这是微信的文档说明

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&

token=7002e0c37ed916d2f51caee85c6a4c8c01f557aa&lang=zh_CN

基本的流程是这样的

  1. 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

  2. 2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

  3. 3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。



我以自己的理解再说一遍

首先,我们需要发送一个URL,来获取code:

第一步:请求CODE

第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login

发送这个url后会返回一个code,比如我们发送https://open.weixin.qq.com/connect/qrconnect?appid=wx5695ad2ae014ffb3&redirect_uri=http://www.ssyer.com/oauth&response_type=code&scope=snsapi_login&

state=STATE#wechat_redirect,然后我们在java代码中用String code = request.getParameter("code");来获取code。

这里的重定向http://www.ssyer.com/oauth要关注,因为重定向去访问这个接口的时候,请求中包含了code的信息。

第二步:通过code获取access_token

通过code获取access_token

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

我们使用post的方式来发送请求

Map<String, String> map = new TreeMap<String, String>();
               map.put("appid","wx5695ad2ae014ffb3");
               map.put("secret","01331709f6c1297d4ccea01a4cfa2c98");
            map.put("code",code);
            map.put("grant_type","authorization_code");
               LOGGER.error("oauth.code="+code);
             HttpResult httprequest=HttpClientUtil.post("https://api.weixin.qq.com/sns/oauth2/access_token", map,null);

这里用了HttpClient的类来发送url,关于这个的说明参看我的一篇用java发送url的文章


发送了这个请求后会有返回的内容,我们来看下返回的内容:

返回说明

正确的返回:


"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}

参数说明access_token接口调用凭证expires_inaccess_token接口调用凭证超时时间,单位(秒)refresh_token用户刷新access_tokenopenid授权用户唯一标识scope用户授权的作用域,使用逗号(,)分隔 unionid当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。

错误返回样例:

{"errcode":40029,"errmsg":"invalid code"}

我们需要用到access_token和openid这两个参数



Map<String, String> accMap = new TreeMap<String, String>();
                                accMap.put("access_token",jsonObject.getString("access_token"));
                                accMap.put("openid",jsonObject.getString("openid"));
                      HttpResult accReq=HttpClientUtil.get("https://api.weixin.qq.com/sns/userinfo?"+accMap.toString().substring(1,accMap.toString().length()-1).replaceAll(", ","&"));


明明是get清求还把参数放到Map中个人觉得搞复杂了

String config2=new String(accReq.getStream(),"UTF-8");
                        JSONObject jsonObject2= JSONArray.parseObject(config2);
                        Object errorCode2= jsonObject2.get("errcode");
                   if(errorCode2 == null) {
                       BieyangUser bieyangUser=new BieyangUser();
                       bieyangUser.setWcOpenId(jsonObject2.getString("openid"));
                       BieyangUserInfo bieyangUserInfo=new BieyangUserInfo();
                       bieyangUserInfo.setCity(jsonObject2.getString("city"));
                        bieyangUserInfo.setFace(jsonObject2.getString("headimgurl"));
                        bieyangUserInfo.setNickname(jsonObject2.getString("nickname"));

以上代码为获取用户信息

这样就把信息放到了bieyangUserInfo的对象当中和bieyangUser中,然后就是根据你的据需要添加你的代码了比如我这里是这样的代码

UserAuthUtil.signIn(bieyangUserService.create(bieyangUser, bieyangUserInfo).getData(), request, response);
                    UserAuthUtil.wechat(request, response);/*加cookies*/
                      }
                          }
             return "redirect:" + webServerUrl;

意思是微信用户登录加cookies然重定向到网站首页