Получаем курс валют с помощью PHP и SOAP

Часто при работе с Интернет-магазинами требуется сделать так, чтобы курсы валют обновлялись автоматически. Делается это достаточно просто. На сайте cbr.ru (Центрального Банка РФ) предусмотрено несколько Web-сервисов, работающих по протоколу SOAP и выдающих необходимую информацию. Итак, вот простой код, который получает информацию о курсе евро:


$wsdl = 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'; // указываем адрес WSDL-описания SOAP-сервиса, оттуда PHP возьмет информацию о доступных методах и их параметрах
try {
 $euro_to = 0;
 $cbr = new SoapClient($wsdl,array('soap_version'=> SOAP_1_2, 'exceptions'=>true)); // создаем клиент для подключения к SOAP-сервису
 $date = $cbr->GetLatestDateTime(); // получаем последнюю дату, за которую есть курс
// можно, ко формировать ее вручную, но нужно учитывать, что по выходным и праздникам торги не проводятся, поэтому лучше сделать так
 $result = $cbr->GetCursOnDateXML(array('On_date'=>$date->GetLatestDateTimeResult)); //запрашиваем данные о курсах за указанную дату в формате XML
// к сожалению, возможности запросить курс отдельной валюты не предусмотрено, поэтому придется пройтись циклом по всем полученным
 if ($result->GetCursOnDateXMLResult->any) {  // если в ответе сервера есть XML с курсами валют
   $xml = new SimpleXMLElement($result->GetCursOnDateXMLResult->any); // открываем его как XML-объект
   foreach ($xml->ValuteCursOnDate as $currency) { // и начинаем обходить
    if ($currency->VchCode=='EUR') { // VchCode содержит код валюты, для евро это EUR, для доллара — USD
    $euro_to = floatval($currency->Vcurs); // цена за указанное в Vnom количество валюты
    $euro_from = $currency->Vnom; // для доллара и евро количество равно единице, для других валют может отличаться
// чтобы получить реальный курс за одну единицу валюты, нужно разделить $currency->Vcurs на $currency->Vnom
    }
   }
   if ($euro_to!=0) {
    // здесь можно вставить код, который обновляет данные в магазине
   }
 }
 else echo 'Error!';
}
catch (Exception $e) { // на всякий случай обработчик ошибок
echo 'Error: '.$e->getMessage();
}