微信后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
8.0 KiB

package com.ynxbd.common.helper.common;
import com.baidu.aip.ocr.AipOcr;
import com.ynxbd.common.bean.Patient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
/**
* @Author wsq
* @Date 2020/10/12 11:56
* @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
*/
@Slf4j
public class IDNumberHelper {
private static String APP_ID;
private static String API_KEY;
private static String SECRET_KEY;
// front:身份证含照片的一面,back:身份证带国徽的一面,必须正确声明,否则"error_msg": "recognize id card error"
private final static String ID_CARD_SIDE = "front";
// 图片存储文件夹名
private final static String FOLDER_NAME = "idCard";
static {
// Properties properties = FileHelper.readProperties("idcard.properties");
// if (properties != null) {
// APP_ID = FileHelper.propertiesGetString(properties, "baidu.appId");
// API_KEY = FileHelper.propertiesGetString(properties, "baidu.apiKey");
// SECRET_KEY = FileHelper.propertiesGetString(properties, "baidu.secretKey");
// }
}
/**
* 根据身份证号获取性别
*
* @param idNumber 身份证号码
* @return 性别
*/
public static String getSex(String idNumber) {
if (isValid(idNumber)) return null;
String sex = null;
if (StringUtils.isNotBlank(idNumber)) {
if (idNumber.length() == 18) {
sex = Integer.parseInt(idNumber.substring(16, 17)) % 2 == 1 ? "男" : "女";
} else {
sex = Integer.parseInt(idNumber.substring(14, 15)) % 2 == 1 ? "男" : "女";
}
}
return sex;
}
/**
* 根据身份证号获取年龄
*
* @param idNumber 身份证号码
* @return 年龄
*/
public static Integer getAge(String idNumber) {
if (isValid(idNumber)) return null;
String year, month, day;
if (idNumber.length() == 18) {
year = idNumber.substring(6, 10);// 得到年份
month = idNumber.substring(10, 12);// 得到月份
day = idNumber.substring(12, 14);//得到日
} else {
year = "19" + idNumber.substring(6, 8);// 年份
month = idNumber.substring(8, 10);// 月份
day = idNumber.substring(10, 12);//日
}
Date date = new Date();// 得到当前的系统时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String curYear = format.format(date).substring(0, 4);// 当前年份
String curMonth = format.format(date).substring(5, 7);// 月份
String curDay = format.format(date).substring(8, 10);//
int age = Integer.parseInt(curYear) - Integer.parseInt(year);
if (Integer.parseInt(month) > Integer.parseInt(curMonth)
//如果当前月份小于出生月份,说明生日还没过
|| (Integer.parseInt(month) == Integer.parseInt(curMonth) && Integer.parseInt(day) > Integer.parseInt(curDay))) {
age--;
}
return age;
}
/**
* 获取出生日期
*
* @param idNumber 身份证号码
* @return 出生日期 yyyy-mm-dd
*/
public static String getBirthday(String idNumber) {
if (isValid(idNumber)) return null;
String y, m, d;
if (idNumber.length() == 18) { //18位身份证号
y = idNumber.substring(6, 10);
m = idNumber.substring(10, 12);
d = idNumber.substring(12, 14);
} else {
// 身份证上的年份(15位身份证为1980年前的)
y = "19" + idNumber.substring(6, 8);
m = idNumber.substring(8, 10);
d = idNumber.substring(10, 12);
}
return y + "-" + m + "-" + d;
}
/**
* 身份证验证
*
* @param idNumber 身份证号码
* @return 是否有效
*/
public static boolean isValid(String idNumber) {
if (idNumber == null || "".equals(idNumber)) {
return false;
}
int len = idNumber.length();
if (len != 15 && len != 18) { // 校验长度只能为15或18
log.info("身份证位数异常");
return true;
}
// 校验生日
if (!validDate(idNumber)) {
log.info("生日异常");
return true;
}
return false;
}
/**
* 校验生日
*
* @param idNumber 身份证号码
* @return 是否有效
*/
private static boolean validDate(String idNumber) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String birth = idNumber.length() == 15 ? "19" + idNumber.substring(6, 12) : idNumber.substring(6, 14);
if (new Date().compareTo(format.parse(birth)) < 0) {
return false;
}
Date birthDate = format.parse(birth);
if (!birth.equals(format.format(birthDate))) {
return false;
}
} catch (ParseException e) {
return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(getAge("53233119851015381X"));
System.out.println(getSex("410527200002175438"));
System.out.println(getBirthday("53233119861025381X"));
}
// 百度身份证识别
public static Patient getCardInfo(String image) {
String imagePath = FileHelper.saveBase64Image(image, FOLDER_NAME, "time-" + System.currentTimeMillis() + ".png", true, false);
if (imagePath == null) return null;
AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);// 初始化一个AipOcr
client.setConnectionTimeoutInMillis(3000);
client.setSocketTimeoutInMillis(10000);
HashMap<String, String> options = new HashMap<>();
options.put("detect_direction", "true");
// 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,
options.put("detect_risk", "false");
// client.idcard() ==>识别图片的方法是==>身份证识别
org.json.JSONObject resJson = client.idcard(imagePath, ID_CARD_SIDE, options);
// 获取JSON中的==>words_result对象
org.json.JSONObject words_result = resJson.getJSONObject("words_result");
Patient patient = new Patient();
Iterator<String> it = words_result.keys();
while (it.hasNext()) {
String key = it.next();
String value = words_result.getJSONObject(key).getString("words"); // 获取JSON中的==>words值
if (value == null || "".equals(value)) {
log.info("缺少" + key + "参数");
return null;
}
switch (key) {
case "姓名":
patient.setName(value);
break;
case "民族":
patient.setNation(value);
break;
case "住址":
patient.setAddress(value);
break;
case "公民身份号码":
patient.setIdCardNo(value);
break;
case "出生":
patient.setBirthday(value);
break;
case "性别":
patient.setSex(value);
break;
default:
System.out.println("param is not find");
break;
}
}
FileHelper.updateFileName(imagePath, patient.getIdCardNo());
return patient;
}
}