PhoneUtils.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.ylx.common.utils;
  2. import org.apache.commons.lang3.StringUtils;
  3. import java.util.regex.Pattern;
  4. /**
  5. * 手机号工具类
  6. */
  7. public class PhoneUtils {
  8. /**
  9. * 国内手机号正则表达式 (支持11位手机号)
  10. */
  11. private static final Pattern PHONE_PATTERN = Pattern.compile("^(1[3-9]\\d{9})$");
  12. /**
  13. * 手机号脱敏处理
  14. * 规则:保留前3位,中间4位用*替换,保留后4位
  15. * 示例:13812345678 -> 138****5678
  16. *
  17. * @param phoneNumber 原始手机号
  18. * @return 脱敏后的手机号,若传入为空或格式不对则返回原值
  19. */
  20. public static String maskPhoneNumber(String phoneNumber) {
  21. // 1. 空值防御
  22. if (StringUtils.isBlank(phoneNumber)) {
  23. return null;
  24. }
  25. // 去除可能存在的空格
  26. phoneNumber = phoneNumber.trim();
  27. // 2. 格式校验:如果是标准的11位手机号,则进行脱敏
  28. if (PHONE_PATTERN.matcher(phoneNumber).matches()) {
  29. return phoneNumber.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
  30. }
  31. // 3. 如果不是标准手机号(如座机、海外号码、虚拟号等),可选择返回原值或全部打码
  32. return phoneNumber;
  33. }
  34. /**
  35. * 手机号高强度脱敏处理(隐藏中间6位)
  36. * 规则:保留前3位,中间6位用*替换,保留后2位
  37. * 示例:13812345678 -> 138******78
  38. *
  39. * @param phoneNumber 原始手机号
  40. * @return 脱敏后的手机号,若传入为空或格式不对则返回原值
  41. */
  42. public static String maskPhoneNumberStrict(String phoneNumber) {
  43. if (StringUtils.isBlank(phoneNumber)) {
  44. return null;
  45. }
  46. phoneNumber = phoneNumber.trim();
  47. // 仅对标准11位手机号执行6位脱敏
  48. if (PHONE_PATTERN.matcher(phoneNumber).matches()) {
  49. // 正则分组:(前3位)(中间6位)(后2位)
  50. return phoneNumber.replaceAll("(\\d{3})\\d{6}(\\d{2})", "$1******$2");
  51. }
  52. return phoneNumber;
  53. }
  54. /**
  55. * 获取手机号后4位
  56. * @param phoneNumber 原始手机号
  57. * @return 后4位;空/不足4位则返回null
  58. */
  59. public static String getPhoneTail4(String phoneNumber) {
  60. // 空值校验
  61. if (StringUtils.isBlank(phoneNumber)) {
  62. return null;
  63. }
  64. // 去除首尾空格
  65. String realPhone = phoneNumber.trim();
  66. // 长度不足4位直接返回null
  67. if (realPhone.length() < 4) {
  68. return null;
  69. }
  70. // 截取末尾4字符
  71. return realPhone.substring(realPhone.length() - 4);
  72. }
  73. /**
  74. * 校验手机号后四位是否匹配
  75. * 签到场景专用:完整手机号 vs 前端传入4位尾号
  76. * @param fullPhone 数据库完整11位手机号
  77. * @param inputTail4 用户输入的后4位
  78. * @return true=匹配,false=不匹配/手机号无效
  79. */
  80. public static boolean matchPhoneTail4(String fullPhone, String inputTail4) {
  81. // 输入尾号必须是4位数字
  82. if (StringUtils.isBlank(inputTail4) || inputTail4.length() != 4 || !StringUtils.isNumeric(inputTail4)) {
  83. return false;
  84. }
  85. String realTail = getPhoneTail4(fullPhone);
  86. // 手机号无效(空/不足4位)直接返回不匹配
  87. if (StringUtils.isBlank(realTail)) {
  88. return false;
  89. }
  90. // 相等校验
  91. return StringUtils.equals(realTail, inputTail4);
  92. }
  93. /**
  94. * 验证是否为合法的手机号格式
  95. */
  96. public static boolean isValidPhoneNumber(String phoneNumber) {
  97. if (StringUtils.isBlank(phoneNumber)) {
  98. return false;
  99. }
  100. return PHONE_PATTERN.matcher(phoneNumber.trim()).matches();
  101. }
  102. }