From 2b54bc8222dc30a237716ad598de2aa6d4f28655 Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Wed, 16 Apr 2025 19:52:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../heyu/api/data/constants/ApiConstants.java | 7 + .../heyu/api/data/dao/api/ApiIdCardDao.java | 8 +- .../api/data/entity/api/ApiIdCardEntity.java | 56 ++++++- .../data/service/api/ApiIdCardService.java | 2 +- .../impl/api/ApiIdCardServiceImpl.java | 2 +- .../heyu/api/tencent/TencentBaseHandle.java | 9 +- .../handle/TIdCardOCRVerificationHandle.java | 40 ++++- .../ThirdTIdCardVerificationHandle.java | 112 +++++++++++++ .../api/tencent/resp/ThirdIdCardResp.java | 71 ++++++++ .../java/com/heyu/api/utils/ThirdUtils.java | 158 ++++++++++++++++++ .../IdCardOCRVerificationController.java | 15 ++ .../src/test/java/com/api/test/Demo.java | 136 +-------------- 12 files changed, 469 insertions(+), 147 deletions(-) create mode 100644 api-third/src/main/java/com/heyu/api/tencent/handle/ThirdTIdCardVerificationHandle.java create mode 100644 api-third/src/main/java/com/heyu/api/tencent/resp/ThirdIdCardResp.java create mode 100644 api-third/src/main/java/com/heyu/api/utils/ThirdUtils.java diff --git a/api-mapper/src/main/java/com/heyu/api/data/constants/ApiConstants.java b/api-mapper/src/main/java/com/heyu/api/data/constants/ApiConstants.java index e749485..fb8dd04 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/constants/ApiConstants.java +++ b/api-mapper/src/main/java/com/heyu/api/data/constants/ApiConstants.java @@ -312,4 +312,11 @@ public class ApiConstants { public static final String tencent = "tencent"; + + /*** + * 第三方 + */ + public static final String third = "third"; + + } diff --git a/api-mapper/src/main/java/com/heyu/api/data/dao/api/ApiIdCardDao.java b/api-mapper/src/main/java/com/heyu/api/data/dao/api/ApiIdCardDao.java index 79f23e2..647c052 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/dao/api/ApiIdCardDao.java +++ b/api-mapper/src/main/java/com/heyu/api/data/dao/api/ApiIdCardDao.java @@ -5,7 +5,7 @@ package com.heyu.api.data.dao.api; *

* * @author quyixiao -* @since 2025-04-14 +* @since 2025-04-16 */ import com.heyu.api.data.entity.api.ApiIdCardEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -35,5 +35,9 @@ public interface ApiIdCardDao extends BaseMapper { @LIMIT - ApiIdCardEntity selectApiIdCardByIdCardNameChannel(String idCard, String realName, String channel); + ApiIdCardEntity selectApiIdCardByIdCardNameChannelEnableStatus(String idCard, String realName, String channel,Integer enableStatus); + + + + int updateApiIdCardUseCountById(Long useCount, Long id); } \ No newline at end of file diff --git a/api-mapper/src/main/java/com/heyu/api/data/entity/api/ApiIdCardEntity.java b/api-mapper/src/main/java/com/heyu/api/data/entity/api/ApiIdCardEntity.java index ed8c584..c970e61 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/entity/api/ApiIdCardEntity.java +++ b/api-mapper/src/main/java/com/heyu/api/data/entity/api/ApiIdCardEntity.java @@ -10,7 +10,7 @@ import java.util.Date;import java.util.Date; /** *账户表 * @author quyixiao -* @since 2025-04-14 +* @since 2025-04-16 */ @Data @@ -21,14 +21,16 @@ private static final long serialVersionUID = 1L; public final static String CLASS_NAME ="com.heyu.api.data.entity.api.ApiIdCardEntity:"; public final static String all = CLASS_NAME + "*"; - public final static String id_ = CLASS_NAME + "id"; // 主键id - public final static String is_delete = CLASS_NAME + "is_delete"; // 是否删除:0 否 1 删除 - public final static String create_time = CLASS_NAME + "create_time"; // 创建时间 - public final static String modify_time = CLASS_NAME + "modify_time"; // 修改时间 - public final static String id_card = CLASS_NAME + "id_card"; // 身份证 - public final static String real_name = CLASS_NAME + "real_name"; // 真实姓名 - public final static String api_result = CLASS_NAME + "api_result"; // 结果 - public final static String channel_ = CLASS_NAME + "channel"; // 渠道 + public final static String id_ = CLASS_NAME + "id"; // 主键id + public final static String is_delete = CLASS_NAME + "is_delete"; // 是否删除:0 否 1 删除 + public final static String create_time = CLASS_NAME + "create_time"; // 创建时间 + public final static String modify_time = CLASS_NAME + "modify_time"; // 修改时间 + public final static String id_card = CLASS_NAME + "id_card"; // 身份证 + public final static String real_name = CLASS_NAME + "real_name"; // 真实姓名 + public final static String api_result = CLASS_NAME + "api_result"; // 结果 + public final static String channel_ = CLASS_NAME + "channel"; // 渠道 + public final static String use_count = CLASS_NAME + "use_count"; // 使用次数 + public final static String enable_status = CLASS_NAME + "enable_status"; // 0 不可用,1 可用 //主键id @TableId(value = "id", type = IdType.AUTO) private Long id; @@ -46,6 +48,10 @@ private static final long serialVersionUID = 1L; private String apiResult; //渠道 private String channel; + //使用次数 + private Long useCount; + //0 不可用,1 可用 + private Integer enableStatus; /** * 主键id * @return @@ -166,6 +172,36 @@ private static final long serialVersionUID = 1L; this.channel = channel; } + /** + * 使用次数 + * @return + */ + public Long getUseCount() { + return useCount; + } + /** + * 使用次数 + * @param useCount + */ + public void setUseCount(Long useCount) { + this.useCount = useCount; + } + + /** + * 0 不可用,1 可用 + * @return + */ + public Integer getEnableStatus() { + return enableStatus; + } + /** + * 0 不可用,1 可用 + * @param enableStatus + */ + public void setEnableStatus(Integer enableStatus) { + this.enableStatus = enableStatus; + } + @Override public String toString() { return "ApiIdCardEntity{" + @@ -177,6 +213,8 @@ private static final long serialVersionUID = 1L; ",realName=" + realName + ",apiResult=" + apiResult + ",channel=" + channel + + ",useCount=" + useCount + + ",enableStatus=" + enableStatus + "}"; } } \ No newline at end of file diff --git a/api-mapper/src/main/java/com/heyu/api/data/service/api/ApiIdCardService.java b/api-mapper/src/main/java/com/heyu/api/data/service/api/ApiIdCardService.java index beafce6..d5d083c 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/service/api/ApiIdCardService.java +++ b/api-mapper/src/main/java/com/heyu/api/data/service/api/ApiIdCardService.java @@ -5,7 +5,7 @@ package com.heyu.api.data.service.api; *

* * @author quyixiao -* @since 2025-04-14 +* @since 2025-04-16 */ import com.baomidou.mybatisplus.extension.service.IService; import com.heyu.api.data.entity.api.ApiIdCardEntity; diff --git a/api-mapper/src/main/java/com/heyu/api/data/service/impl/api/ApiIdCardServiceImpl.java b/api-mapper/src/main/java/com/heyu/api/data/service/impl/api/ApiIdCardServiceImpl.java index f0c8211..6a578c1 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/service/impl/api/ApiIdCardServiceImpl.java +++ b/api-mapper/src/main/java/com/heyu/api/data/service/impl/api/ApiIdCardServiceImpl.java @@ -5,7 +5,7 @@ package com.heyu.api.data.service.impl.api; *

* * @author quyixiao -* @since 2025-04-14 +* @since 2025-04-16 */ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java b/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java index 2170ee0..8c5f673 100644 --- a/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java +++ b/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java @@ -23,12 +23,19 @@ public abstract class TencentBaseHandle { return ApiR.error(check); } RR r = run(p); + + if(r == null){ + log.error("TencentBaseHandle run failed : {}", JSON.toJSONString(p)); + return ApiR.error("服务器异常请稍后重试"); + } + log.info("TencentBaseHandle result : {}", JSON.toJSONString(r)); return ApiR.setData(r).setReceiveMoney(true); } catch (Exception e) { log.error("请求腾讯异常", e); } - return ApiR.error("未知异常"); + log.error("TencentBaseHandle run end failed : {}", JSON.toJSONString(p)); + return ApiR.error("服务器异常请稍后重试"); } public abstract RR run(P ap) throws Exception; diff --git a/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java b/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java index 75a8574..486bc03 100644 --- a/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java +++ b/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java @@ -62,10 +62,10 @@ public class TIdCardOCRVerificationHandle extends TencentBaseHandle { + + + + @Autowired + private ApiIdCardDao apiIdCardDao; + + @Override + public String check(TTIdCardOCRVerificationRequest ttIdCardOCRVerificationRequest) { + if (StringUtils.isNotBlank(ttIdCardOCRVerificationRequest.getIdCard()) + && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getName())) { + return "姓名不能为空"; + } + + + if (StringUtils.isBlank(ttIdCardOCRVerificationRequest.getIdCard()) + && StringUtils.isNotBlank(ttIdCardOCRVerificationRequest.getName())) { + return "身份证号不能为空"; + } + + if (StringUtils.isBlank(ttIdCardOCRVerificationRequest.getIdCard()) + && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getName()) + && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getImageBase64()) + && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getImageUrl()) + ) { + return "姓名身份证号以及图片不能同时为空"; + } + return null; + } + + + /*** + * 注意: + * 1.解析:先判断error_code为0仅代表端口通讯成功再看业务逻辑码isok值当isok为true为匹配 false为不匹配。 + * 2.出现'库无'时 "error_code":206501,有以下几种原因 + * + * + * (1)现役军人、武警官兵、特殊部门人员及特殊级别官员; + * (2)退役不到2年的军人和士兵(根据军衔、兵种不同,时间会有所不同,一般为2年); + * (3)户口迁出,且没有在新的迁入地迁入 eg:刚上大学或刚毕业的大学生; + * (4)户口迁入新迁入地,当地公安系统未将迁移信息上报到公安部(上报时间地域不同而有所差异); + * (5)更改姓名,当地公安系统未将更改信息上报到公安部(上报时间因地域不同而有所差异); + * (6)移民; + * (7)未更换二代身份证; + * (8)死亡。 + * (9)身份证号确实不存在 + */ + @Override + public ThirdIdCardResp run(TTIdCardOCRVerificationRequest ap) throws Exception { + ThirdIdCardResp resp = null; + if (StringUtils.isNotBlank(ap.getIdCard()) && StringUtils.isNotBlank(ap.getName())) { + ApiIdCardEntity apiIdCardEntity = apiIdCardDao.selectApiIdCardByIdCardNameChannelEnableStatus(ap.getIdCard(), ap.getName(), ApiConstants.third, 1); + if (apiIdCardEntity != null) { + resp = JSONObject.parseObject(apiIdCardEntity.getApiResult(), ThirdIdCardResp.class); + apiIdCardDao.updateApiIdCardUseCountById(apiIdCardEntity.getUseCount(), apiIdCardEntity.getId()); + return resp; + } + } + ThirdIdCardResp thirdIdCardResp = ThirdUtils.getIdCard(ap.getIdCard(), ap.getName()); + if(thirdIdCardResp ==null){ + + return null; + } + + int enable = 1 ; + if(!"0".equals(thirdIdCardResp.getErrorCode()+"")){ + enable = 0 ; + } + + ApiIdCardEntity apiIdCardEntity = new ApiIdCardEntity(); + apiIdCardEntity.setIdCard(ap.getIdCard()); + apiIdCardEntity.setRealName(ap.getName()); + apiIdCardEntity.setChannel(ApiConstants.tencent); + apiIdCardEntity.setApiResult(JSON.toJSONString(resp)); + apiIdCardEntity.setEnableStatus(enable); + apiIdCardEntity.setUseCount(1L); + apiIdCardDao.insertApiIdCard(apiIdCardEntity); + return resp; + } +} diff --git a/api-third/src/main/java/com/heyu/api/tencent/resp/ThirdIdCardResp.java b/api-third/src/main/java/com/heyu/api/tencent/resp/ThirdIdCardResp.java new file mode 100644 index 0000000..9a77055 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/tencent/resp/ThirdIdCardResp.java @@ -0,0 +1,71 @@ +package com.heyu.api.tencent.resp; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.heyu.api.data.dto.BaseResp; +import lombok.Data; +import lombok.NoArgsConstructor; + +/*** + * { + * "error_code": 0, + * "reason": "成功", + * "result": { + * "realname": "胡**", + * "idcard": "360311***********7", + * "isok": true, + * "IdCardInfor": { + * "province": "江西省", + * "city": "萍乡市", + * "district": "上栗区", + * "area": "江西省萍乡市上栗区", + * "sex": "女", + * "birthday": "1993-3-8" + * } * }, + * "sn": "041619150790665135760208371" + * } + */ +@NoArgsConstructor +@Data +public class ThirdIdCardResp extends BaseResp { + + + @JsonProperty("error_code") + private Integer errorCode; + @JsonProperty("reason") + private String reason; + @JsonProperty("result") + private ResultDTO result; + @JsonProperty("sn") + private String sn; + + @NoArgsConstructor + @Data + public static class ResultDTO { + @JsonProperty("realname") + private String realname; + @JsonProperty("idcard") + private String idcard; + @JsonProperty("isok") + private Boolean isok; + @JsonProperty("IdCardInfor") + private IdCardInforDTO idCardInfor; + + @NoArgsConstructor + @Data + public static class IdCardInforDTO { + @JsonProperty("province") + private String province; + @JsonProperty("city") + private String city; + @JsonProperty("district") + private String district; + @JsonProperty("area") + private String area; + @JsonProperty("sex") + private String sex; + @JsonProperty("birthday") + private String birthday; + } + } +} diff --git a/api-third/src/main/java/com/heyu/api/utils/ThirdUtils.java b/api-third/src/main/java/com/heyu/api/utils/ThirdUtils.java new file mode 100644 index 0000000..aba7fcf --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/utils/ThirdUtils.java @@ -0,0 +1,158 @@ +package com.heyu.api.utils; + +import com.alibaba.fastjson.JSONObject; +import com.heyu.api.tencent.resp.ThirdIdCardResp; +import lombok.extern.slf4j.Slf4j; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Slf4j +public class ThirdUtils { + + public static String calcAuthorization(String secretId, String secretKey, String datetime) + throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { + String signStr = "x-date: " + datetime; + Mac mac = Mac.getInstance("HmacSHA1"); + Key sKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm()); + mac.init(sKey); + byte[] hash = mac.doFinal(signStr.getBytes("UTF-8")); + //String sig = new Base64Encoder().encode(hash); + + + Base64.Encoder encoder = Base64.getMimeEncoder(); + String sig= encoder.encodeToString(hash); + + + + String auth = "{\"id\":\"" + secretId + "\", \"x-date\":\"" + datetime + "\", \"signature\":\"" + sig + "\"}"; + return auth; + } + + public static String urlencode(Map map) throws UnsupportedEncodingException { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + if (sb.length() > 0) { + sb.append("&"); + } + sb.append(String.format("%s=%s", + URLEncoder.encode(entry.getKey().toString(), "UTF-8"), + URLEncoder.encode(entry.getValue().toString(), "UTF-8") + )); + } + return sb.toString(); + } + + public static ThirdIdCardResp getIdCard(String idcardNumber , String realName){ + BufferedReader in = null; + try { + //云市场分配的密钥Id + String secretId = "32GyIZXijjQqtaTx"; + //云市场分配的密钥Key + String secretKey = "8drHlKmmphKWNxEidbRDMbV9zA3WX8Cn"; + + Calendar cd = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US); + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + String datetime = sdf.format(cd.getTime()); + // 签名 + String auth = ThirdUtils.calcAuthorization(secretId, secretKey, datetime); + // 请求方法 + String method = "POST"; + // 请求头 + String uuid = UUID.randomUUID().toString(); + Map headers = new HashMap(); + headers.put("request-id", uuid); + headers.put("Authorization", auth); + + // 查询参数 + Map queryParams = new HashMap(); + + // body参数 + Map bodyParams = new HashMap(); + //bodyParams.put("cardNo","430529199209255030"); + //bodyParams.put("realName","瞿贻晓"); + + //bodyParams.put("cardNo","360428198505100418"); + //bodyParams.put("realName","吴林"); + + + bodyParams.put("cardNo",idcardNumber); + bodyParams.put("realName",realName); + String bodyParamStr = ThirdUtils.urlencode(bodyParams); + + // url参数拼接 + String url = "https://ap-beijing.cloudmarket-apigw.com/service-18c38npd/idcard/VerifyIdcardv2"; + if (!queryParams.isEmpty()) { + url += "?" + ThirdUtils.urlencode(queryParams); + } + + URL realUrl = new URL(url); + HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + conn.setRequestMethod(method); + + // request headers + for (Map.Entry entry : headers.entrySet()) { + conn.setRequestProperty(entry.getKey(), entry.getValue()); + } + + // request body + Map methods = new HashMap<>(); + methods.put("POST", true); + methods.put("PUT", true); + methods.put("PATCH", true); + Boolean hasBody = methods.get(method); + if (hasBody != null) { + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + + conn.setDoOutput(true); + DataOutputStream out = new DataOutputStream(conn.getOutputStream()); + out.writeBytes(bodyParamStr); + out.flush(); + out.close(); + } + + // 定义 BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + String result = ""; + while ((line = in.readLine()) != null) { + result += line; + } + + + log.info("ThirdIdCard get idcardNumber:{},realName:{},result:{}", idcardNumber,realName, result); + + ThirdIdCardResp thirdIdCardResp = JSONObject.parseObject(result, ThirdIdCardResp.class); + return thirdIdCardResp; + + } catch (Exception e) { + System.out.println(e); + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return null; + + } +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java index 5c64c56..5b288a9 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java @@ -42,6 +42,7 @@ public class IdCardOCRVerificationController { @Autowired private TIdCardOCRVerificationHandle tIdCardOCRVerificationHandle; + // http://localhost:8888/idcard/verification?idCardNumber=430529199209255030&realName=瞿贻晓 // https://api.1024api.com/api-interface/bank/card/2/verify?bankCardNumber=6214855713516769&realName=瞿贻晓 @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH) @@ -55,6 +56,20 @@ public class IdCardOCRVerificationController { if (apiR.isSuccess()) { IdCardOCRVerificationResponse idCardOCRVerificationResponse = apiR.getData(); if (idCardOCRVerificationResponse != null) { + /*** + * 认证结果码,收费情况如下。 + * - 收费结果码: + * 0: 姓名和身份证号一致。 + * -1: 姓名和身份证号不一致。 + * - 不收费结果码: + * -2: 非法身份证号(长度、校验位等不正确)。 + * -3: 非法姓名(长度、格式等不正确)。 + * -4: 证件库服务异常。 + * -5: 证件库中无此身份证记录。 + * -6: 权威比对系统升级中,请稍后再试。 + * -7: 认证次数超过当日限制。 + * 示例值:0 + */ if ("0".equals(idCardOCRVerificationResponse.getResult())) { idCardOCRVerificationResp.setCode("1"); // 姓名和身份证号一致。 diff --git a/api-web/api-interface/src/test/java/com/api/test/Demo.java b/api-web/api-interface/src/test/java/com/api/test/Demo.java index 579cb28..aa06a81 100644 --- a/api-web/api-interface/src/test/java/com/api/test/Demo.java +++ b/api-web/api-interface/src/test/java/com/api/test/Demo.java @@ -1,147 +1,23 @@ package com.api.test; -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.InputStreamReader; +import com.alibaba.fastjson.JSON; +import com.heyu.api.tencent.resp.ThirdIdCardResp; +import com.heyu.api.utils.ThirdUtils; + import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; import java.security.InvalidKeyException; -import java.security.Key; import java.security.NoSuchAlgorithmException; -import java.text.SimpleDateFormat; -import java.util.*; class Demo { - public static String calcAuthorization(String secretId, String secretKey, String datetime) - throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { - String signStr = "x-date: " + datetime; - Mac mac = Mac.getInstance("HmacSHA1"); - Key sKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm()); - mac.init(sKey); - byte[] hash = mac.doFinal(signStr.getBytes("UTF-8")); - //String sig = new Base64Encoder().encode(hash); - Base64.Encoder encoder = Base64.getMimeEncoder(); - String sig= encoder.encodeToString(hash); - - - - String auth = "{\"id\":\"" + secretId + "\", \"x-date\":\"" + datetime + "\", \"signature\":\"" + sig + "\"}"; - return auth; - } - - public static String urlencode(Map map) throws UnsupportedEncodingException { - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : map.entrySet()) { - if (sb.length() > 0) { - sb.append("&"); - } - sb.append(String.format("%s=%s", - URLEncoder.encode(entry.getKey().toString(), "UTF-8"), - URLEncoder.encode(entry.getValue().toString(), "UTF-8") - )); - } - return sb.toString(); - } - public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { - //云市场分配的密钥Id - String secretId = "32GyIZXijjQqtaTx"; - //云市场分配的密钥Key - String secretKey = "8drHlKmmphKWNxEidbRDMbV9zA3WX8Cn"; - - Calendar cd = Calendar.getInstance(); - SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US); - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - String datetime = sdf.format(cd.getTime()); - // 签名 - String auth = calcAuthorization(secretId, secretKey, datetime); - // 请求方法 - String method = "POST"; - // 请求头 - String uuid = UUID.randomUUID().toString(); - Map headers = new HashMap(); - headers.put("request-id", uuid); - headers.put("Authorization", auth); - - // 查询参数 - Map queryParams = new HashMap(); - - // body参数 - Map bodyParams = new HashMap(); - //bodyParams.put("cardNo","430529199209255030"); - //bodyParams.put("realName","瞿贻晓"); - - //bodyParams.put("cardNo","360428198505100418"); - //bodyParams.put("realName","吴林"); - bodyParams.put("cardNo","360311199303080027"); - bodyParams.put("realName","胡凯敏"); - String bodyParamStr = urlencode(bodyParams); + ThirdIdCardResp thirdIdCardResp = ThirdUtils.getIdCard("4305291992092","瞿晓"); - // url参数拼接 - String url = "https://ap-beijing.cloudmarket-apigw.com/service-18c38npd/idcard/VerifyIdcardv2"; - if (!queryParams.isEmpty()) { - url += "?" + urlencode(queryParams); - } - - BufferedReader in = null; - try { - URL realUrl = new URL(url); - HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); - conn.setConnectTimeout(5000); - conn.setReadTimeout(5000); - conn.setRequestMethod(method); - - // request headers - for (Map.Entry entry : headers.entrySet()) { - conn.setRequestProperty(entry.getKey(), entry.getValue()); - } - - // request body - Map methods = new HashMap<>(); - methods.put("POST", true); - methods.put("PUT", true); - methods.put("PATCH", true); - Boolean hasBody = methods.get(method); - if (hasBody != null) { - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - - conn.setDoOutput(true); - DataOutputStream out = new DataOutputStream(conn.getOutputStream()); - out.writeBytes(bodyParamStr); - out.flush(); - out.close(); - } - - // 定义 BufferedReader输入流来读取URL的响应 - in = new BufferedReader(new InputStreamReader(conn.getInputStream())); - String line; - String result = ""; - while ((line = in.readLine()) != null) { - result += line; - } - - System.out.println(result); - } catch (Exception e) { - System.out.println(e); - e.printStackTrace(); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (Exception e2) { - e2.printStackTrace(); - } - } + System.out.println(JSON.toJSONString(thirdIdCardResp)); } } \ No newline at end of file