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"));
}
}
