diff --git a/internal/domains/api/services/processors/ivyz/ivyz5733_processor.go b/internal/domains/api/services/processors/ivyz/ivyz5733_processor.go index 95b2566..581f61f 100644 --- a/internal/domains/api/services/processors/ivyz/ivyz5733_processor.go +++ b/internal/domains/api/services/processors/ivyz/ivyz5733_processor.go @@ -34,7 +34,7 @@ func ProcessIVYZ5733Request(ctx context.Context, params []byte, deps *processors reqData := map[string]interface{}{ "data": map[string]interface{}{ "name": encryptedName, - "idCard": encryptedIDCard, + "idcard": encryptedIDCard, }, } diff --git a/internal/domains/api/services/processors/ivyz/ivyz9363_processor.go b/internal/domains/api/services/processors/ivyz/ivyz9363_processor.go index 1a67198..4e1126c 100644 --- a/internal/domains/api/services/processors/ivyz/ivyz9363_processor.go +++ b/internal/domains/api/services/processors/ivyz/ivyz9363_processor.go @@ -43,10 +43,10 @@ func ProcessIVYZ9363Request(ctx context.Context, params []byte, deps *processors reqData := map[string]interface{}{ "data": map[string]interface{}{ - "nameMan": encryptedManName, - "certNumMan": encryptedManIDCard, - "nameWoman": encryptedWomanName, - "certNumWoman": encryptedWomanIDCard, + "name_man": encryptedManName, + "idcard_man": encryptedManIDCard, + "name_woman": encryptedWomanName, + "idcard_woman": encryptedWomanIDCard, }, } diff --git a/internal/shared/validator/custom_validators.go b/internal/shared/validator/custom_validators.go index 54b8489..a91bdd7 100644 --- a/internal/shared/validator/custom_validators.go +++ b/internal/shared/validator/custom_validators.go @@ -128,13 +128,60 @@ func validateSocialCreditCode(fl validator.FieldLevel) bool { return matched } -// validateIDCard 身份证号验证 +// 自定义身份证校验(增强版) +// 校验规则: +// 1. 格式:18位,前6位地区码(首位不为0),7-14位出生日期,15-17位顺序码,18位校验码 +// 2. 出生日期必须合法(验证年月日有效性,包括闰年) +// 3. 校验码按照GB 11643-1999标准计算验证 func validateIDCard(fl validator.FieldLevel) bool { idCard := fl.Field().String() - matched, _ := regexp.MatchString(`^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[\dXx]$`, idCard) - return matched + + // 1. 基本格式验证:地区码(6位) + 年(4位) + 月(2位) + 日(2位) + 顺序码(3位) + 校验码(1位) + validIDPattern := `^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[\dXx]$` + matched, _ := regexp.MatchString(validIDPattern, idCard) + if !matched { + return false + } + + // 2. 验证出生日期的合法性 + year, _ := strconv.Atoi(idCard[6:10]) + month, _ := strconv.Atoi(idCard[10:12]) + day, _ := strconv.Atoi(idCard[12:14]) + + // 构造日期并验证是否合法(time包会自动处理闰年等情况) + birthDate := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC) + if birthDate.Year() != year || int(birthDate.Month()) != month || birthDate.Day() != day { + return false // 日期不合法,如2月30日、4月31日等 + } + + // 3. 验证校验码(按照GB 11643-1999标准) + return validateIDCardChecksum(idCard) } +// 验证身份证校验码(GB 11643-1999标准) +func validateIDCardChecksum(idCard string) bool { + // 加权因子 + weights := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2} + // 校验码对应值 + checksumChars := []byte{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'} + + sum := 0 + for i := 0; i < 17; i++ { + num := int(idCard[i] - '0') + sum += num * weights[i] + } + + // 计算校验码 + checksum := checksumChars[sum%11] + lastChar := idCard[17] + + // 支持小写x + if lastChar == 'x' { + lastChar = 'X' + } + + return byte(lastChar) == checksum +} // validatePrice 价格验证 func validatePrice(fl validator.FieldLevel) bool { price := fl.Field().Float()