This commit is contained in:
2025-10-11 19:10:09 +08:00
parent 532b92713b
commit 309a9a4c96
3 changed files with 55 additions and 8 deletions

View File

@@ -34,7 +34,7 @@ func ProcessIVYZ5733Request(ctx context.Context, params []byte, deps *processors
reqData := map[string]interface{}{ reqData := map[string]interface{}{
"data": map[string]interface{}{ "data": map[string]interface{}{
"name": encryptedName, "name": encryptedName,
"idCard": encryptedIDCard, "idcard": encryptedIDCard,
}, },
} }

View File

@@ -43,10 +43,10 @@ func ProcessIVYZ9363Request(ctx context.Context, params []byte, deps *processors
reqData := map[string]interface{}{ reqData := map[string]interface{}{
"data": map[string]interface{}{ "data": map[string]interface{}{
"nameMan": encryptedManName, "name_man": encryptedManName,
"certNumMan": encryptedManIDCard, "idcard_man": encryptedManIDCard,
"nameWoman": encryptedWomanName, "name_woman": encryptedWomanName,
"certNumWoman": encryptedWomanIDCard, "idcard_woman": encryptedWomanIDCard,
}, },
} }

View File

@@ -128,13 +128,60 @@ func validateSocialCreditCode(fl validator.FieldLevel) bool {
return matched return matched
} }
// validateIDCard 身份证号验证 // 自定义身份证校验(增强版)
// 校验规则:
// 1. 格式18位前6位地区码首位不为07-14位出生日期15-17位顺序码18位校验码
// 2. 出生日期必须合法(验证年月日有效性,包括闰年)
// 3. 校验码按照GB 11643-1999标准计算验证
func validateIDCard(fl validator.FieldLevel) bool { func validateIDCard(fl validator.FieldLevel) bool {
idCard := fl.Field().String() 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 价格验证 // validatePrice 价格验证
func validatePrice(fl validator.FieldLevel) bool { func validatePrice(fl validator.FieldLevel) bool {
price := fl.Field().Float() price := fl.Field().Float()