justauth/JustAuth · error · AuthException

object.getString("msg")

Error message

object.getString("msg")

What it means

AuthQqRequest.getUserInfo throws AuthException with the 'msg' field when the QQ user-info response has ret != 0. QQ returns ret=0 for success; non-zero ret codes (100030, 100016, etc.) indicate the user profile call failed.

Source

Thrown at src/main/java/me/zhyd/oauth/request/AuthQqRequest.java:53

    @Override
    public AuthToken getAccessToken(AuthCallback authCallback) {
        String response = doGetAuthorizationCode(authCallback.getCode());
        return getAuthToken(response);
    }

    @Override
    public AuthResponse<AuthToken> refresh(AuthToken authToken) {
        String response = new HttpUtils(config.getHttpConfig()).get(refreshTokenUrl(authToken.getRefreshToken())).getBody();
        return AuthResponse.<AuthToken>builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getAuthToken(response)).build();
    }

    @Override
    public AuthUser getUserInfo(AuthToken authToken) {
        String openId = this.getOpenId(authToken);
        String response = doGetUserInfo(authToken);
        JSONObject object = JSONObject.parseObject(response);
        if (object.getIntValue("ret") != 0) {
            throw new AuthException(object.getString("msg"));
        }
        String avatar = object.getString("figureurl_qq_2");
        if (StringUtils.isEmpty(avatar)) {
            avatar = object.getString("figureurl_qq_1");
        }

        String location = String.format("%s-%s", object.getString("province"), object.getString("city"));
        return AuthUser.builder()
            .rawUserInfo(object)
            .username(object.getString("nickname"))
            .nickname(object.getString("nickname"))
            .avatar(avatar)
            .location(location)
            .uuid(openId)
            .gender(AuthUserGender.getRealGender(object.getString("gender")))
            .token(authToken)
            .source(source.toString())
            .build();

View on GitHub (pinned to 694bbf1b01)

Solutions

  1. Map the ret code: 100016 = token expired → refresh via refresh token; 100030 = no permission → request get_user_info scope in authorize URL
  2. Ensure getScopes in authorize includes get_user_info
  3. Call refresh() when the token approaches expiry before getUserInfo
  4. Log the 'msg' string, QQ often includes the Chinese reason

Example fix

null
Defensive patterns

Strategy: retry

Validate before calling

if (System.currentTimeMillis() > issuedAtMs + token.getExpiresIn() * 1000L) {
    token = qqRequest.refresh(token).getData();
}

Type guard

null

Try / catch

try {
    return qqRequest.getUserInfo(token);
} catch (AuthException e) {
    // ret 100016 → token expired: refresh and retry once
    token = qqRequest.refresh(token).getData();
    return qqRequest.getUserInfo(token);
}

Prevention

When it happens

Trigger: Calling getUserInfo after getOpenId when QQ's /user/get_user_info returns ret!=0 — typically an expired/invalid access token (100016) or a missing scope/permission for profile data.

Common situations: Access token expired (QQ tokens are short-lived), the app lacks the get_user_info scope, or unionid/openid mismatch from mixing app types.

Related errors


AI-assisted analysis of justauth/JustAuth@694bbf1b01 (2026-08-14). Data as JSON: /api/errors/e8618251197ebc26. Report an issue: GitHub.