Получение содержимого xml-тега как есть без изменений

Yoskaldyr

"Спамер"
Партнер клуба
Недавно пришлось разбираться с API приватбанка и у них проверка контрольной суммы происходит для содержимого определенного xml-тега, в котором могут быть другие теги. Следовательно содержимое этого тега надо получать как есть без изменений. Вариант парсинга в simplexml/domdocument и обратно в xml не подходит, т.к. может переформатировать внутренние теги и убрать кое где пробельные символы.

Т.е. я то проблему решил для данного конкретного случая через регулярку, т.к. xml определенного формата и с определенной структурой. Но вообще то регулярки для разбора xml - это явно не гуд. Может есть стандартные варианты получения всего текстового содержимого xml тега как есть со всеми пробелами и форматированием или надо для каждого конкретного случая свои велосипеды писать?
 

AmdY

Пью пиво
Команда форума
Не верю. Это php-шник может регулярку влепить, а у джавистов-дотнетчиков их банка от этого кровавые слёзы будут течь. Они явно работают с xml как с xml.
А брось для интереса ссылку на их доку почитать.
 

Yoskaldyr

"Спамер"
Партнер клуба
По факту что возвращает API привата не так красиво отформатировано как в примере (где-то больше пробелов, где-то меньше).
 

Yoskaldyr

"Спамер"
Партнер клуба
Я уже склоняюсь к тому что сама постановка задачи дибильная, но чисто академически не дает покоя вопрос можно ли сделать это сделать в общем случае более менее стандартными средствами пхп - или только через велосипеды.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
<?php
$xml = <<<XMLDATA
<?xml version="1.0" encoding="UTF-8"?>
<request version="1.0">
  <merchant>
    <id>75482</id>
    <signature>5abf5c7524bc2a835acb3a9e24ce10bc5ba82a99</signature>
  </merchant>
  <data>
    <oper>cmt</oper>
    <wait>0</wait>
    <test>0</test>
    <payment id="">
      <prop name="sd" value="11.08.2013" />
      <prop name="ed" value="11.09.2013" />
      <prop name="card" value="5168742060221193" />
    </payment>
  </data>
</request>
XMLDATA;

$xml = simplexml_load_string($xml);

var_dump($xml->data->asXML());
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я, кстати, в доке нигде не вижу того, что «с сохранением табуляции и всего такого». Возможно там нужно поклеить как раз таки в одну длинную строчку.
 

Yoskaldyr

"Спамер"
Партнер клуба
Я, кстати, в доке нигде не вижу того, что «с сохранением табуляции и всего такого». Возможно там нужно поклеить как раз таки в одну длинную строчку.
Я же сказал что уже решил проблему, т.е. все работает через регулярку и все работает именно как надо. Им с очень большой вероятностью нужно именно со всеми пробелами и всем форматированием как есть (ну по крайней мере только тогда совпадает контрольная сумма).
И у них в примере xml форматированный, а по факту от них приходит все не так красиво.
@флоппик и даже в твоем примере на входе
Код:
<prop name="sd" value="11.08.2013" />
на выходе
Код:
<prop name="sd" value="11.08.2013"/>
Т.е. не одно и тоже, следовательно контрольная сумма не будет совпадать.
 

RU_ru

Новичок
для таких случаев, в стандарте есть каноникализация
странно что в API банка не добавили требование вычислять контрольную сумму ТОЛЬКО после подготовки данных(каноникализации)
 

WMix

герр M:)ller
Партнер клуба
да уж, реально долбоны эти приватбанк...
послать еще фиг с ним получится, а проверить сигнатуру ответа, красиво, никак..
даже интересно, как они реквесты валидируют
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Помню, что несколько лет назад тут была вакансия для php-шников в Приват :)
 

kpeu3i

Новичок
Yoskaldyr, подскажите, пожалуйста как вы рассчитываете поле сигнатуры при отправке запроса? Точнее, содержимое тега data.
Как бы я не пытался сформировать подпись (значение $data в формуле расчета сигнатуры с отступамми и без и т.д.), ответ от Привата "invalid signature":

Код:
<?xml version="1.0" encoding="UTF-8" ?>
<responseversion="1.0">
<data>
<errormessage="invalid signature"/>
</data>
</response>
Правильность пароля, ID мерчанта перепроверил
 

Yoskaldyr

"Спамер"
Партнер клуба
@kpeu3i При отправке какого именно запроса? Их там несколько просто
 

oliver22

Новичок
А можете предоставить регулярку которая проходит, пожалуйста?
Или некоторые данные для тестов чтобы проверить что правильно работает, а то отвечает только <error message ="invalid signature" />
 

oliver22

Новичок
В первом посте говорится о некой регулярке, которая подходит. вот хочу ее посмотреть и применить
 

Yoskaldyr

"Спамер"
Партнер клуба
@oliver22, А несколькими постами я выше я спрашивал: на какой именно запрос нужна регулярка?
 

oliver22

Новичок
Всем большое спасибо за внимание и помощь, за сутки с небольшим получилось добиться нормального респонса. Оказалось что нужно раскрывать теги (<prop name="sdfsdf" /> --> <prop name="sdfsdf"></prop>) и убирать форматирование. Возможно это и есть та упомянутая Канонизация. После удалось сгенерировать удачную сигнатуту. P.S. для тех кто реализует не на PHP, "содержимое тега data"."пароль" дожно быть вида -->
"<oper>cmt</oper><wait>0</wait><test>1</test><payment><prop name=\"cardnum\" value=\"5555625809952222\"></prop><prop name=\"country\" value=\"UA\"></prop></payment>nBXn5S0VtkMzmc72qW8bq674ZLS67apB"
 
Сверху