收藏
回答

调用getverifyid,提示412,为什么?

AppID
wx9c6fd2434fe9fcef

412 Precondition Failed on POST request for "https://api.weixin.qq.com/cityservice/face/identify/getverifyid": [no body]

	public String getVerifyId(String openid, String name, String idCard) {
    // 1. 获取有效的 access_token
    String accessToken = this.getAccessToken();
    String url = "https://api.weixin.qq.com/cityservice/face/identify/getverifyid?access_token=" + accessToken;

    // 3. 构建请求体 (Request Payload)
    Map<String, Object> requestBody = new HashMap<>();
    // 生成一个唯一的业务流水号,例如:UUID + 时间戳
    // 推荐格式:业务前缀 + 时间戳 + 随机数,确保5-32字符且仅包含数字字母_-
    String outSeqNo = "FACE_" + System.currentTimeMillis() + "_" +
        UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8);
    requestBody.put("out_seq_no", outSeqNo);
    requestBody.put("openid", openid);

    Map<String, String> certInfo = new HashMap<>();
    certInfo.put("cert_type", "IDENTITY_CARD"); // 固定值
    certInfo.put("cert_name", name);
    certInfo.put("cert_no", idCard);
    requestBody.put("cert_info", certInfo);
    // 打印请求日志便于调试
    log.info("getVerifyId 请求参数: {}", com.alibaba.fastjson.JSON.toJSONString(requestBody));
    // 4. 发送POST请求
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestBody, headers);
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, entity, Map.class);
    Map<String, Object> result = response.getBody();

    // 5. 处理返回结果
    if (result != null && Integer.valueOf(0).equals(result.get("errcode"))) {
        // 成功,返回verify_id
        String verifyId = (String) result.get("verify_id");
        // 将 out_seq_no, verify_id, openid 等信息存入Redis缓存起来
        // 以便在最后一步核验时使用
        WeChatVerifyObj weChatVerifyObj = new WeChatVerifyObj();
        weChatVerifyObj.setVerifyId(verifyId);
        weChatVerifyObj.setOpenid(openid);
        weChatVerifyObj.setOutSeqNo(outSeqNo);
        RedisUtils.setCacheObject(openid + "verify_id", weChatVerifyObj);

        return verifyId;
    } else {
        // 失败,根据官方文档处理错误码
        assert result != null;
        throw new RuntimeException("获取verifyId失败: " + result.get("errmsg"));
    }
}


回答关注问题邀请回答
收藏

1 个回答

  • 智能回答 智能回答 本次回答由AI生成
    03-31
    有用
    回复 1
    • 海龙😃 😃
      海龙😃 😃
      03-31
      请求参数: {"openid":"oxDhY1-NRVxGOimd4_7jvhqhdWtA","out_seq_no":"FACE_1774917558242_bdcbaf28","cert_info":{"cert_type":"IDENTITY_CARD","cert_name":"郑*龙","cert_no":"15040319870726****"}}<br />返回错误:<br />org.springframework.web.client.HttpClientErrorException: 412 Precondition Failed on POST request for "<a href='https://api.weixin.qq.com/cityservice/face/identify/getverifyid"' target='_blank'>https://api.weixin.qq.com/cityservice/face/identify/getverifyid"</a>: [no body]<br /> at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:136)<br /> at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186)<br /> at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:147)<br /> at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:953)<br /> at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:902)<br /> at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801)<br /> at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:683)<br /> at org.dromara.system.service.impl.WeChatUtilServiceImpl.getVerifyId(WeChatUtilServiceImpl.java:106)<br /> at org.dromara.kaoqinwechat.service.impl.WeChatDaKaServiceImpl.getVerifyId(WeChatDaKaServiceImpl.java:25)<br /> at org.dromara.kaoqinwechat.controller.WeChatDaKaController.getVerifyId(WeChatDaKaController.java:22)<br /> at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)<br /> at java.base/java.lang.reflect.Method.invoke(Method.java:580)<br /> at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)<br /> at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)<br /> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)<br /> at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:174)<br /> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)<br /> at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)<br /> at org.dromara.kaoqinwechat.controller.WeChatDaKaController$$SpringCGLIB$$0.getVerifyId(<generated>)<br /> at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)<br /> at java.base/java.lang.reflect.Method.invoke(Method.java:580)<br /> at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)<br /> at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)<br /> at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)<br /> at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986)<br /> at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891)<br /> at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)<br /> at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)<br /> at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)<br /> at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)<br /> at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)<br /> at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)<br /> at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)<br /> at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)<br /> at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)<br /> at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)<br /> at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.dromara.common.web.filter.RepeatableFilter.doFilter(RepeatableFilter.java:32)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at cn.dev33.satoken.filter.SaServletFilter.doFilter(SaServletFilter.java:143)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at cn.dev33.satoken.filter.SaFirewallCheckFilterForJakartaServlet.doFilter(SaFirewallCheckFilterForJakartaServlet.java:69)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at cn.dev33.satoken.filter.SaTokenCorsFilterForJakartaServlet.doFilter(SaTokenCorsFilterForJakartaServlet.java:52)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at cn.dev33.satoken.filter.SaTokenContextFilterForJakartaServlet.doFilter(SaTokenContextFilterForJakartaServlet.java:40)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)<br /> at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)<br /> at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:114)<br /> at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.dromara.common.web.filter.XssFilter.doFilter(XssFilter.java:38)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)<br /> at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at org.dromara.common.encrypt.filter.CryptoFilter.doFilter(CryptoFilter.java:70)<br /> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)<br /> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)<br /> at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)<br /> at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)<br /> at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)<br /> at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)<br /> at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)<br /> at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)<br /> at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)<br /> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)<br /> at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)<br /> at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)<br /> at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)<br /> at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)<br /> at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)<br /> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)<br /> at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)<br /> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)<br /> at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)<br /> at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)<br /> at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)<br /> at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)<br /> at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)<br /> at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)<br /> at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:101)<br /> at io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)<br /> at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)<br /> at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)<br /> at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)<br /> at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)<br /> at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)<br /> at java.base/java.lang.Thread.run(Thread.java:1583)
      03-31
      回复
登录 后发表内容