{"record":{"id":"f31e1d7c1f498f0e","repo":"justauth/JustAuth","slug":"response-geterrormsg","errorCode":null,"errorMessage":"response.getErrorMsg()","messagePattern":"response\\.getErrorMsg\\(\\)","errorType":"exception","errorClass":"AuthException","httpStatus":null,"severity":"error","filePath":"src/main/java/me/zhyd/oauth/request/AuthQQMiniProgramRequest.java","lineNumber":70,"sourceCode":"        // 如果需要用户信息，需要在小程序调用函数后传给后端\n        return AuthUser.builder()\n            .username(\"\")\n            .nickname(\"\")\n            .avatar(\"\")\n            .uuid(authToken.getOpenId())\n            .token(authToken)\n            .source(source.toString())\n            .build();\n    }\n\n    /**\n     * 检查响应内容是否正确\n     *\n     * @param response 请求响应内容\n     */\n    private void checkResponse(JSCode2SessionResponse response) {\n        if (response.getErrorCode() != 0) {\n            throw new AuthException(response.getErrorCode(), response.getErrorMsg());\n        }\n    }\n\n    @Override\n    protected String accessTokenUrl(String code) {\n        return UrlBuilder.fromBaseUrl(source.accessToken())\n            .queryParam(\"appid\", config.getClientId())\n            .queryParam(\"secret\", config.getClientSecret())\n            .queryParam(\"js_code\", code)\n            .queryParam(\"grant_type\", \"authorization_code\")\n            .build();\n    }\n\n    @Data\n    @SuppressWarnings(\"SpellCheckingInspection\")\n    private static class JSCode2SessionResponse {\n\n        @JSONField(name = \"errcode\")","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/justauth/JustAuth/blob/694bbf1b010d93404e3bfb4824d90e9ddfaebebb/src/main/java/me/zhyd/oauth/request/AuthQQMiniProgramRequest.java#L52-L88","documentation":"AuthQQMiniProgramRequest.checkResponse throws AuthException carrying the WeChat QQ Mini Program JSCode2SessionResponse errorCode and errorMsg when errorCode != 0. This wraps WeChat's code-to-session endpoint (jscode2session) used for mini-program login.","triggerScenarios":"Calling getAccessToken with a js_code that WeChat rejects: invalid code (already used or >5 min old), invalid appid/secret pair, or appid not matching the mini program that issued the code.","commonSituations":"Using the secret from a different mini program, code replayed after a retry, or the js_code expiring (5-minute validity) before the backend exchange.","solutions":["Map errorCode via WeChat docs: 40029 invalid code, 40126 code already used, 45011 rate-limited, -1 system busy then retry","Ensure clientId/clientSecret are the mini program's AppID/AppSecret and the js_code came from wx.login() in THAT mini program","Exchange the code immediately server-side; never cache and replay js_code","Handle 45011 with a retry-after backoff"],"exampleFix":"null","handlingStrategy":"retry","validationCode":"// client side: only exchange codes from wx.login() issued < 5 minutes ago\n// server side: dedupe js_code before exchange\nif (seenCodes.contains(jsCode)) { throw new IllegalStateException(\"code already exchanged\"); }\nseenCodes.add(jsCode);","typeGuard":"null","tryCatchPattern":"try {\n    AuthToken t = qqMiniRequest.getAccessToken(callback);\n} catch (AuthException e) {\n    int code = e.getCode();\n    if (code == 40029 || code == 40126) { /* bad/used js_code → client must call wx.login() again */ }\n    else if (code == 45011) { /* rate limited → backoff */ }\n    else if (code == -1) { /* WeChat busy → single retry */ }\n}","preventionTips":["Call wx.login() fresh for each login attempt; never cache js_code","Keep AppID/AppSecret of the exact mini program in AuthConfig","Handle 45011 with backoff rather than immediate retries"],"tags":["wechat","mini-program","jscode2session","auth-exception"],"backgroundTag":null,"analyzedSha":"694bbf1b010d93404e3bfb4824d90e9ddfaebebb","analyzedAt":"2026-08-14T15:16:59.945Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}