相关链接:统一社会信用代码编码规则
public static boolean isValidUnifiedSocialCreditIdentifier(String unifiedSocialCreditIdentifier) {
// 代码字符集,不含 I O S V Z,共30位
String codes = "0123456789ABCDEFGHJKLMNPQRTUWXY";
// 各位置序号上的加权因子
int[] weightFactor = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
// 级数之和
int sum = 0;
// 前17位
for (int i = 0; i < unifiedSocialCreditIdentifier.length() - 1; i++) {
sum += weightFactor[i]
* codes.indexOf(unifiedSocialCreditIdentifier.substring(i, i + 1));
}
// 求级数之和模31的余数
int mod = sum % 31;
// 求理论上计算出来的校验码字符值
char calculatedCheckCode = codes.toCharArray()[31 - mod];
return unifiedSocialCreditIdentifier.substring(unifiedSocialCreditIdentifier.length() - 1)
.equals(calculatedCheckCode + "");
}