Часто при работе с Интернет-магазинами требуется сделать так, чтобы курсы валют обновлялись автоматически. Делается это достаточно просто. На сайте 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();
}