错误的方法
//从短信内容中截取验证码
private String getSmsCode(String content,Context context){
String code = "";
if (getSimOperator(context) == 0){ //中国移动,内容=验证码:883830。尊敬的用户,您正在使用短信验证码登录,5分钟内有效,请勿泄露或转发他人。【xxxx】
//使用方案一进行截取
code = StringUtils.substring(content, 4, 10);
if (!(isNumeric(code))){
//使用方案二进行截取
String s1 = StringUtils.substringAfter(content, "验证码:");
code = StringUtils.substringBefore(s1, "。尊敬的用户");
}
}else if (getSimOperator(context) == 1){ //中国联通,内容=【验证密码】尊敬的客户,您好!您的动态密码:714446,请在5分钟内登录。
//使用方案一进行截取
code = StringUtils.substring(content, 29, 36);
if (!(isNumeric(code))){
//使用方案二进行截取
String s1 = StringUtils.substringAfter(content, "动态密码:");
code = StringUtils.substringBefore(s1, ",请在");
}
}else{ //中国电信,内容=【验证密码】尊敬的客户,您好!您的动态密码:284167,请在5分钟内登录。 并且type返回的不一定是2,所以这里用else了
//使用方案一进行截取
code = StringUtils.substring(content, 29, 36);
if (!(isNumeric(code))){
//使用方案二进行截取
String s1 = StringUtils.substringAfter(content, "动态密码:");
code = StringUtils.substringBefore(s1, ",请在");
}
}
return code;
}
错误原因:这种写法是按照短信内容的坐标和规律来进行截取的,一旦第三方短信内容变化大,这种方式就截取不到验证码,实际上因为大网的拦截策略在改变,短信验证码都是在改变的
所以正确的方法
//截取验证码
public String catchCode(String body){
String code = "";
//如果有手机号码就要去掉
Pattern pattern = Pattern.compile("1[3-9]\\d{9}");
Matcher matcher = pattern.matcher(body);
if (matcher.find()){
body = body.replaceAll(matcher.group(0),"");
}
//如果有QQ号码,去掉
pattern = Pattern.compile("\\d{10}");
matcher = pattern.matcher(body);
if (matcher.find()){
body = body.replaceAll(matcher.group(0),"");
}
//如果有QQ号码,去掉
pattern = Pattern.compile("\\d{9}");
matcher = pattern.matcher(body);
if (matcher.find()){
body = body.replaceAll(matcher.group(0),"");
}
//8位连续的数字去掉
pattern = Pattern.compile("\\d{8}");
matcher = pattern.matcher(body);
if (matcher.find()){
body = body.replaceAll(matcher.group(0),"");
}
//7位连续的数字去掉
pattern = Pattern.compile("\\d{7}");
matcher = pattern.matcher(body);
if (matcher.find()){
body = body.replaceAll(matcher.group(0),"");
}
//截取六位验证码
pattern = Pattern.compile("(\\d{6})");
matcher = pattern.matcher(body);
if (matcher.find()){
code = matcher.group(0);
}
//5位连续的数字去掉
pattern = Pattern.compile("\\d{5}");
matcher = pattern.matcher(body);
if (matcher.find()){
body = body.replaceAll(matcher.group(0),"");
}
//截取四位验证码
if (TextUtils.isEmpty(code)){
pattern = Pattern.compile("(\\d{4})");
matcher = pattern.matcher(body);
if (matcher.find()){
code = matcher.group(0);
}
}
return code;
}