Java验证身份证信息

Java身份证认证

/**
 * 身份证验证
 *
 */
public class CheckIdCard {
	// 检查通过是返回的的成功标识字符串
	public static final String ACCEPT = ""; 
	
	// 标识18位身份证号码
	public static final int EIGHTEEN_IDCARD = 18;
	// 标识15位身份证号码
	public static final int FIFTEEN_IDCARD = 15; 
	
	// 大陆地区地域编码最大值
	public static final int MAX_MAINLAND_AREACODE = 659004; 
	// 大陆地区地域编码最小值
	public static final int MIN_MAINLAND_AREACODE = 110000; 
	// 香港地域编码值
	public static final int HONGKONG_AREACODE = 810000; 
	// 台湾地域编码值
	public static final int TAIWAN_AREACODE = 710000; 
	// 澳门地域编码值
	public static final int MACAO_AREACODE = 820000; 
	
	// 标识男性
	private static final int MAN_SEX = 1; 
	// 标识女性
	private static final int WOMAN_SEX = 2; 

	// 储存18位身份证校验码
	private static final String[] SORTCODES = new String[] { "1", "0", "X",
			"9", "8", "7", "6", "5", "4", "3", "2" };

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String idCard = "142424870329324";
		String result = chekIdCard(1, idCard);
		if ("".equals(result))
			System.out.println("身份证合法");
		else
			System.out.println(result);
	}

	/**
	 * 验证身份证主方法
	 */
	public static String chekIdCard(int sex, String idCardInput) {
		if (idCardInput == null || "".equals(idCardInput))
			return "身份证号码为必填";
		if (idCardInput.length() != 18 && idCardInput.length() != 15)
			return "身份证号码位数不符";
		if (idCardInput.length() == 15)
			return checkIdCard15(sex, idCardInput);
		else
			return checkIdCard18(sex, idCardInput);
	}

	/**
	 * 验证15位身份证号码
	 */
	private static String checkIdCard15(int sex, String idCardInput) {
		String numberResult = checkNumber(FIFTEEN_IDCARD, idCardInput);
		if (!ACCEPT.equals(numberResult))
			return numberResult;

		String areaResult = checkArea(idCardInput);
		if (!ACCEPT.equals(areaResult))
			return areaResult;

		String birthResult = checkBirthDate(FIFTEEN_IDCARD, idCardInput);
		if (!ACCEPT.equals(birthResult))
			return birthResult;

		String sortCodeResult = checkSortCode(FIFTEEN_IDCARD, sex, idCardInput);
		if (!ACCEPT.equals(sortCodeResult))
			return sortCodeResult;

		String checkCodeResult = checkCheckCode(FIFTEEN_IDCARD, idCardInput);
		if (!ACCEPT.equals(checkCodeResult))
			return checkCodeResult;

		return ACCEPT;
	}

	/**
	 * 验证18位身份证号码
	 */
	private static String checkIdCard18(int sex, String idCardInput) {

		String numberResult = checkNumber(EIGHTEEN_IDCARD, idCardInput);
		if (!ACCEPT.equals(numberResult))
			return numberResult;

		String areaResult = checkArea(idCardInput);
		if (!ACCEPT.equals(areaResult))
			return areaResult;

		String birthResult = checkBirthDate(EIGHTEEN_IDCARD, idCardInput);
		if (!ACCEPT.equals(birthResult))
			return birthResult;

		String sortCodeResult = checkSortCode(EIGHTEEN_IDCARD, sex, idCardInput);
		if (!ACCEPT.equals(sortCodeResult))
			return sortCodeResult;

		String checkCodeResult = checkCheckCode(EIGHTEEN_IDCARD, idCardInput);
		if (!ACCEPT.equals(checkCodeResult))
			return checkCodeResult;

		return ACCEPT;
	}

	/**
	 * 验证身份证的地域编码是符合规则
	 */
	private static String checkArea(String idCardInput) {
		String subStr = idCardInput.substring(0, 6);
		int areaCode = Integer.parseInt(subStr);
		if (areaCode != HONGKONG_AREACODE
				&& areaCode != TAIWAN_AREACODE
				&& areaCode != MACAO_AREACODE
				&& (areaCode > MAX_MAINLAND_AREACODE || areaCode < MIN_MAINLAND_AREACODE))
			return "输入的身份证号码地域编码不符合大陆和港澳台规则";
		return ACCEPT;
	}

	/**
	 * 验证身份证号码数字字母组成是否符合规则
	 */
	private static String checkNumber(int idCardType, String idCard) {
		char[] chars = idCard.toCharArray();
		if (idCardType == FIFTEEN_IDCARD) {
			for (int i = 0; i < chars.length; i++) {
				if (chars[i] > '9')
					return idCardType + "位身份证号码中不能出现字母";
			}
		} else {
			for (int i = 0; i < chars.length; i++) {
				if (i < chars.length - 1) {
					if (chars[i] > '9')
						return EIGHTEEN_IDCARD + "位身份证号码中前"
								+ (EIGHTEEN_IDCARD - 1) + "不能出现字母";
				} else {
					if (chars[i] > '9' && chars[i] != 'X')
						return idCardType + "位身份证号码中最后一位只能是数字0~9或字母X";
				}
			}

		}

		return ACCEPT;
	}

	/**
	 * 验证身份证号码出生日期是否符合规则
	 */
	private static String checkBirthDate(int idCardType, String idCardInput) {
		String yearResult = checkBirthYear(idCardType, idCardInput);
		if (!ACCEPT.equals(yearResult))
			return yearResult;

		String monthResult = checkBirthMonth(idCardType, idCardInput);
		if (!ACCEPT.equals(monthResult))
			return monthResult;

		String dayResult = checkBirthDay(idCardType, idCardInput);
		if (!ACCEPT.equals(dayResult))
			return dayResult;

		return ACCEPT;
	}

	/**
	 * 验证身份证号码出生日期年份是否符合规则
	 */
	private static String checkBirthYear(int idCardType, String idCardInput) {
		if (idCardType == FIFTEEN_IDCARD) {
			int year = Integer.parseInt(idCardInput.substring(6, 8));
			if (year < 0 || year > 99)
				return idCardType + "位的身份证号码年份须在00~99内";
		} else {
			int year = Integer.parseInt(idCardInput.substring(6, 10));
			int yearNow = getYear();
			if (year < 1900 || year > yearNow)
				return idCardType + "位的身份证号码年份须在1900~" + yearNow + "内";
		}
		return ACCEPT;
	}

	/**
	 * 验证身份证号码出生日期月份是否符合规则
	 */
	private static String checkBirthMonth(int idCardType, String idCardInput) {
		int month = 0;
		if (idCardType == FIFTEEN_IDCARD)
			month = Integer.parseInt(idCardInput.substring(8, 10));
		else
			month = Integer.parseInt(idCardInput.substring(10, 12));

		if (month < 1 || month > 12)
			return "身份证号码月份须在01~12内";

		return ACCEPT;
	}

	/**
	 * 验证身份证号码出生日期天数是否符合规则
	 */
	private static String checkBirthDay(int idCardType, String idCardInput) {
		boolean bissextile = false;
		int year, month, day;
		if (idCardType == FIFTEEN_IDCARD) {
			year = Integer.parseInt("19" + idCardInput.substring(6, 8));
			month = Integer.parseInt(idCardInput.substring(8, 10));
			day = Integer.parseInt(idCardInput.substring(10, 12));
		} else {
			year = Integer.parseInt(idCardInput.substring(6, 10));
			month = Integer.parseInt(idCardInput.substring(10, 12));
			day = Integer.parseInt(idCardInput.substring(12, 14));
		}
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
			bissextile = true;

		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			if (day < 1 || day > 31)
				return "身份证号码大月日期须在1~31之间";
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			if (day < 1 || day > 30)
				return "身份证号码小月日期须在1~30之间";
			break;
		case 2:
			if (bissextile) {
				if (day < 1 || day > 29)
					return "身份证号码闰年2月日期须在1~29之间";
			} else {
				if (day < 1 || day > 28)
					return "身份证号码非闰年2月日期年份须在1~28之间";
			}
			break;
		}
		return ACCEPT;
	}

	/**
	 * 验证身份证号码顺序码是否符合规则,男性为偶数,女性为奇数
	 */
	private static String checkSortCode(int idCardType, int sex,
			String idCardInput) {
		int sortCode = 0;
		if (idCardType == FIFTEEN_IDCARD) {
			sortCode = Integer.parseInt(idCardInput.substring(12, 15));
		} else {
			sortCode = Integer.parseInt(idCardInput.substring(14, 17));
		}

		if (sex == MAN_SEX) {
			if (sortCode % 2 == 0)
				return "男性的身份证顺序码须为奇数";
		} else {
			if (sortCode % 2 != 0)
				return "女性的身份证顺序码须为偶数";
		}

		return ACCEPT;
	}

	/**
	 * 验证18位身份证号码校验码是否符合规则
	 */
	private static String checkCheckCode(int idCardType, String idCard) {
		if (idCardType == EIGHTEEN_IDCARD) {
			int sum = 0;
			char[] chars = idCard.toCharArray();
			for (int i = 0; i < chars.length; i++) {
				if (i == 0)
					sum = sum + (chars[i] * 7);
				if (i == 1)
					sum = sum + (chars[i] * 9);
				if (i == 2)
					sum = sum + (chars[i] * 10);
				if (i == 3)
					sum = sum + (chars[i] * 5);
				if (i == 4)
					sum = sum + (chars[i] * 5);
				if (i == 5)
					sum = sum + (chars[i] * 8);
				if (i == 6)
					sum = sum + (chars[i] * 4);
				if (i == 7)
					sum = sum + (chars[i] * 1);
				if (i == 8)
					sum = sum + (chars[i] * 6);
				if (i == 9)
					sum = sum + (chars[i] * 3);
				if (i == 10)
					sum = sum + (chars[i] * 7);
				if (i == 11)
					sum = sum + (chars[i] * 9);
				if (i == 12)
					sum = sum + (chars[i] * 10);
				if (i == 13)
					sum = sum + (chars[i] * 5);
				if (i == 14)
					sum = sum + (chars[i] * 8);
				if (i == 15)
					sum = sum + (chars[i] * 4);
				if (i == 16)
					sum = sum + (chars[i] * 2);
			}

			int checkCode = sum % 11;
			String sortCode = SORTCODES[checkCode];

			if (!sortCode.equals(String.valueOf(chars[chars.length - 1])))
				return "身份中的校验码不正确";
		}
		return ACCEPT;
	}

	/**
	 * 返回当前年份
	 */
	private static int getYear() {
		Date now = new Date();
		SimpleDateFormat format = new SimpleDateFormat("yyyymmdd");
		String nowStr = format.format(now);
		return Integer.parseInt(nowStr.substring(0, 4));
	}
}



多角色体系 支持管理员、商家、消费者三种角色,权限分级管控: 管理员:负责平台整体配置、用户审核、数据监控等全局操作。 商家:管理店铺信息、发布商品、处理订单、回复评价等。 消费者:浏览商品、加入购物车、下单支付、评价商品等。 实现用户注册(手机号 / 邮箱验证)、登录(支持密码 / 验证码 / 第三方登录)、个人信息管理(头像、收货地址、密码修改)。 权限精细化控制 商家仅能管理自家店铺及商品,消费者仅能查看和购买商品,管理员拥有全平台数据访问权限。 二、商品管理功能 商品信息维护 商家可发布商品:填写名称、分类(如服饰、电子产品)、子类别(如手机、笔记本)、规格(尺寸、颜色、型号)、价格、库存、详情描述(图文)、物流信息(运费、发货地)等。 支持商品上下架、库存调整、信息编辑,系统自动记录商品状态变更日志。 商品分类与搜索 按多级分类展示商品(如 “数码产品→手机→智能手机”),支持自定义分类体系。 提供智能搜索功能:按关键词(名称、品牌)搜索,支持模糊匹配和搜索联想;结合用户浏览历史对搜索结果排序(优先展示高相关度商品)。 商品推荐 基于用户浏览、收藏、购买记录,推荐相似商品(如 “浏览过该商品的用户还买了…”)。 首页展示热门商品(销量 TOP10)、新品上架、限时折扣等推荐列表。 三、订单与交易管理 购物车与下单 消费者可将商品加入购物车,支持修改数量、选择规格、移除商品,系统自动计算总价(含运费、折扣)。 下单流程:确认收货地址→选择支付方式(在线支付、货到付款)→提交订单→系统生成唯一订单号。 订单处理流程 订单状态跟踪:待支付→已支付→商家发货→物流运输→消费者收货→订单完成,各状态变更实时通知用户。 商家端功能:查看新订单提醒、确认发货(填写物流单号)、处理退款申请(需审核理由)。 消费者端功能:查看订单详情、追踪物流、申请退款 / 退货、确认收货。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值