МВР предоставят за първи път възможността да се провери дали даден документ (лична карта, паспорт, шофьорска книжка или моряшки паспорт) е валиден, но за момента това е възможно само на тяхната страница. Една такава полезна функционалност, е nice-to-have за всеки един софтуер, където има сключване на договори. Затова след малко заигравка въпросната проверка може да се превърне в Web Service.
Стъпките са следните:
1) Отваря се страницата и от събитието onclick на бутона се взима един стринг, който изглежда така: C22574C60042E337.a1a096ff9bbd6b84c22572a3005638f0/$Body/0.140E и се използва в следващата стъпка.
Понеже нямам идея дали тая космическа IBM-ка технология (Domino) не сменя тоя стринг си го взимам преди всяка заявка.
2) Формира се стринг за POST заявка и ще взима страницата с резултата.
3) Резултата от точка 2) се проверя дали съдържа съобщение за валиден документ или невалиден такъв.
Фукцията която успях да сглобя (сорса по-долу) има 2 параметъра. Първия е тип на документа:
- лична карта
- шофьорска книжка
- паспорт
- моряшки паспорт
Втория е номера на самия документ.
Резултата е една от следните 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;
}