За последние 24 часа нас посетили 18346 программистов и 1605 роботов. Сейчас ищут 910 программистов ...

Скрипт для получения\отправки XML-запросов

Тема в разделе "Прочие вопросы по PHP", создана пользователем Santer063, 7 ноя 2013.

  1. Santer063

    Santer063 Новичок

    С нами с:
    28 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте. Вот такая у меня проблема.

    Файл index.htm :

    <title>Отправка данных</title>
    </head>
    <body>
    <h1>Отправка данных</h1>
    <form name="zapros" id="zapros">
    <p><input type="text" name="surname" id="surname" value="" size="25" />
    <small> Фамилия</small>
    </p>
    <p><input type="text" name="firstname" id="firstname" value="" size="25" />
    <small> Имя</small>
    </p>
    <p><input type="text" name="middlename" id="middlename" value="" size="25" />
    <small> Отчество</small>
    </p>
    <p><input type="date" name="dateofbirth" id="dateofbirth" value="" size="35" />
    <small> Дата рождения</small>
    </p>
    <p><input type="text" name="idseries" id="idseries" value="" size="25" />
    <small> Серия паспорта</small>
    </p>
    <p><input type="text" name="idnum" id="idnum" value="" size="25" />
    <small> Номер паспорта</small>
    </p>
    <p><button formaction="2.php" formenctype=multipart/form-data formmethod=POST>Отправить</button>
    </p>
    </form>
    </body>
    </html>


    Файл 2.php:

    <?php
    //Функция отправки xml запроса
    function PostXML($link, $xml) {
    $chx = curl_init();//инициализация curl
    curl_setopt($chx, CURLOPT_URL, $link);//адрес запроса
    curl_setopt($chx, CURLOPT_TIMEOUT, 90);
    curl_setopt($chx, CURLOPT_RETURNTRANSFER, 1);// Ожидание ответа сервера
    curl_setopt($chx, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
    curl_setopt($chx, CURLOPT_POST, 1);
    curl_setopt($chx, CURLOPT_POSTFIELDS, $xml);
    $result = curl_exec($chx);
    curl_close($chx);
    return $result;
    }
    //Присвоение переменным значений из полей html-формы
    $Surname1 = $_POST['surname'];
    $Firstname1 = $_POST['firstname'];
    $Middlename1 = $_POST['middlename'];
    $DateOfBirth1 = $_POST['dateofbirth'];
    $IdSeries1 = $_POST['idseries'];
    $IdNum1 = $_POST['idnum'];
    //////////////////////////////// ///////////////////////////////
    //////////////////СОЗДАНИЕ XML//////////////////////////
    //////////////////////////////// ///////////////////////////////
    $dom = new DomDocument('1.0','utf-8'); //Создаем xml-строку
    //Добавление корня - <Fms>
    $Fms = $dom->appendChild($dom->createElement('Fms'));
    //Добавление элемента <Request> в <Fms>
    $Request = $Fms->appendChild($dom->createElement('Request'));
    // добавление элемента <Id> в <Request>
    $Id = $Request->appendChild($dom->createElement('Id'));
    // добавление элемента <Auth> в <Request>
    $Auth = $Request->appendChild($dom->createElement('Auth'));
    // добавление элемента <MemberCode> в <Auth>
    $MemberCode = $Auth->appendChild($dom->createElement('MemberCode'));
    // добавление элемента <User> в <Auth>
    $User = $Auth->appendChild($dom->createElement('User'));
    // добавление элемента <Password> в <Auth>
    $Password = $Auth->appendChild($dom->createElement('Password'));
    // добавление элемента <Contents> в <Request>
    $Contents = $Request->appendChild($dom->createElement('Contents'));
    // добавление элемента <Surname> в <Contents>
    $Surname = $Contents->appendChild($dom->createElement('Surname'));
    // добавление элемента <Firstname> в <Contents>
    $Firstname = $Contents->appendChild($dom->createElement('Firstname'));
    // добавление элемента <Middlename> в <Contents>
    $Middlename = $Contents->appendChild($dom->createElement('Middlename'));
    // добавление элемента <DateOfBirth> в <Contents>
    $DateOfBirth = $Contents->appendChild($dom->createElement('DateOfBirth'));
    // добавление элемента <IdSeries> в <Contents>
    $IdSeries = $Contents->appendChild($dom->createElement('IdSeries'));
    // добавление элемента <IdNum> в <Contents>
    $IdNum = $Contents->appendChild($dom->createElement('IdNum'));
    //////////////////////////////// //////////////////////////////// /////////////////
    //////ЗАПОЛНЕНИЕ XML-ФАЙЛА ДАННЫМИ
    $Id->appendChild($dom->createTextNode('***'));
    //$MemberCode->appendChild($dom->createTextNode('0011221100'));
    $User->appendChild($dom->createTextNode('######'));
    $Password->appendChild($dom->createTextNode('########'));
    $Surname->appendChild($dom->createTextNode($Surname1));
    $Firstname->appendChild($dom->createTextNode($Firstname1));
    $Middlename->appendChild($dom->createTextNode($Middlename1));
    $DateOfBirth->appendChild($dom->createTextNode($DateOfBirth1));
    $IdSeries->appendChild($dom->createTextNode($IdSeries1));
    $IdNum->appendChild($dom->createTextNode($IdNum1));
    //////////////////////////////// //////////////////////////////// /////////////////
    //генерация xml
    $dom->formatOutput = true;
    // Сохранить XML как строку или файл
    $test1 = $dom->saveXML(); // передача строки в test1
    $dom->save('test1.xml'); // сохранение файла
    //////////////////////////////// /////////////////////////
    ///////////////КОНЕЦ СОЗДАНИЯ XML///////////////////////
    //////////////////////////////// ///////////////////////////////
    $respons = PostXML('http://###########', base64_encode($test1));//ответ сервера
    $res = simplexml_load_string(base64_decode($respons));
    $res->asXML('otvet.xml');
    $surname_->Record->surname;
    $firstname_->Record->firstname;
    $middlename_->Record->middlename;
    $dateofbirth_->Record->dateofbirth;
    $idseries_->Record->idseries;
    $idnum_->Record->idnum;
    $issuedate->Record->issuedate;
    $regdate->Record->regdate;
    $regarea->Record->regarea;
    $regdistrict->Record->regdistrict;
    $regcity->Record->regcity;
    $regplace->Record->regplace;
    $regstreet->Record->regstreet;
    $reghousenumber->Record->reghousenumber;
    $regbuild->Record->regbuild;
    $regappartment->Record->regappartment;
    $note->Record->note;
    ?>

    Задача: Заполняем форму информацией, формируем XML-запрос с заранее оговоренной структурой, отправляем его на URL, там его обрабатывают, и присылают ответ в формате XML также с заранее известной структурой.
    Доп. информация:
    1.как видно из скрипта, данные кодируются в base64 и ответ тоже приходит закодированным, нужно его раскодировать и сохранить xml в файл otvet.xml
    2.для авторизации на удаленном сервере используется membercode, user,password,а также д.б. установлен сертификат удостоверяющего центра. Запрос д. б. подписан эцп
    в формате РКС#7. на компютере установлено криптоПРО.
    3.Обмен между мной и urlом подразумевается в онлайновом синхронном режиме

    При попытке отправки появляется ошибка:
    Fatal error: Call to a member function asXML() on a non-object in ...\2.php on line 78

    Подскажите пожалуйста, как решить данную проблему?
    Возможно нужно совсем не так делать, как я делаю?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Перевести ошибку пробовал? Похоже запрос не прошел.
     
  3. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    вай какой запрос .. функция asXML не существует вот и вся ошибка =) и да .. переводите с английского пишет же все
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Нет. Ошибка о другом говорит. Более конкретно.
     
  5. noganno

    noganno Новичок

    С нами с:
    26 авг 2013
    Сообщения:
    58
    Симпатии:
    0
    Код (Text):
    1. $res->asXML('otvet.xml');
    По ходу сюда надо вставить не файл а объект
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ребята, вы вон совсем igordata шокировали :) Тут всего лишь написано, что произошла попытка вызова asXML для не объекта. Ну такую-то фразу переводить нужно уметь :)) То есть в $res в этот момент хранится не объект, а что-то другое :) Значит не сработала как надо строка
    Код (Text):
    1. $res = simplexml_load_string(base64_decode($respons));
    А это в свою очередь значит, что в $respons не валидный XML-код, а что-то левое.