微信登录

一、前期准备

1、注册微信公众平台,开通服务号(必须,订阅号没有接口调用权限)

2、注册开放平台,微信认证。认证后还需要做下面两个申请认证

     1)管理中心--》创建应用(必须,审核基本一天时间)

      

     2)帐号中心--》开发者资质认证,申请开发资质认证(必须,审核基本一天时间)

      

二、开发流程

微信登录开发指南

1、获取二维码链接,即开发指南中的“第一步:请求CODE”

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

 代码如下:其中state是自己生成的验证码

@RequestMapping(value = "/getCodeByAppIdAndScope")
    public void getCodeByAppIdAndScope(HttpServletResponse response) throws IOException {
        String redirect_uri = URLEncoder.encode(ServiceConfigUtil.getValue("redirect_uri"), "utf-8");//即下面的getAccessTokenByCode方法
String state = System.currentTimeMillis() + ""; String request_url = "https://open.weixin.qq.com/connect/qrconnect" + "?appid=" + appid + "&scope=snsapi_login" + "&redirect_uri=" + redirect_uri + "&response_type=code" + "&state=" + state + "#wechat_redirect";//URl的拼接 response.sendRedirect(request_url);//进行网络的请求 }

    通过调用该链接会跳转二维码界面,用户扫描二维码确认后,微信后台会调用我们给定的redirect_uri,并且会有code和state参数,我们后台可以接收到code和state参数,这时可以进行指南中的“第二步:通过code获取access_token”,代码如下

@RequestMapping(value = "/getAccessTokenByCode")
    public String getAccessTokenByCode(HttpServletRequest request,
                                       HttpServletResponse response,
                                       RedirectAttributes redirectAttributes,
                                       Model model) {
        String code = request.getParameter("code");
        String accessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                "?appid=" + appid +
                "&secret=" + secret +
                "&code=" + code +
                "&grant_type=authorization_code";//Url的拼接
        ResponseEntity result = RemoteJsonHelper.accessForEntityNoToken(HttpMethod.GET, accessTokenUrl, null);//这个是自己写的远程调用工具接口,没有的网上查查自己写一个即可
        JSONObject jb = JSONObject.fromObject(result.getBody());
String accessToken = tokenObj.getString("access_token");//获取access_token
getUserInfoByAccessToken(accessToken);//据accessToken获取用户信息
 }

    接着就是获取用户信息,代码如下

private String getUserInfoByAccessToken(JSONObject tokenObj) {
        String accessToken = tokenObj.getString("access_token");//获取access_token
        String openId =tokenObj.getString("openid");//获取openid
        String userUrl = "https://api.weixin.qq.com/sns/userinfo" +
                "?access_token=" + accessToken +
                "&openid=" + openId;
        ResponseEntity result = RemoteJsonHelper.accessForEntityNoToken(HttpMethod.GET, userUrl, null);
        JSONObject jb = JSONObject.fromObject(result.getBody());
        String nickname = jb.getString("nickname");//普通用户昵称
        String headimgurl = jb.getString("headimgurl");//用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
        String openid = jb.getString("openid");//普通用户的标识,对当前开发者帐号唯一
        int sex = jb.getInt("sex");//普通用户性别,1为男性,2为女性
        String province = jb.getString("province");
        String city = jb.getString("city");
        String country = jb.getString("country");
        boolean index = 判断该用户是否授权过
if(index) {//授权过直接登录 //登录 } else {
       //添加处理并登录
}
}

   到这里微信登录流程结束。

三、开发中遇到问题

1、 Scope参数错误或没有Scope权限解决方法

  需要微信号开通服务号及开发这资质认证

2、redirect_uri 参数错误

  将本地域名设置成与应用授权回调域一样的域名,我发生这个错误是因为本地测试时redirect_uri 链接上有端口导致的,也就是说这个链接的域名后不能有端口

     这样回导致回调后报错,这时只要在地址栏中将配置的域名改成测试的域名即可(本地则为localhost:port),这样测试流程就可以走通了

原文地址:https://www.cnblogs.com/sunjf/p/wechat_login.html