Проверка валидност на документ в МВР

МВР предоставят за първи път възможността да се провери дали даден документ (лична карта, паспорт, шофьорска книжка или моряшки паспорт) е валиден, но за момента това е възможно само на тяхната страница. Една такава полезна функционалност, е nice-to-have за всеки един софтуер, където има сключване на договори. Затова след малко заигравка въпросната проверка може да се превърне в Web Service. 

Стъпките са следните:

1) Отваря се страницата и от събитието onclick на бутона се взима един стринг, който изглежда така: C22574C60042E337.a1a096ff9bbd6b84c22572a3005638f0/$Body/0.140E и се използва в следващата стъпка.

Понеже нямам идея дали тая космическа IBM-ка технология (Domino) не сменя тоя стринг си го взимам преди всяка заявка.

2) Формира се стринг за POST заявка и ще взима страницата с резултата. 

3) Резултата от точка 2) се проверя дали съдържа съобщение за валиден документ или невалиден такъв.

Фукцията която успях да сглобя (сорса по-долу) има 2 параметъра. Първия е тип на документа:

  1. лична карта
  2. шофьорска книжка
  3. паспорт
  4. моряшки паспорт

Втория е номера на самия документ.

Резултата е една от следните 3 стойности:

-1 - възникнала е грешка

0 - валиден документ

1 - невалиден документ

Понеже стъпките са доста, проверките ми са малко хамалски. Така обаче избягвам множество if-else конструкции. 

Самата функция за проверката използва curl модула на PHP, докато за уеб сървиса съм използвал nusoap. В повечето примери от нета се използва $HTTP_RAW_POST_DATA, която пък зависи от директивата always_populate_raw_post_data в конфигурационния файл php.ini. Вместо това сложих "php://input" което работи винаги.

Код на web service за валидност на документи

Код на клиента за този web service

Ето я и самата функция:

function checkDocumentValidity($type, $number)

{

$type_arr = array(6729, 6733, 6730, 6732);

$url = 'http://nbds.mvr.bg/bds7/web.nsf/fVerification';

$regexp1 = '/id="Search"(.*?)"return _doClick\('(.*?)'/i';

$regexp2 = '//i';

$urlkey = "";

$result = -1;

$type = $type_arr[$type-1];

// create and initialize cURL object

$curl = curl_init();

curl_setopt_array($curl, array(

CURLOPT_RETURNTRANSFER => true, // return web page

CURLOPT_HEADER => false, // don't return headers

CURLOPT_FOLLOWLOCATION => true, // follow redirects

CURLOPT_USERAGENT => "doccheck v1.0", // who am i

CURLOPT_AUTOREFERER => true, // set referer on redirect

CURLOPT_CONNECTTIMEOUT => 20, // timeout on connect

CURLOPT_TIMEOUT => 20, // timeout on response

CURLOPT_MAXREDIRS => 3 // stop after 10 redirects

));

curl_setopt($curl, CURLOPT_URL, $url);

$data = curl_exec($curl);

// check for error

if (curl_errno($curl) != 0) {

curl_close($curl);

return $result;

}

// the request was successful

$fl = preg_match($regexp1, $data, $matches);

// check for no match

if (!$fl) {

curl_close($curl);

return $result;

}

// prepare and execute post request

$postparams = '__Click=' . urlencode($matches[2]) . 

"&%25%25Surrogate_TypeDoc=1&TypeDoc=$type&Number=$number";

curl_setopt($curl, CURLOPT_URL, $url . '?OpenForm');

curl_setopt($curl, CURLOPT_POST, true);

curl_setopt($curl, CURLOPT_POSTFIELDS, $postparams);

$data = curl_exec($curl);

// check for error

if (curl_errno($curl) != 0) {

curl_close($curl);

return $result;

}

// check for no match

$fl = preg_match($regexp2, $data, $matches);

if (!$fl) {

curl_close($curl);

return $result;

}

// check if "ok" or "error"

$result = ($matches[1] == 'ok') ? 0 : 1;

// close cURL

curl_close($curl);

 

return $result;

}

Подобни публикации: