VirCardNoUtils.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import java.text.SimpleDateFormat;
  2. import java.util.*;
  3. public class VirCardNoUtils {
  4. // 获取贷记卡BIN
  5. private static List<String> creditCardBins = null;
  6. /**
  7. * 分割符
  8. */
  9. public static final String SPLIT_CHARACTER = ",";
  10. /**
  11. * 月份
  12. */
  13. public final static String MONTH = "01,02,03,04,05,06,07,08,09,10,11,12";
  14. public static String DEFAULT_VIR_BINS_CREDIT="CCB:建设银行:622707,CCB:建设银行:625955,CCB:建设银行:625956,CCB:建设银行:436728,CCB:建设银行:453242,CCB:建设银行:491031,CCB:建设银行:628316,CCB:建设银行:628317,CCB:建设银行:622708,CCB:建设银行:622675,"
  15. + "ICBC:工商银行:427019,ICBC:工商银行:427020,ICBC:工商银行:427029,ICBC:工商银行:427030,ICBC:工商银行:427039,ICBC:工商银行:438125,ICBC:工商银行:438126,ICBC:工商银行:451804,ICBC:工商银行:427010,ICBC:工商银行:427018,"
  16. + "ABC:农业银行:403361,ABC:农业银行:404117,ABC:农业银行:404118,ABC:农业银行:404119,ABC:农业银行:404120,ABC:农业银行:404121,ABC:农业银行:463758,ABC:农业银行:514027,ABC:农业银行:519412,ABC:农业银行:519413,"
  17. + "BOC:中国银行:356835,BOC:中国银行:409665,BOC:中国银行:409666,BOC:中国银行:409672,BOC:中国银行:512315,BOC:中国银行:512316,BOC:中国银行:512411,BOC:中国银行:512412,BOC:中国银行:514957,BOC:中国银行:409667"
  18. + "CMBCHINA:招商银行:356890,CMBCHINA:招商银行:439188,CMBCHINA:招商银行:439227,CMBCHINA:招商银行:479229,CMBCHINA:招商银行:521302,CMBCHINA:招商银行:356889,CMBCHINA:招商银行:552534,CMBCHINA:招商银行:622575,CMBCHINA:招商银行:622576,CMBCHINA:招商银行:622581"
  19. + "GDB:广发银行:406365,GDB:广发银行:406366,GDB:广发银行:487013,GDB:广发银行:491032,GDB:广发银行:491035,GDB:广发银行:491037,GDB:广发银行:491038,GDB:广发银行:518364,GDB:广发银行:622558,GDB:广发银行:622559";
  20. private static Random strGen = new Random();
  21. /**
  22. * 随机数据池
  23. */
  24. private static char[] numbersAndLetters = ("0123456789").toCharArray();
  25. static {
  26. // 加载卡BIN配置
  27. creditCardBins = new ArrayList<String>();
  28. // 信用卡配置加载
  29. String[] banks = DEFAULT_VIR_BINS_CREDIT.split(",");
  30. for (String bankinfo : banks) {
  31. String[] info = bankinfo.split(":");
  32. if (info.length != 3){
  33. continue;
  34. }
  35. creditCardBins.add(bankinfo);
  36. }
  37. }
  38. /**
  39. * 获取卡bin
  40. * @return
  41. */
  42. private static String[] getCardBinInfo() {
  43. List<String> cardBins = creditCardBins;
  44. int index = (int) (Math.random() * cardBins.size());
  45. String cardbin = cardBins.get(index);
  46. return cardbin.split(":");
  47. }
  48. /**
  49. * 获取cardbean
  50. * @return
  51. */
  52. public static BankCardBean getBankCardBean(){
  53. String[] bin = getCardBinInfo();
  54. String cardNo = bin[2] +randomString(10);
  55. BankCardBean bankCard = new BankCardBean();
  56. bankCard.setCardNo(cardNo);
  57. bankCard.setBankId(bin[0]);
  58. bankCard.setBankName(bin[1]);
  59. bankCard.setCvv(getCvv());
  60. bankCard.setValidityPeriod(getMonth() + "/" + getYear());
  61. //获取持卡人姓名
  62. String holderName = getName();
  63. // 提取性别
  64. String gender = holderName.substring(0, 1);
  65. // 去掉性别前缀
  66. String name = holderName.substring(2);
  67. bankCard.setHolderName(name);
  68. bankCard.setGender(gender);
  69. //获取身份证号码
  70. String idCardNo = getRandomID();
  71. bankCard.setHolderIdCardNo(idCardNo);
  72. return bankCard;
  73. }
  74. /**
  75. * 获取三位cvv
  76. * @return
  77. */
  78. public static String getCvv(){
  79. return randomString(3);
  80. }
  81. /**
  82. * 获取明后2年的年份后两位随机数
  83. */
  84. public static String getYear(){
  85. SimpleDateFormat SHORTDATEFORMAT = new SimpleDateFormat("yyyyMMdd");
  86. String thisYearStrng = SHORTDATEFORMAT.format(new Date()).substring(2, 4);
  87. StringBuilder sb = new StringBuilder();
  88. int thisYear = Integer.valueOf(thisYearStrng).intValue();
  89. sb.append(thisYear+1)
  90. .append(SPLIT_CHARACTER)
  91. .append(thisYear+2);
  92. return sb.toString().split(SPLIT_CHARACTER)[(int)(Math.random() * 2)];
  93. }
  94. /**
  95. * 获取随机月份
  96. * @return
  97. */
  98. public static String getMonth(){
  99. String[] months = MONTH.split(SPLIT_CHARACTER);
  100. return months[(int)(Math.random() * (months.length))];
  101. }
  102. /** * 产生随机字符串 * */
  103. public static String randomString(int length) {
  104. if (length < 1) {
  105. return null;
  106. }
  107. char[] randBuffer = new char[length];
  108. for (int i = 0; i < randBuffer.length; i++) {
  109. randBuffer[i] = numbersAndLetters[strGen.nextInt(9)];
  110. }
  111. return new String(randBuffer);
  112. }
  113. /**
  114. * 获取中国人姓名
  115. *
  116. * @return
  117. */
  118. public static String getName() {
  119. Random random = new Random();
  120. String[] Surname = {"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
  121. "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
  122. "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷",
  123. "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和",
  124. "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒",
  125. "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季"};
  126. String girl = "秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽 ";
  127. String boy = "伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘";
  128. int index = random.nextInt(Surname.length - 1);
  129. //获得一个随机的姓氏
  130. String name = Surname[index];
  131. //可以根据这个数设置产生的男女比例
  132. int i = random.nextInt(3);
  133. if (i == 2) {
  134. int j = random.nextInt(girl.length() - 2);
  135. if (j % 2 == 0) {
  136. name = "女-" + name + girl.substring(j, j + 2);
  137. } else {
  138. name = "女-" + name + girl.substring(j, j + 1);
  139. }
  140. } else {
  141. int j = random.nextInt(girl.length() - 2);
  142. if (j % 2 == 0) {
  143. name = "男-" + name + boy.substring(j, j + 2);
  144. } else {
  145. name = "男-" + name + boy.substring(j, j + 1);
  146. }
  147. }
  148. return name;
  149. }
  150. public static int getNum(int start, int end) {
  151. return (int) (Math.random() * (end - start + 1) + start);
  152. }
  153. /**
  154. * 获取身份证号
  155. * @return
  156. */
  157. public static String getRandomID() {
  158. String id = "420222199204179999";
  159. // 随机生成省、自治区、直辖市代码 1-2
  160. String provinces[] = { "11", "12", "13", "14", "15", "21", "22", "23",
  161. "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",
  162. "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",
  163. "63", "64", "65", "71", "81", "82" };
  164. String province = randomOne(provinces);
  165. // 随机生成地级市、盟、自治州代码 3-4
  166. String city = randomCityCode(18);
  167. // 随机生成县、县级市、区代码 5-6
  168. String county = randomCityCode(28);
  169. // 随机生成出生年月 7-14
  170. String birth = randomBirth(20, 50);
  171. // 随机生成顺序号 15-17(随机性别)
  172. String no = new Random().nextInt(899) + 100+"";
  173. // 随机生成校验码 18
  174. String checks[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  175. "X" };
  176. String check = randomOne(checks);
  177. // 拼接身份证号码
  178. id = province + city + county + birth + no + check;
  179. return id;
  180. }
  181. /**
  182. * 随机生成minAge到maxAge年龄段的人的生日日期
  183. *
  184. * @author mingzijian
  185. * @param minAge
  186. * @param maxAge
  187. * @return
  188. */
  189. public static String randomBirth(int minAge, int maxAge) {
  190. SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");// 设置日期格式
  191. Calendar date = Calendar.getInstance();
  192. date.setTime(new Date());// 设置当前日期
  193. // 随机设置日期为前maxAge年到前minAge年的任意一天
  194. int randomDay = 365 * minAge
  195. + new Random().nextInt(365 * (maxAge - minAge));
  196. date.set(Calendar.DATE, date.get(Calendar.DATE) - randomDay);
  197. return dft.format(date.getTime());
  198. }
  199. /**
  200. * 随机生成两位数的字符串(01-max),不足两位的前面补0
  201. *
  202. * @author mingzijian
  203. * @param max
  204. * @return
  205. */
  206. public static String randomCityCode(int max) {
  207. int i = new Random().nextInt(max) + 1;
  208. return i > 9 ? i + "" : "0" + i;
  209. }
  210. /**
  211. * 从String[] 数组中随机取出其中一个String字符串
  212. *
  213. * @author mingzijian
  214. * @param s
  215. * @return
  216. */
  217. public static String randomOne(String s[]) {
  218. return s[new Random().nextInt(s.length - 1)];
  219. }
  220. public static void main(String[] args) {
  221. for (int i = 0; i < 3; i++) {
  222. BankCardBean bean = getBankCardBean();
  223. System.out.println("信用卡卡号:" + bean.getCardNo() + " Cvv:"+bean.getCvv()
  224. + " 有效期: " + bean.getValidityPeriod() + " 银行名:" + bean.getBankName());
  225. System.out.println("持卡人姓名:" + bean.getHolderName() + " 身份证号:" + bean.getHolderIdCardNo());
  226. System.out.println("----------------------------------------");
  227. }
  228. }
  229. }