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
- Map the ret code: 100016 = token expired → refresh via refresh token; 100030 = no permission → request get_user_info scope in authorize URL
- Ensure getScopes in authorize includes get_user_info
- Call refresh() when the token approaches expiry before getUserInfo
- 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
- Include get_user_info in the authorize scope list
- Refresh QQ tokens before expiry instead of on failure
- Map ret codes (100016/100030) to user-facing actions
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
- object.get("error") + ":" + object.get("error_description")
- object.getString("m")
- userProfile.getString("description")
- accessTokenObject.get("msg")
- object.getString("error_description") / object.getString("er
AI-assisted analysis of justauth/JustAuth@694bbf1b01 (2026-08-14).
Data as JSON: /api/errors/e8618251197ebc26.
Report an issue: GitHub.