联通iccid 19转20 使用luhn 算法的计算公式
第一次对接iccid 才知道 使用的是luhn 算法 19转20位
- 文章来源于 文章来源
当时也是一脸懵逼 的状态,然后各种chatgpt 寻找,怎么找都发现不对,最后看到这片java的文章实验是正确的,因为像这种好多鉴权、加密、升级等都是java的,还没有文档,只能试着去碰,最后终于对了
原文的思路,然后从java 改成php
ICCID共20位, 最后一位的校验位计算规则如下:
-
取前19位 . 从左到右奇数位开始. 乘以2 然后计算个位与十位数之和.
-
将所有偶数位的数字与上一步得到的值全部相加
-
将上一步得到的值乘以9 然后取余. 得到的值就是第20位的校验位
例: 89860262191507034404 最后一位校验位是4
第三行相加 1+6+9+1+6+6+0+2+1+2+2+2+9+2+5+0+7+0+3+8+4+0=76
最后 76*9 = 684
校验位就是 684%10=4 各位可以到 验证该计算方法.`
代码如下,希望能帮到大家
/**
* @param string $iccid
* @return int|string
*/
public function checkLuhn($iccid = '')
{
$strLen = strlen($iccid);
if ($strLen == 19) {
$rest = 0;
for ($i = 0; $i < $strLen; $i++) {
if($i % 2 == 0){
$oddNum = $iccid[$i] * 2;
$rest += intval($oddNum / 10) + $oddNum % 10;
} else {
$rest += $iccid[$i];
}
}
$rest = $rest * 9;
$str = $rest % 10;
} else {
$str = 6;
}
return $iccid. $str;
}