微信登录-服务端

1.申请账号-微信开放平台
https://open.weixin.qq.com/

  1. 创建移动应用


    image.png
  2. 可得到AppID与AppSecret


    image.png
  3. 客户端(IOS Android)集成微信登录
    目的是获取临时票据 code,传给服务端
    略.

  1. 服务端
    文档: https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

5.1 通过客户端传过来的code,以及AppId和AppSecret调用微信服务,获取accessToken以及openId

        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";
        //获取accessToken
        String accessTokenStr = restTemplate.getForObject(url, String.class);
        JSONObject accessTokenObj = JSON.parseObject(accessTokenStr);
        log.info("wechatLogin accessTokenResult:{}", accessTokenObj);
        if (StringUtils.isNotEmpty(accessTokenObj.getString("errcode"))) {
            throw Excep.le(UserErrMsgs.Err_000900040013);
        }

        //用户的openId
        String openId = accessTokenObj.getString(WeChatConsts.OPEN_ID);
       //用户的accessToken,可用来获取微信用户的基本信息
        String accessTokenObjString = accessTokenObj.getString(WeChatConsts.ACCESS_TOKEN);

openId: 每个微信用户对应一个微信应用都有一个唯一的openId,所以可以根据获取到的openId是否绑定了本系统的用户来判断用是否已经进行了微信绑定。

5.2 获取用户的基本信息(解决乱码问题)

  • 解决乱码问题:先使用ISO8859-1获取到用户信息的字节数组,再将字节数组使用UFT8编码成字符串。
        String result = new RestTemplate().getForObject("https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId, String.class);
        JSONObject jsonObject = JSON.parseObject(new String(result.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
        if (StringUtils.isNotEmpty(jsonObject.getString("errcode"))) {
            return null;
        }

  • 注意: 如果需要存储微信用户的头像,不可直接存储微信返回的头像地址,因为如果微信用户更换了头像,该地址将失效。所以正确的做法是将微信用户的头像转储到自己的OSS上。

你可能感兴趣的:(微信登录-服务端)