From: Tang Cheng Date: Tue, 9 Jul 2019 03:03:04 +0000 (+0800) Subject: 增加check X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=43d891d30d591cc36c802468fba1edac0406f587;p=epayment%2Ffood_payapi.git 增加check --- diff --git a/common/build.gradle b/common/build.gradle index 88e57502..3347b797 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -7,6 +7,7 @@ dependencies { implementation 'org.slf4j:slf4j-api:1.7.26' implementation 'javax.validation:validation-api:2.0.1.Final' implementation 'javax.servlet:javax.servlet-api:4.0.1' + implementation 'commons-beanutils:commons-beanutils:1.9.3' compileOnly 'org.projectlombok:lombok:1.18.8' annotationProcessor 'org.projectlombok:lombok:1.18.8' diff --git a/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java b/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java new file mode 100644 index 00000000..bf486dbe --- /dev/null +++ b/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java @@ -0,0 +1,36 @@ +package com.supwisdom.dlpay.api.annotation; + +import com.supwisdom.dlpay.api.validator.IDNoCheckValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = IDNoCheckValidator.class) +@Documented +public @interface IDNoCheck { + String message() default "{constraintdescriptor.fieldmatch}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + /** + * @return The idno field + */ + String idno(); + + /** + * @return The idtype field + */ + String idtype(); + + /** + * 证件类型字典 + * + * @return + */ + String[] value(); +} \ No newline at end of file diff --git a/common/src/main/java/com/supwisdom/dlpay/api/annotation/MobileNumber.java b/common/src/main/java/com/supwisdom/dlpay/api/annotation/MobileNumber.java new file mode 100644 index 00000000..8558151d --- /dev/null +++ b/common/src/main/java/com/supwisdom/dlpay/api/annotation/MobileNumber.java @@ -0,0 +1,19 @@ +package com.supwisdom.dlpay.api.annotation; + +import com.supwisdom.dlpay.api.validator.MobileNumberValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Constraint(validatedBy = {MobileNumberValidator.class}) +@Documented +@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface MobileNumber { + String message() default "手机号码不合法"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} \ No newline at end of file diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java index d76fc806..5ec96028 100644 --- a/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java +++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java @@ -1,6 +1,7 @@ package com.supwisdom.dlpay.api.bean; import com.supwisdom.dlpay.api.APIRequestParam; +import com.supwisdom.dlpay.api.annotation.MobileNumber; import com.supwisdom.dlpay.api.annotation.Sex; import com.supwisdom.dlpay.api.annotation.Sign; import com.supwisdom.dlpay.api.exception.RequestParamCheckException; @@ -32,11 +33,12 @@ public class OpenUserParam extends APIRequestParam { private String idno; @Sign @NotEmpty(message = "手机号格式错误") + @MobileNumber(message = "手机号格式错误") private String mobile; @Sign private String tel; @Sign - @Email + @Email(message = "电子邮件格式不合法") private String email; @Sign private String address; diff --git a/common/src/main/java/com/supwisdom/dlpay/api/util/MobileNumberCheck.java b/common/src/main/java/com/supwisdom/dlpay/api/util/MobileNumberCheck.java new file mode 100644 index 00000000..161868ed --- /dev/null +++ b/common/src/main/java/com/supwisdom/dlpay/api/util/MobileNumberCheck.java @@ -0,0 +1,163 @@ +package com.supwisdom.dlpay.api.util; + +import java.util.regex.Pattern; + +public class MobileNumberCheck { + + /** + * 座机电话格式验证 + **/ + private static final String PHONE_CALL_PATTERN = "^(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?$"; + + /** + * 中国电信号码格式验证 手机段: 133,153,180,181,189,177,1700,173 + **/ + private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|53|7[37]|8[019])\\d{8}$)|(?:^(?:\\+86)?1700\\d{7}$)"; + + /** + * 中国联通号码格式验证 手机段:130,131,132,155,156,185,186,145,176,1707,1708,1709,175 + **/ + private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1(?:3[0-2]|4[5]|5[56]|7[56]|8[56])\\d{8}$)|(?:^(?:\\+86)?170[7-9]\\d{7}$)"; + /** + * 简单手机号码校验,校验手机号码的长度和1开头 + */ + private static final String SIMPLE_PHONE_CHECK = "^(?:\\+86)?1\\d{10}$"; + /** + * 中国移动号码格式验证 + * 手机段:134,135,136,137,138,139,150,151,152,157,158,159,182,183,184 + * ,187,188,147,178,1705 + **/ + private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1(?:3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(?:^(?:\\+86)?1705\\d{7}$)"; + + /** + * 仅手机号格式校验 + */ + private static final String PHONE_PATTERN = new StringBuilder(300) + .append(CHINA_MOBILE_PATTERN).append("|") + .append(CHINA_TELECOM_PATTERN).append("|") + .append(CHINA_UNICOM_PATTERN).toString(); + + /** + * 手机和座机号格式校验 + */ + private static final String PHONE_TEL_PATTERN = new StringBuilder(350) + .append(PHONE_PATTERN).append("|").append("(") + .append(PHONE_CALL_PATTERN).append(")").toString(); + + + /** + * 匹配多个号码以,、或空格隔开的格式,如 17750581369 + * 13306061248、(596)3370653,17750581369,13306061248 (0596)3370653 + * + * @param input + * @param separator 可以自己指定分隔符,如"、, "表示可以以顿号、逗号和空格分隔 + * @return + */ + public static boolean checkMultiPhone(String input, String separator) { + separator = escapeMetacharacterOfStr(separator); + String regex = "^(?!.+[" + + separator + + "]$)(?:(?:(?:(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?)|(?:1\\d{10}))(?:[" + + separator + "]|$))+$"; + return match(regex, input); + } + + /** + * 转义字符串中的[]-^\元字符 + * + * @param input + * @param separator + * @return + */ + private static String escapeMetacharacterOfStr(String input) { + String regex = "[-^\\[\\]\\\\]"; + return input.replaceAll(regex, "\\\\$0"); + } + + /** + * 仅手机号码校验 + * + * @param input + * @return + */ + public static boolean isPhone(String input) { + return match(PHONE_PATTERN, input); + } + + /** + * 手机号或座机号校验 + * + * @param input + * @return + */ + public static boolean isPhoneOrTel(String input) { + System.out.println(PHONE_TEL_PATTERN); + return match(PHONE_TEL_PATTERN, input); + } + + /** + * 验证电话号码的格式 + * + * @param str 校验电话字符串 + * @return 返回true, 否则为false + * @author LinBilin + */ + public static boolean isPhoneCallNum(String str) { + return match(PHONE_CALL_PATTERN, str); + } + + /** + * 验证【电信】手机号码的格式 + * + * @param str 校验手机字符串 + * @return 返回true, 否则为false + * @author LinBilin + */ + public static boolean isChinaTelecomPhoneNum(String str) { + return match(CHINA_TELECOM_PATTERN, str); + } + + /** + * 验证【联通】手机号码的格式 + * + * @param str 校验手机字符串 + * @return 返回true, 否则为false + * @author LinBilin + */ + public static boolean isChinaUnicomPhoneNum(String str) { + return match(CHINA_UNICOM_PATTERN, str); + } + + /** + * 验证【移动】手机号码的格式 + * + * @param str 校验手机字符串 + * @return 返回true, 否则为false + * @author LinBilin + */ + public static boolean isChinaMobilePhoneNum(String str) { + return match(CHINA_MOBILE_PATTERN, str); + } + + /** + * 简单手机号码校验,校验手机号码的长度和1开头 + * + * @param str + * @return + */ + public static boolean isPhoneSimple(String str) { + return match(SIMPLE_PHONE_CHECK, str); + } + + /** + * 匹配函数 + * + * @param regex + * @param input + * @return + */ + private static boolean match(String regex, String input) { + return Pattern.matches(regex, input); + } + +} diff --git a/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java b/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java new file mode 100644 index 00000000..5fba2751 --- /dev/null +++ b/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java @@ -0,0 +1,28 @@ +package com.supwisdom.dlpay.api.validator; + +import com.supwisdom.dlpay.api.annotation.IDNoCheck; +import org.apache.commons.lang3.StringUtils; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class IDNoCheckValidator implements ConstraintValidator { + private String idnoField; + private String idtypeField; + private String[] idtypeList; + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + return false; + } + + @Override + public void initialize(IDNoCheck constraintAnnotation) { + idnoField = constraintAnnotation.idno(); + idtypeField = constraintAnnotation.idtype(); + if (StringUtils.isEmpty(idnoField) || StringUtils.isEmpty(idtypeField)) { + throw new IllegalArgumentException("IDNO 和 IDType 字段必须指定"); + } + idtypeList = constraintAnnotation.value(); + } +} diff --git a/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java b/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java new file mode 100644 index 00000000..0be737f1 --- /dev/null +++ b/common/src/main/java/com/supwisdom/dlpay/api/validator/MobileNumberValidator.java @@ -0,0 +1,19 @@ +package com.supwisdom.dlpay.api.validator; + +import com.supwisdom.dlpay.api.annotation.MobileNumber; +import com.supwisdom.dlpay.api.util.MobileNumberCheck; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class MobileNumberValidator implements ConstraintValidator { + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + return MobileNumberCheck.isPhone(value); + } + + @Override + public void initialize(MobileNumber constraintAnnotation) { + } +} diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java index a8ea0abe..ff65c098 100644 --- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java +++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java @@ -32,7 +32,6 @@ import static org.hamcrest.Matchers.equalTo; HttpMessageConvertersAutoConfiguration.class}) @EnableFeignClients(basePackages = "com.supwisdom.dlpay.paysdk") @ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"}) -@TestPropertySource() public class CitizenCardPayProxyTest { private final static String appid = "700001"; private final static String secret = "5f788ce433ec44f299351cdf7f137e81";