четверг, 10 июля 2008 г.

XML-интерфейсы WebMoney. Часть 2. X2, X6, X8, X11(Продолжение)

Интерфейс X6. Отправка сообщений.

С помощью этого интерфейса вы можете отправить сообщение по внутренней WM-почте. Полное описание интерфейса находится здесь. Интерфейс требует включения путем обращения в службу поддержку WMID 941977853154.

Наш XML-запрос должен выглядеть так:

<w3s.request> <reqn></reqn> <wmid></wmid> <sign></sign> <message> <receiverwmid></receiverwmid> <msgsubj></msgsubj> <msgtext></msgtext> </message> </w3s.request>

Что означают параметры:

  • reqn - номер запроса, всякий раз должен быть больше предыдущего;
  • wmid - ваш WMID;
  • sign - подпись запроса, сформированная из параметров: receiverwmid + reqn + msgtext + msgsubj ;
  • receiverwmid - WMID получателя сообщения;
  • msgsubj - тема сообщения;
  • msgtext - текст сообщения.

Формат ответа сервера WebMoney можно посмотреть в описании интерфейса. Нас интересует, фактически, только одно поле ответа - <retval>. Если оно равно 0, то запрос выполнен успешно. В противном случае, оно будет содержать код ошибки.

Приведем теперь полностью функцию, которая реализует работу с интерфейсом X6 и добавим её в wmxml.inc.php:

// ИНТЕРФЕЙС X6. ОТПРАВКА СООБЩЕНИЯ. // На выходе: массив ['retval'=>код выполнения, 'retdesc'=>описание результата, 'date'=>дата и время] function _WMXML6 ($wmid,$msg,$subj) { global $Global_WMID, $XML_addr; $reqn=_GetReqn(); $msg=trim($msg); $subj=trim($subj); $msg=str_replace ("&#92;r", "", $msg); $rsign=_GetSign($wmid.$reqn.$msg.$subj); $msg=htmlspecialchars($msg, ENT_QUOTES); $subj=htmlspecialchars($subj, ENT_QUOTES); $msg=iconv("CP1251", "UTF-8", $msg); $subj=iconv("CP1251", "UTF-8", $subj); $xml=" <w3s.request> <reqn>$reqn</reqn> <wmid>$Global_WMID</wmid> <sign>$rsign</sign> <message> <receiverwmid>$wmid</receiverwmid> <msgsubj>$subj</msgsubj> <msgtext>$msg</msgtext> </message> </w3s.request>"; $resxml=_GetAnswer($XML_addr[6], $xml); // echo $resxml; $xmlres = simplexml_load_string($resxml); if(!$xmlres) { $result['retval']=1000; $result['retdesc']="Не получен XML-ответ"; return $result; } $result['retval']=strval($xmlres->retval); $result['retdesc']=iconv("UTF-8", "CP1251", strval($xmlres->retdesc)); $result['date']=strval($xmlres->message->datecrt); return $result; }

Разберем, что происходит в этой функции.

Функция получает переменные:

  • $wmid - WMID получателя сообщения.
  • $msg - текст сообщения до 1024 символов без пробелов в начале и конце.
  • $subj - тема сообщения до 255 символов без пробелов в начале и конце. Может быть пустой. Переносы строк не допускаются. Тема отображается только у пользователей Keeper Light.

Генерируем уникальный номер запроса $reqn с помощью функции _GetReqn():

$reqn=_GetReqn();

Выполняем некоторые преобразования, чтобы избежать ошибок. У $msg и $subj убираем лишние пробелы в начале и конце.

$msg=trim($msg); $subj=trim($subj);

В качестве переноса строк в тексте сообщения допускается использовать только \n. Поскольку высока вероятность попадания в $msg переноса строк, обозначенного \r\n, то удалим из текста \r:

$msg=str_replace ("&#92;r", "", $msg);

Получаем подпись XML-пакета с помощью функции _GetSign(). На вход функции подаем строку, полученную в результате склейки параметров, как это предусмотрено в описании интерфейса. Параметры должны склеиваться именно в таком порядке, как это указано ниже. Значения всех параметров при формировании строки подписи обязательно должны быть в кодировке Win1251! Поэтому - внимание! - если функция _WMXML6(), с которой мы сейчас работаем, получила переменные $msg или $subj в кодировке, отличной от Win1251, то их нужно сперва перекодировать. Остальные параметры содержат всегда только цифры, поэтому для них кодировка никакой роли не играет.

$rsign=_GetSign($wmid.$reqn.$msg.$subj);

Теперь преобразуем специальные символы ("<", "&" и др.) в html-сущности. Если этого не сделать, то при попадании в $msg или $subj таких символов WebMoney наш запрос не примет и вернет ошибку "A name was started with an invalid character". Обратите внимание, что при формировании строки подписи переменные $msg и $subj пребывали в своем первозданном виде, со всеми спецсимволами, а преобразование мы выполняем уже после получения подписи. Преобразовать спецсимволы в PHP можно с помощью функции htmlspecialchars():

$msg=htmlspecialchars($msg, ENT_QUOTES); $subj=htmlspecialchars($subj, ENT_QUOTES);

Но это еще не всё. $msg и $subj могут содержать русские символы. Например, в $msg может быть такой текст: "привет & пока!". И здесь нужно понимать, как подготовить $msg и $subj для передачи в составе XML-пакета. Дело в том, что содержимое полученного от вас XML сервер WebMoney попытается прочитать так, будто он пришел в кодировке Unicode. Если сервер встретит в пакете русские символы в другой кодировке, то вернет ошибку: "An invalid character was found in text content" ("Обнаружен ошибочный символ"). Для того чтобы этого не произошло, нам нужно принудительно перекодировать $msg и $subj в UTF-8 и уже в таком виде включать их в XML-запрос.

Сделать преобразование кодировок можно с помощью функции iconv() из одноименного расширения PHP:

$msg=iconv("CP1251", "UTF-8", $msg); $subj=iconv("CP1251", "UTF-8", $subj);

То же самое, но с помощью функции mb_convert_encoding() из расширения mbstring:

$msg=mb_convert_encoding($msg, "UTF-8", "windows-1251"); $subj=mb_convert_encoding($subj, "UTF-8", "windows-1251");

Можно даже преобразовать не в UTF-8, а в html-сущности, это тоже сработает:

$msg=mb_convert_encoding($msg, "HTML-ENTITIES","windows-1251"); $subj=mb_convert_encoding($subj, "HTML-ENTITIES","windows-1251");

Если же iconv и mbstring вашим сервером не поддерживаются, то могу предложить еще один вариант. Оставьте $msg и $subj в кодировке Win1251, а в начале XML-запроса вставляйте заголовок . Он укажет, что данные в пакете переданы в Win1251, и сервер WebMoney обработает их именно в этой кодировке. То есть пакет будет начинаться так:

$xml=" <!--xml version='1.0' encoding='windows-1251'?--> <w3s.request> ...

Правда, хотя на момент написания этих строк такой вариант работал нормально, не могу поручиться, что он будет работать всегда, поскольку точная логика обработки XML-пакета сервером WebMoney не известна, и не ясно, будет ли всегда сервер учитывать заголовок XML-запроса.

Понятно, что если переменные $msg и $subj были переданы в функцию _WMXML6(), уже пребывая в кодировке UTF-8, то никаких преобразований делать не нужно.

Наконец, формируем XML-пакет с запросом:

$xml=" <w3s.request> <reqn>$reqn</reqn> <wmid>$Global_WMID</wmid> <sign>$rsign</sign> <message> <receiverwmid>$wmid</receiverwmid> <msgsubj>$subj</msgsubj> <msgtext>$msg</msgtext> </message> </w3s.request>";

Отправляем запрос на сервер WebMoney и получаем от него ответ с помощью функции _GetAnswer(). На вход функции подаем URL интерфейса X6 из глобального массива $XML_addr, а также пакет XML-запроса, сформированный только что:

$resxml=_GetAnswer($XML_addr[6], $xml);

Для отладки и поиска ошибок может потребоваться прочитать XML-ответ "в чистом виде". Тогда просто раскомментируйте следующую строку:

// echo $resxml;

Вызовом функции simplexml_load_string() из библиотеки SimpleXML создаем на основе XML-ответа, полученного от WebMoney, объект. Параметры XML-ответа становятся свойствами объекта, и мы сможем легко получать к ним доступ.

$xmlres = simplexml_load_string($resxml);

Если $xmlres не создан, значит, мы по какой-то причине не получили ответ от WebMoney. Тогда прерываем работу функции:

if(!$xmlres) { $result['retval']=1000; $result['retdesc']="Не получен XML-ответ"; return $result; }

Читаем следующие свойства объекта: retval (содержит результат выполнения запроса; если сообщение отправлено успешно, то retval равен 0), retdesc (содержит расшифровку результата), message/datecrt (содержит дату и время отправки сообщения). Сохраняем эти переменные в массив $result.

$result['retval']=strval($xmlres->retval); $result['retdesc']=iconv("UTF-8", "CP1251", strval($xmlres->retdesc)); $result['date']=strval($xmlres->message->datecrt);

Обратите внимание, что содержимое поля <retdesc> мы перекодировали из UTF-8 в Win1251. Дело в том, что XML-ответ от WebMoney приходит в кодировке Windows1251, но SimpleXML при помещении XML-данных в объект принудительно превратил их в Юникод. Такая вот у него особенность. А так как <retdesc> - это строка, и теоретически она может содержать русские символы, то при выемке её из объекта мы возвращаем ей "родную" кодировку. Хотя, в общем, это не обязательно и зависит от ваших нужд и задач.

На выходе функция _WMXML6() возвращает массив $result:

return $result;

Теперь осталось только проверить, как работает то, что мы написали. Создадим скрипт для тестов test.php:

<!--php // test.php - скрипт для тестирования include("wmxml.inc.php"); $wmid="wmid_получателя"; $msg="<b-->тест1</b> тест2 <q>тест3</q>"; $subj="тестовая тема"; $r=_WMXML6($wmid,$msg,$subj); echo "Результат (0 - успешно) - ".$r['retval']."<br>"; echo "Расшифровка - ".$r['retdesc']."<br>"; echo "Дата и время - ".$r['date']."<br>"; ?>

Этот код должен выполнить отправку сообщения с текстом из трех строк и темой "тестовая тема" на WMID получателя.

Не забывайте, что в тексте сообщения можно использовать теги <b>...</b> (выделяет текст между тегами жирным), <i>...</i> (выделяет текст курсивом), <u>...</u> (делает текст подчеркнутым), <s>...</s> (делает текст перечеркнутым), <q>...</q> (помечает текст как цитату). Таким образом, текст из нашего примера:

$msg="<b>тест1</b> тест2 <q>тест3</q>";

поступит в Кипер получателя в следующем виде:

тест1
тест2
> тест3

Интерфейс X8. Определение принадлежности кошелька.

Один из наиболее простых интерфейсов. С его помощью можно установить, существует ли в WebMoney определенный WMID или кошелек, а также определить, какому WMID принадлежит кошелек. Полное описание интерфейса находится здесь. Интерфейс требует включения путем обращения в службу поддержку WMID 941977853154.

Наш XML-запрос должен выглядеть так:

<w3s.request> <reqn></reqn> <wmid></wmid> <sign></sign> <testwmpurse> <wmid></wmid> <purse></purse> </testwmpurse> </w3s.request>

Что означают параметры:

  • reqn - номер запроса, всякий раз должен быть больше предыдущего;
  • wmid - ваш WMID;
  • sign - подпись запроса, сформированная из параметров: testwmpurse\wmid + testwmpurse\purse
  • testwmpurse\wmid - WMID, который мы хотим проверить;
  • testwmpurse\purse - номер кошелька, который мы хотим проверить.

Формат ответа сервера:

<w3s.response> <reqn></reqn> <retval></retval> <retdesc></retdesc> <testwmpurse> <wmid></wmid> <purse></purse> </testwmpurse> </w3s.response>

В ответе от сервера WebMoney нас будут интересовать поля <retval>, <wmid>, <purse>.

  1. Мы хотим проверить, существует ли в системе определенный WMID.
    Передаем в запросе только <wmid>, а <purse> оставляем пустым. Если WMID существует, получаем в ответе retval=1. Если не существует, то retval=0.
  2. Мы хотим проверить, существует ли в системе определенный кошелек, и установить, какому WMID он принадлежит.
    Передаем в запросе только <purse>, а <wmid> оставляем пустым. В случае успешного нахождения кошелька получаем в ответе retval=1, а также заполненные поля <wmid> и <purse> (в поле <wmid> содержится WMID, которому принадлежит указанный кошелек). В случае, если указанный кошелек не существует в системе, получим retval=0.
  3. Мы хотим проверить, принадлежит ли определенный кошелек определенному WMID.
    Передаем в запросе и <purse>, и <wmid>. Если кошелек принадлежит WMID, то получим в ответе retval=1. Также в ответе будет присутствовать <purse> и <wmid>, которые мы передавали. Если кошелек не принадлежит WMID, то получаем ответ с retval=1, но без поля <purse>.

Приведем теперь полностью функцию, которая реализует работу с интерфейсом X8 и добавим её в wmxml.inc.php:

// ИНТЕРФЕЙС X8. ОПРЕДЕЛЕНИЕ ПРИНАДЛЕЖНОСТИ КОШЕЛЬКА. // На выходе: массив ['wmid'=>wmid, 'purse'=>кошелек, 'retval'=>код выполнения, 'retdesc'=>описание результата] function _WMXML8 ($wmid,$purse) { global $Global_WMID, $XML_addr; $reqn=_GetReqn(); $rsign=_GetSign($wmid.$purse); $xml=" <w3s.request> <reqn>$reqn</reqn> <wmid>$Global_WMID</wmid> <sign>$rsign</sign> <testwmpurse> <wmid>$wmid</wmid> <purse>$purse</purse> </testwmpurse> </w3s.request>"; $resxml=_GetAnswer($XML_addr[8], $xml); // echo $resxml; $xmlres = simplexml_load_string($resxml); if(!$xmlres) { $result['retval']=1000; $result['retdesc']="Не получен XML-ответ"; return $result; } $result['wmid']=strval($xmlres->testwmpurse->wmid); $result['purse']=strval($xmlres->testwmpurse->purse); $result['retval']=strval($xmlres->retval); $result['retdesc']=strval(iconv("UTF-8", "CP1251", $xmlres->retdesc)); return $result; }

Разберем, что происходит в этой функции.

Функция получает переменные:

  • $wmid - WMID для проверки. Может быть пустым. Если пустой - проверяется существование кошелька.
  • $purse - кошелек для проверки. Может быть пустым. Если пустой - проверяется существование WMID.

Генерируем уникальный номер запроса $reqn с помощью функции _GetReqn():

$reqn=_GetReqn();

Получаем подпись XML-пакета с помощью функции _GetSign(). На вход функции подаем строку, полученную в результате склейки $wmid и $purse.

$rsign=_GetSign($wmid.$purse);

Формируем XML-пакет с запросом:

$xml=" <w3s.request> <reqn>$reqn</reqn> <wmid>$Global_WMID</wmid> <sign>$rsign</sign> <testwmpurse> <wmid>$wmid</wmid> <purse>$purse</purse> </testwmpurse> </w3s.request>";

Отправляем запрос на сервер WebMoney и получаем от него ответ с помощью функции _GetAnswer(). На вход функции подаем URL интерфейса X8 из глобального массива $XML_addr, а также пакет XML-запроса, сформированный только что:

$resxml=_GetAnswer($XML_addr[8], $xml);

Для отладки и поиска ошибок может потребоваться прочитать XML-ответ "в чистом виде". Тогда просто раскомментируйте следующую строку:

// echo $resxml;

Вызовом функции simplexml_load_string() из библиотеки SimpleXML создаем на основе XML-ответа, полученного от WebMoney, объект. Параметры XML-ответа становятся свойствами объекта, и мы сможем легко получать к ним доступ.

$xmlres = simplexml_load_string($resxml);

Если $xmlres не создан, значит, мы по какой-то причине не получили ответ от WebMoney. Тогда прерываем работу функции:

if(!$xmlres) { $result['retval']=1000; $result['retdesc']="Не получен XML-ответ"; return $result; }

Читаем следующие свойства объекта: retval (содержит результат выполнения), retdesc (содержит расшифровку результата), testwmpurse/wmid, testwmpurse/purse. Сохраняем эти переменные в массив $result.

$result['wmid']=strval($xmlres->testwmpurse->wmid); $result['purse']=strval($xmlres->testwmpurse->purse); $result['retval']=strval($xmlres->retval); $result['retdesc']=strval(iconv("UTF-8", "CP1251", $xmlres->retdesc));

Обратите внимание, что содержимое поля <retdesc> мы перекодировали из UTF-8 в Win1251. Дело в том, что XML-ответ от WebMoney приходит в кодировке Windows1251, но SimpleXML при помещении XML-данных в объект принудительно превратил их в Юникод. Такая вот у него особенность. А так как <retdesc> - это строка, и теоретически она может содержать русские символы, то при выемке её из объекта мы возвращаем ей "родную" кодировку. Хотя, в общем, это не обязательно и зависит от ваших нужд и задач.

На выходе функция _WMXML8() возвращает массив $result:

return $result;

Теперь осталось только проверить, как работает то, что мы написали. Создадим скрипт для тестов test.php:

<!--php // test.php - скрипт для тестирования include("wmxml.inc.php"); $wmid="wmid_для_проверки"; $purse="кошелек_для_проверки"; $r=_WMXML8($wmid,$purse); if($wmid!="" && $purse=="") { if($r['retval']==1) echo "WMID $wmid существует"; if($r['retval']==0) echo "WMID $wmid НЕ существует"; } elseif($wmid=="" && $purse!="") { if($r['retval']==1) echo "Кошелек $purse существует и принадлежит WMID ".$r['wmid']; if($r['retval']==0) echo "Кошелек $purse НЕ существует"; } elseif($wmid!="" && $purse!="") { if($r['retval']==1 && $r['wmid']!="" && $r['purse']!="") echo "ДА, кошелек $purse принадлежит WMID $wmid"; if($r['retval']==1 && $r['wmid']!="" && $r['purse']=="") echo "НЕТ, кошелек $purse НЕ принадлежит WMID $wmid"; if($r['retval']==0) echo "WMID $wmid не существует. Проверка невозможна."; } ?-->

Интерфейс X11. Получение аттестационной информации.

Интерфейс, который при первом взгляде на описание кажется сложным, но при ближайшем рассмотрении оказывается довольно простым. С его помощью можно получить аттестационную информацию участника WebMoney, которую тот открыл для публичного показа. Интерфейс НЕ требует включения путем обращения в службу поддержку и работает для всех обладателей персонального (и выше) аттестата.

Наш XML-запрос должен выглядеть так:

<request> <wmid></wmid> <passportwmid></passportwmid> <sign></sign> <params> <dict></dict> <info></info> <mode></mode> </params> </request>

Что означают параметры:

  • wmid - ваш WMID. Этот параметр является необязательным.
  • passportwmid - WMID, информацию по которому нужно получить.
  • sign - подпись запроса, сформированная из параметров wmid + passportwmid. Подпись в данном интерфейсе является необязательной.
  • dict - отображение в ответе опорного словаря (1 - отображается, 0 - не отображается);
  • info - отображение в ответе паспортных данных и контактной информации владельца WMID (1 - отображаются, 0 - не отображаются);
  • mode - указывает, проверять ли установку доверенности от проверяемого WMID к WMID, подписавшему запрос (1 - проверять, 0 - не проверять).

Формат ответа сервера WebMoney можно посмотреть в описании интерфейса. Ответ дает нам исчерпывающую информацию об аттестате проверяемого WMID, паспортных данных, местонахождении, контактной информации, организационно-правовом статусе, банковских реквизитах и т.д. Однако, интерфейс возвращает только ту информацию, которую сам владелец аттестата открыл для публичного просмотра, т.е. к скрытым полям интерфейс доступа не дает (если, конечно, у вашего WMID нет доверенности от проверяемого WMID на просмотр аттестационной информации).

Забегая вперед, скажем, что интерфейс X11 отличается от всех остальных, поскольку:

  • не требует формирования подписи;
  • не требует передачи уникального номера запроса reqn;
  • XML-ответ содержит значимую информацию не в самих элементах, а в их атрибутах.

Формирование подписи в запросе необходимо лишь в случае если WMID, подписывающий запрос, является доверенным идентификатором для проверяемого аттестата. Установка доверительных отношений производится на сайте центра аттестации. Доверенные WMID могут просматривать все персональные данные владельца аттестата, даже если их видимость была заблокирована владельцем аттестата. Если доверительных отношений между проверяемым WMID и WMID, подписавшим запрос нет, то в запросе можно указать лишь параметр passportwmid, а sign и wmid оставить пустыми.

Приведем теперь полностью функцию, которая реализует работу с интерфейсом X11 и добавим её в wmxml.inc.php:

// ИНТЕРФЕЙС X11. ПОЛУЧЕНИЕ ИНФОРМАЦИИ ИЗ АТТЕСТАТА. // На выходе: массив ['att'=>код аттестата, 'recalled'=>флаг отзыва аттестата, 'retval'=>код выполнения, 'retdesc'=>описание результата] function _WMXML11 ($wmid) { global $XML_addr; $xml=" <request> <wmid></wmid> <passportwmid>$wmid</passportwmid> <sign></sign> <params> <dict>1</dict> <info>1</info> <mode>0</mode> </params> </request>"; $resxml=_GetAnswer($XML_addr[11], $xml); // echo $resxml; $xmlres = simplexml_load_string($resxml); if(!$xmlres) { $result['att']=0; $result['retval']=1000; $result['retdesc']="Не получен XML-ответ"; return $result; } if($xmlres->certinfo->attestat->row) $result['att']=strval($xmlres->certinfo->attestat->row->attributes()->tid); else { $result['att']=0; $result['retval']=1001; $result['retdesc']="Информация об аттестате не получена. Возможно, неверно указан WMID."; return $result; } $result['recalled']=$xmlres->certinfo->attestat->row->attributes()->recalled; $result['retval']=strval($xmlres->attributes()->retval); return $result; }

Разберем, что происходит в этой функции.

Функция получает единственную переменную $wmid. В ней мы передаем WMID, информацию о котором нужно получить.

Формируем XML-пакет с запросом:

$xml=" <request> <wmid></wmid> <passportwmid>$wmid</passportwmid> <sign></sign> <params> <dict>1</dict> <info>1</info> <mode>0</mode> </params> </request>";

Мы уже обращали ваше внимание, что поля <wmid> и <sign> в этом интерфейсе являются необязательными, поэтому мы их в запросе не указываем, подпись пакета функцией _GetSign() не формируем. Кроме того, в X11 нет поля <reqn> с уникальным номером запроса, поэтому функция _GetReqn() также не задействована.

Отправляем запрос на сервер WebMoney и получаем от него ответ с помощью функции _GetAnswer(). На вход функции подаем URL интерфейса X11 из глобального массива $XML_addr, а также пакет XML-запроса, сформированный только что:

$resxml=_GetAnswer($XML_addr[11], $xml);

Для отладки и поиска ошибок может понадобиться прочитать XML-ответ "в чистом виде". Тогда просто раскомментируйте следующую строку:

// echo $resxml;

Вызовом функции simplexml_load_string() из библиотеки SimpleXML создаем на основе XML-ответа, полученного от WebMoney, объект. Параметры XML-ответа становятся свойствами объекта, и мы сможем легко получать к ним доступ.

$xmlres = simplexml_load_string($resxml);

Если $xmlres не создан, значит, мы по какой-то причине не получили ответ от WebMoney. Тогда прерываем работу функции:

if(!$xmlres) { $result['att']=0; $result['retval']=1000; $result['retdesc']="Не получен XML-ответ"; return $result; }

Осталось прочитать нужные элементы объекта и отдать их на выход функции _WMXML11(). Как вы понимаете, выходных переменных может быть много, и они могут быть самыми разными - от фамилии владельца WMID, до номера его банковского счета. Но для простоты мы прочитаем только 3 элемента XML-ответа:

  • атрибут tid поля certinfo/attestat/row - содержит код аттестата. Код 100 означает аттестат псевдонима, 110 - формальный аттестат, 120 - начальный аттестат, 130 - песональный аттестат, 135 - аттестат продавца, 136 - аттестат Capitaller, 140 - аттестат разработчика, 150 - аттестат регистратора, 190 - аттестат сервиса, 170 - аттестат Гаранта, 300 - аттестат Оператора.
  • атрибут recalled поля certinfo/attestat/row - содержит информацию об отзыве аттестата. Если атрибут равен 1, то аттестат данного WMID отозван.
  • атрибут retval корневого элемента - содержит код выполнения запроса. Если равен 0, то запрос выполнен успешно. В противном случае, атрибут будет содержать код ошибки, расшифровку которой можно посмотреть в полном описании.

Читаем эти атрибуты с помощью функций SimpleXML. Сохраняем их в массив $result.

if($xmlres->certinfo->attestat->row) $result['att']=strval($xmlres->certinfo->attestat->row->attributes()->tid); else { $result['att']=0; $result['retval']=1001; $result['retdesc']="Информация об аттестате не получена. Возможно, неверно указан WMID."; return $result; } $result['recalled']=$xmlres->certinfo->attestat->row->attributes()->recalled; $result['retval']=strval($xmlres->attributes()->retval);

Проверку на существование поля <row> (if($xmlres->certinfo->attestat->row)) мы здесь ввели на тот случай, если проверяемый WMID будет задан неверно. Тогда поля <row> в ответе не будет, и нужно прервать работу функции.

На выходе функция _WMXML11() возвращает массив $result:

return $result;

Теперь осталось только проверить, как работает то, что мы написали. Создадим скрипт для тестов test.php:

<!--php // test.php - скрипт для тестирования include("wmxml.inc.php"); $wmid="здесь_запрашиваемый_wmid"; $r=_WMXML11($wmid); echo "Код аттестата - ".$r['att']."<br-->"; echo "Флаг отзыва (1 - отозван) - ".$r['recalled']."<br>"; echo "Результат (0 - успешно) - ".$r['retval']."<br>"; echo "Расшифровка - ".$r['retdesc']."<br>"; ?>

Комментариев нет: