BaiduAi.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.nuliji.tools.third.baidu;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.nuliji.tools.Tools;
  4. import com.nuliji.tools.Transform;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.http.HttpEntity;
  8. import org.springframework.http.HttpHeaders;
  9. import org.springframework.http.MediaType;
  10. import org.springframework.util.LinkedMultiValueMap;
  11. import org.springframework.util.MultiValueMap;
  12. import org.springframework.web.client.RestTemplate;
  13. import java.io.File;
  14. import java.io.UnsupportedEncodingException;
  15. import java.net.URLEncoder;
  16. import java.util.*;
  17. public class BaiduAi {
  18. private static final Logger logger = LoggerFactory.getLogger(BaiduAi.class);
  19. final static String api = "https://aip.baidubce.com/rest/2.0/";
  20. private String appKey = "";
  21. private String appSecret = "";
  22. private static Map<String, String> tokenMap = new HashMap<>();
  23. private static Map<String, Date> tokenExpiresIn = new HashMap<>();
  24. public BaiduAi(String appKey, String appSecret){
  25. this.appKey = appKey;
  26. this.appSecret = appSecret;
  27. }
  28. public enum IdcardSide {
  29. FRONT("front"), BACK("back");
  30. public String key;
  31. private IdcardSide(String key){
  32. this.key = key;
  33. }
  34. public static IdcardSide ValueOf(String name){
  35. if (name == null) return null;
  36. return IdcardSide.valueOf(name.toUpperCase());
  37. }
  38. }
  39. public enum IdcardResult {
  40. ADDRESS("住址"), ID("公民身份号码"), BIRTH("出生"), NAME("姓名"), GENDER("性别"), NATION("民族");
  41. public String key;
  42. private IdcardResult(String key){
  43. this.key = key;
  44. }
  45. public static IdcardResult ValueOf(String name){
  46. if (name == null) return null;
  47. return IdcardResult.valueOf(name.toUpperCase());
  48. }
  49. }
  50. public class IdcardResponse{
  51. private Integer direction;
  52. private String image_status;
  53. private String risk_type;
  54. private String edit_tool;
  55. private JSONObject words_result;
  56. private Integer words_result_num;
  57. public Integer getDirection() {
  58. return direction;
  59. }
  60. public void setDirection(Integer direction) {
  61. this.direction = direction;
  62. }
  63. public String getImage_status() {
  64. return image_status;
  65. }
  66. public void setImage_status(String image_status) {
  67. this.image_status = image_status;
  68. }
  69. public String getRisk_type() {
  70. return risk_type;
  71. }
  72. public void setRisk_type(String risk_type) {
  73. this.risk_type = risk_type;
  74. }
  75. public String getEdit_tool() {
  76. return edit_tool;
  77. }
  78. public void setEdit_tool(String edit_tool) {
  79. this.edit_tool = edit_tool;
  80. }
  81. public JSONObject getWords_result() {
  82. return words_result;
  83. }
  84. public void setWords_result(JSONObject words_result) {
  85. this.words_result = words_result;
  86. }
  87. public Integer getWords_result_num() {
  88. return words_result_num;
  89. }
  90. public void setWords_result_num(Integer words_result_num) {
  91. this.words_result_num = words_result_num;
  92. }
  93. }
  94. /**
  95. * 身份证识别
  96. * @return
  97. */
  98. public IdcardResponse idcard(IdcardSide idCardSide, boolean detectDirection, boolean detectRisk, byte[] image) {
  99. MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
  100. params.add("image", Tools.encodeBase64(image));
  101. params.add("id_card_side", idCardSide.key);
  102. params.add("detect_direction", detectDirection ? "true" : "false");
  103. params.add("detect_risk", detectRisk ? "true" : "false");
  104. return Transform.convert(execute(api+"ocr/v1/idcard?access_token"+getAccessToken(appKey, appSecret), params), IdcardResponse.class);
  105. }
  106. /**
  107. * 取微信公众平台accesstoken
  108. *
  109. * @return
  110. */
  111. private synchronized String getAccessToken(String appKey, String appSecret) {
  112. Date date = new Date();
  113. // 系统刚启动时,或者离上次取accessToken有7180秒以上时,重新取它
  114. if (!tokenMap.containsKey(appKey) || date.getTime() / 1000 - tokenExpiresIn.get(appKey).getTime() / 1000 >= 2592000) {
  115. try {
  116. Map<String, String> params = new HashMap<>();
  117. params.put("grant_type", "client_credential");
  118. params.put("client_id", appKey);
  119. params.put("client_secret", appSecret);
  120. String paramStr = "";
  121. for(String key : params.keySet()){
  122. String value = params.get(key);
  123. value = URLEncoder.encode(value, "UTF-8");
  124. paramStr = paramStr + key + "=" + value + "&";
  125. }
  126. JSONObject object = execute("https://aip.baidubce.com/oauth/2.0/token?"+paramStr, null);
  127. tokenMap.put(appKey, object.getString("accessToken"));
  128. tokenExpiresIn.put(appKey, date);
  129. logger.info("getAccessToken:" + tokenMap.get(appKey));
  130. } catch (UnsupportedEncodingException e) {
  131. e.printStackTrace();
  132. }
  133. }
  134. return tokenMap.get(appKey);
  135. }
  136. private JSONObject execute(String api, MultiValueMap<String, Object> params) throws RuntimeException {
  137. try {
  138. HttpHeaders headers = new HttpHeaders();
  139. headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
  140. RestTemplate restTemplate = new RestTemplate();
  141. HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(params, headers);
  142. String result = restTemplate.postForObject(api, formEntity, String.class);
  143. logger.info("BaiduAi返回结果:" + result);
  144. JSONObject a = JSONObject.parseObject(result);
  145. if (a.getInteger("status") == 0) {
  146. throw new Exception("BaiduAi接口错误: " + result);
  147. }
  148. return a;
  149. } catch (Exception e) {
  150. e.printStackTrace();
  151. throw new RuntimeException(e);
  152. }
  153. }
  154. }