php用於檢測身份證號碼的函數

  • 2020 年 1 月 19 日
  • 筆記

如何通過一個自定義的函數類,來檢測身份證號是否合法。

檢測一個身份證的正確性,我個人分為兩種方法,一種是通過API介面,一種是本地自定義一個函數類,來檢測身份證號。

檢測身份證資訊API介面

現在網上很多用於身份證資訊檢測的API有很多,但都是收費的。這裡我不推薦,大家如果需要自己百度即可。不過我可以和大家說一說他們的檢測原理,方便各大位接入。

API身份證資訊檢測原理:

1、發送身份證上的姓名,與身份證號碼到指定的伺服器

2、指定的伺服器,通過接收的數據,與公安部身份證數據中的資訊進行對比

3、對比成後,會返回對比結果。當然結果中還會包含其它資訊,比如性別,居住地等

API身份證資訊檢測注意事項

為保護網站客戶的資訊不外漏,我們選擇身份證資訊檢測API提供商時要注意選擇正規的商家,比如阿里雲等一些比如知名的企業。

本地留存的身份證資訊要進行加密處理。以防資訊被竊取。

PHP身份證號本地檢測自定義函數

如果我們不採信API介面的形式來檢測身份證資訊的準確性,可以通過身份證號的生成規則,本地編寫一個用於檢測身份證號碼的函數。但這種方法,僅僅用於身份證號是否正確的檢測。

自定義函數類程式碼:

class IDCard {         //檢證身份證是否正確         public static function isCard($card) {             $card = self::to18Card($card);             if (strlen($card) != 18) {                 return false;             }             $cardBase = substr($card, 0, 17);             return (self::getVerifyNum($cardBase) == strtoupper(substr($card, 17, 1)));         }         //格式化15位身份證號碼為18位         public static function to18Card($card) {             $card = trim($card);             if (strlen($card) == 18) {                 return $card;             }             if (strlen($card) != 15) {                 return false;             }             // 如果身份證順序碼是996 997 998 999,這些是為百歲以上老人的特殊編碼             if (array_search(substr($card, 12, 3), array('996', '997', '998', '999')) !== false) {                 $card = substr($card, 0, 6) . '18' . substr($card, 6, 9);             } else {                 $card = substr($card, 0, 6) . '19' . substr($card, 6, 9);             }             $card = $card . self::getVerifyNum($card);             return $card;         }         // 計算身份證校驗碼,根據國家標準gb 11643-1999         private static function getVerifyNum($cardBase) {             if (strlen($cardBase) != 17) {                 return false;             }             // 加權因子             $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);             // 校驗碼對應值             $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');             $checksum = 0;             for ($i = 0; $i < strlen($cardBase); $i++) {                 $checksum += substr($cardBase, $i, 1) * $factor[$i];             }             $mod = $checksum % 11;             $verify_number = $verify_number_list[$mod];             return $verify_number;         }   }

調用方式

$nber = '身份證號碼';$IDCard = new IDCard();   var_dump($IDCard::isCard($nber));