code只有一次有效。无论调用成功与否,只要发起httprequest,这个code就被消费掉了。需要重新获取code。
微信移动应用授权登录获取code为失效状态?我想接入移动应用授权登录 看文档第一步是需要前端获取code 然后根据code获取token 再去获取微信用户信息 在前端返回code 后端使用code时 返回 获取token失败 errcode:40029 errmsg:invalid code, rid: 642e85f6-62ecda1a-3184a702 下面是前端代码: [图片] [图片] [图片] 下面是后端代码: APPID 是 wx2cd52e3d8f6d4f8d // 凭证获取(GET) public final static String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; /** * 获取接口访问凭证 * @param code app授权后传回 * @return */ public static WechatTokenEntity getToken(String code) { WechatTokenEntity token = new WechatTokenEntity(); String requestUrl = tokenUrl.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code); // 发起GET请求获取凭证 JSONObject jsonObject = httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try { token.setUnionId(jsonObject.getString("unionid")); token.setOpenid(jsonObject.getString("openid")); token.setAccessToken(jsonObject.getString("access_token")); token.setRefreshToken(jsonObject.getString("refresh_token")); token.setExpiresIn(jsonObject.getInt("expires_in")); } catch (JSONException e) { token = null; // 获取token失败 log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); } } return 这个是调用获取code的https请求代码 /** * 发送https请求 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get ( key)的方式获取json对象的属性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; try { // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = {new WechatTrustManager()}; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求方式(GET/POST) conn.setRequestMethod(requestMethod); // 当outputStr不为null时向输出流写数据 if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意编码格式 outputStream.write(outputStr.getBytes(StandardCharsets.UTF_8)); outputStream.close(); } // 从输入流读取返回内容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuilder stringBuilder = new StringBuilder(); while ((str = bufferedReader.readLine()) != null) { stringBuilder.append(str); } // 释放资源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); jsonObject = JSONObject.fromObject(stringBuilder.toString()); } catch (ConnectException ce) { System.err.printf("连接超时:{}", ce); } catch (Exception e) { System.err.printf("https请求异常:{}", e); } return jsonObject; }
2023-04-06