已解决 基础库版本是低于 2.21.2 所以用的老的方式获取得手机号 先获得code2Session,再解密
微信小程序调取获取手机号报40029 是什么问题 ?能接收到前端传过来的code也能请求到token@RequestMapping("/getPhone") public ResponseObject getPhone(String code) throws Exception { log.info(code + ">>>>>>>>>>>>>>"); JSONObject token = JSON.parseObject(HttpClientUtils.doGet(WechatConstant.AUTH_ACCESS_TOKEN_URL)); if (token == null) { log.info("获取token失败"); throw new BussinessException("获取token失败"); } String accessToken = token.getString("access_token"); log.info(accessToken+">>>>>>>>>>>>>>>>>>>>>>>>>"); if (StringUtils.isEmpty(accessToken)) { log.info("获取access_token失败"); throw new BussinessException("获取access_token失败"); } Map jsonCode=new HashMap(); jsonCode.put("code", code); System.out.println("jscode的值是"+jsonCode); //获取手机号 String resPhone = HttpUtil.post("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken, JSON.toJSONString(jsonCode)); log.info(resPhone); if (StringUtils.isEmpty(resPhone) || !resPhone.contains("phone_info") || !resPhone.contains("phoneNumber")) { log.info("测试用"); resPhone = HttpClientUtils.doPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken, JSON.toJSONString(jsonCode)); log.info(resPhone); } JSONObject resPhoneInfo = JSON.parseObject(resPhone); JSONObject phoneInfo = resPhoneInfo.getJSONObject("phone_info"); System.out.println(resPhoneInfo); System.out.println(phoneInfo); String phoneNumber = phoneInfo.get("phoneNumber").toString(); return new ResponseObject(phoneNumber); } [图片] ** * @author 潘彬~ * @version2,0 * HttpUtil工具类 */ @Slf4j public class HttpClientUtils { /** * 默认的字符编码格式 */ private static final String DEFAULT_CHAR_SET = "UTF-8"; /** * 默认连接超时时间 (毫秒) */ private static final Integer DEFAULT_CONNECTION_TIME_OUT = 2000; /** * 默认socket超时时间 (毫秒) */ private static final Integer DEFAULT_SOCKET_TIME_OUT = 3000; /** socketTimeOut上限 */ private static final Integer SOCKET_TIME_OUT_UPPER_LIMIT = 10000; /** socketTimeOut下限 */ private static final Integer SOCKET_TIME_OUT_LOWER_LIMIT = 1000; private static CloseableHttpClient getHttpClient() { RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(DEFAULT_SOCKET_TIME_OUT) .setConnectTimeout(DEFAULT_CONNECTION_TIME_OUT).build(); return HttpClients.custom().setDefaultRequestConfig(requestConfig) .setRetryHandler(new DefaultHttpRequestRetryHandler()).build(); } private static CloseableHttpClient getHttpClient(Integer socketTimeOut) { RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeOut).setConnectTimeout(DEFAULT_CONNECTION_TIME_OUT) .build(); return HttpClients.custom().setDefaultRequestConfig(requestConfig) .setRetryHandler(new DefaultHttpRequestRetryHandler()).build(); } public static String doPost(String url, String requestBody) throws Exception { return doPost(url, requestBody, ContentType.APPLICATION_JSON); } public static String doPost(String url, String requestBody, Integer socketTimeOut) throws Exception { return doPost(url, requestBody, ContentType.APPLICATION_JSON, null, socketTimeOut); } public static String doPost(String url, String requestBody, ContentType contentType) throws Exception { return doPost(url, requestBody, contentType, null); } public static String doPost(String url, String requestBody, List<BasicHeader> headers) throws Exception { return doPost(url, requestBody, ContentType.APPLICATION_JSON, headers); } public static String doPost(String url, String requestBody, ContentType contentType, List<BasicHeader> headers) throws Exception { return doPost(url, requestBody, contentType, headers, getHttpClient()); } public static String doPost(String url, String requestBody, ContentType contentType, List<BasicHeader> headers, Integer socketTimeOut) throws Exception { if (socketTimeOut < SOCKET_TIME_OUT_LOWER_LIMIT || socketTimeOut > SOCKET_TIME_OUT_UPPER_LIMIT) { log.error("socketTimeOut非法"); throw new Exception(); } return doPost(url, requestBody, contentType, headers, getHttpClient(socketTimeOut)); } /** * 通用Post远程服务请求 * @param url * 请求url地址 * @param requestBody * 请求体body * @param contentType * 内容类型 * @param headers * 请求头 * @return String 业务自行解析 * @throws Exception */ public static String doPost(String url, String requestBody, ContentType contentType, List<BasicHeader> headers, CloseableHttpClient client) throws Exception { // 构造http方法,设置请求和传输超时时间,重试3次 CloseableHttpResponse response = null; long startTime = System.currentTimeMillis(); try { HttpPost post = new HttpPost(url); if (!CollectionUtils.isEmpty(headers)) { for (BasicHeader header : headers) { post.setHeader(header); } } StringEntity entity = new StringEntity(requestBody, ContentType.create(contentType.getMimeType(), DEFAULT_CHAR_SET)); post.setEntity(entity); response = client.execute(post); if (response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) { log.error("业务请求返回失败:{}", EntityUtils.toString(response.getEntity())); throw new Exception(); } String result = EntityUtils.toString(response.getEntity()); return result; } finally { releaseResourceAndLog(url, requestBody, response, startTime); } } /** * 暂时用于智慧园区业务联调方式 * @param url 业务请求url * @param param 业务参数 * @return * @throws Exception */ public static String doPostWithUrlEncoded(String url, Map<String, String> param) throws Exception { // 创建Httpclient对象 CloseableHttpClient httpClient = getHttpClient(); CloseableHttpResponse response = null; long startTime = System.currentTimeMillis(); try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); // 创建参数列表 if (param != null) { List<org.apache.http.NameValuePair> paramList = new ArrayList<>(); for (String key : param.keySet()) { paramList.add(new BasicNameValuePair(key, param.get(key))); } // 模拟表单 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, DEFAULT_CHAR_SET); httpPost.setEntity(entity); } // 执行http请求 response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) { log.error("业务请求返回失败:{}" , EntityUtils.toString(response.getEntity())); throw new Exception(); } String resultString = EntityUtils.toString(response.getEntity(), DEFAULT_CHAR_SET); return resultString; } finally { releaseResourceAndLog(url, param == null ? null : param.toString(), response, startTime); } } private static void releaseResourceAndLog(String url, String request, CloseableHttpResponse response, long startTime) { if (null != response) { try { response.close(); recordInterfaceLog(startTime, url, request); } catch (IOException e) { log.error(e.getMessage()); } } } public static String doGet(String url) throws Exception { return doGet(url, ContentType.DEFAULT_TEXT); } public static String doGet(String url, ContentType contentType) throws Exception { return doGet(url, contentType, null); } public static String doGet(String url, List<BasicHeader> headers) throws Exception { return doGet(url, ContentType.DEFAULT_TEXT, headers); } /** * 通用Get远程服务请求 * @param url * 请求参数 * @param contentType * 请求参数类型 * @param headers * 请求头可以填充 * @return String 业务自行解析数据 * @throws Exception */ public static String doGet(String url, ContentType contentType, List<BasicHeader> headers) throws Exception { CloseableHttpResponse response = null; long startTime = System.currentTimeMillis(); try { CloseableHttpClient client = getHttpClient(); HttpGet httpGet = new HttpGet(url); if (!CollectionUtils.isEmpty(headers)) { for (BasicHeader header : headers) { httpGet.setHeader(header); } } if(contentType != null){ httpGet.setHeader("Content-Type", contentType.getMimeType()); } response = client.execute(httpGet); if (response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) { log.error("业务请求返回失败:{}", EntityUtils.toString(response.getEntity())); throw new Exception(); } String result = EntityUtils.toString(response.getEntity()); return result; } finally { releaseResourceAndLog(url, null, response, startTime); } } private static void recordInterfaceLog(long startTime, String url, String request) { long endTime = System.currentTimeMillis(); long timeCost = endTime - startTime; MDC.put("totalTime", String.valueOf(timeCost)); MDC.put("url", url); MDC.put("logType", "third-platform-service"); log.info("HttpClientSslUtils 远程请求:{} 参数:{} 耗时:{}ms", url, request, timeCost); } }
2023-01-18请问最后的解决办法是什么
通过授权code获取手机号,提示40029报错https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html 前端获取的是手机的授权code,与登录的授权code都打印出来了,做了区分 [图片][图片] 后端通过code获取手机号报错 前面打印的是生成的token,code是通过json参数传入的,不知道哪里报错,报的code失效,但是每次都是新的code呀 [图片]
2023-01-17