[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с разбором xml
web-monster
Мне нужно сделать приём платежей, отправку я сделал. А вот как принять и обработать xml вообще не пойму.

Они присылают мне запрос:
<?xml version="1.0" encoding="UTF-8"?>
<request type="check" >
<ps_code>101</ps_code>
<ps_tid>139711029</ps_tid>
<contract>267.44</contract>
</request>

Мне нужно это обработать и в итоге
получить:
$type = 'check';
$ps_code = 101;
$ps_tid = 139711029;
$contract = '267.44'';

И дальше я уже работаю с этими данными.
Подскажите пожалуйста!



Спустя 1 минута, 49 секунд (16.03.2011 - 16:49) Игорь_Vasinsky написал(а):
про парсер xml php не слышали? можно почитать, всегда пригодиться

Спустя 5 минут, 19 секунд (16.03.2011 - 16:54) sharki написал(а):
$xml = simplexml_load_file("то_что_они_присылают.xml");

$type= $xml["type"];
$ps_code= $xml->ps_code;
$ps_tid =$xml->ps_tid;
$contract=$xml->contract;


Спустя 2 часа, 39 минут, 11 секунд (16.03.2011 - 19:33) web-monster написал(а):
Я так делал:

if(isset($HTTP_POST_RAW_DATA))
{

$xml = simplexml_load_string($HTTP_POST_RAW_DATA);
$type = (string) $xml->attributes();
$amount = (string) $xml->amount;
$contract = (string) $xml->contract;
$point = (string) $xml->point;
$receipt = (string) $xml->receipt;
$ps_code = (int) $xml->ps_code;
$ps_tid = (int) $xml->ps_tid;
$ps_time = (string) $xml->ps_time;


они мне прислали что ответ от скрипта:

* Request:
<?xml version="1.0" encoding="UTF-8"?>
<request type="check" >
<ps_code>101</ps_code>
<ps_tid>139711029</ps_tid>
<contract>167.33</contract>
</request>
* HTTP 200
* Response:
No data in request
* Invalid XML response: error occurred while parsing element at line 1 column 11

Спустя 47 минут, 16 секунд (16.03.2011 - 20:20) sharki написал(а):
Тоже самое, только я сделал то, что ты указал в задании =)

Спустя 20 часов, 15 минут, 55 секунд (17.03.2011 - 16:36) web-monster написал(а):
Да но почему возникает?
No data in request
* Invalid XML response: error occurred while parsing element at line 1 column 11

Спустя 4 минуты, 4 секунды (17.03.2011 - 16:40) Trianon написал(а):
Вы не приводите кода, который выдает отклик, и хотите, чтоб в нем кто-то искал ошибки?

Кстати, $HTTP_POST_RAW_DATA вообще что-нибудь содержит?
По идее - не должна.

Спустя 47 минут, 20 секунд (17.03.2011 - 17:28) web-monster написал(а):
А как тогда принять то что они присылают? От меня требуется принять вот это:
* Request:
<?xml version="1.0" encoding="UTF-8"?>
<request type="check" >
<ps_code>101</ps_code>
<ps_tid>139711029</ps_tid>
<contract>167.33</contract>
<sum>200</sum>
</request>

Из этого вытащить контракт, сумму и код платежа(и если есть другие данные которые присылают) и дальше уже обрабатывать. Собственно вот это мне и нужно. Может вместо $HTTP_POST_RAW_DATA как то по другому ещё принимать можно?

Вот весь код:
<?php
include "payment_config.php"; // тут соединямся с базой

// ------------------ Если есть входящие данные то делаем дела -----------------------

if(isset($HTTP_POST_RAW_DATA))
{

$xml = simplexml_load_string($HTTP_POST_RAW_DATA);
$type = (string) $xml->attributes();
$amount = (string) $xml->amount;
$contract = (string) $xml->contract;
$point = (string) $xml->point;
$receipt = (string) $xml->receipt;
$ps_code = (int) $xml->ps_code;
$ps_tid = (int) $xml->ps_tid;
$ps_time = (string) $xml->ps_time;


// --------------- Приём переменных и обработка -------------
$command=isset($type) ? $command = $type : NULL ; // Действие
$txn_id=isset($ps_tid) ? $txn_id = $ps_tid : NULL ; // ID платежа
$ps_code = isset($ps_code) ? $ps_code = $ps_code : NULL ; // Код системы
$account=isset($contract) ? $account = $contract : NULL ; // Номер договора
$date=isset($ps_time) ? $date = $ps_time : NULL ; // Дата платежа
$sum=isset($amount) ? $sum = $amount : NULL ; // Сумма

$ps_code = mysql_real_escape_string($ps_code);
$txn_id = mysql_real_escape_string($txn_id);
$date = mysql_real_escape_string($date);
$account = mysql_real_escape_string($account);
$sum = mysql_real_escape_string($sum);
$receipt = mysql_real_escape_string($receipt);

// --------------- Проверка платежа ------------------------------
if($command=="check")
{

$res = mysql_query("SELECT * FROM users WHERE value = '$account' LIMIT 1");
$row = mysql_fetch_assoc($res);
if($row["id"]!="")
{

// -------------------Генерация XML-------------------------
header('Content-Type: text/xml; charset=utf-8');

$dom = new DOMDocument('1.0', 'utf-8');
$response = $dom->createElement('response');
$response->setAttribute('type','check');

$xml_ps_code = $dom->createElement('ps_code');
$text = $dom->createTextNode($ps_code);
$xml_ps_code->appendChild($text);
$response->appendChild($xml_ps_code);

$xml_ps_tid = $dom->createElement('ps_tid');
$text = $dom->createTextNode($txn_id);
$xml_ps_tid->appendChild($text);
$response->appendChild($xml_ps_tid);

$xml_code = $dom->createElement('code');
$text = $dom->createTextNode(0);
$xml_code->appendChild($text);
$response->appendChild($xml_code);

$desc = $dom->createElement('desc');
$response->appendChild($desc);

$xml_balance = $dom->createElement('balance');
$text = $dom->createTextNode(round($row["balance"],2));
$xml_balance->appendChild($text);
$desc->appendChild($xml_balance);

$dom->appendChild($response);
echo $dom->saveXML();

}
else
{

// -------------------Генерация XML-------------------------
header('Content-Type: text/xml; charset=utf-8');

$dom = new DOMDocument('1.0', 'utf-8');
$response = $dom->createElement('response');
$response->setAttribute('type','check');

$xml_ps_code = $dom->createElement('ps_code');
$text = $dom->createTextNode($ps_code);
$xml_ps_code->appendChild($text);
$response->appendChild($xml_ps_code);

$xml_ps_tid = $dom->createElement('ps_tid');
$text = $dom->createTextNode($txn_id);
$xml_ps_tid->appendChild($text);
$response->appendChild($xml_ps_tid);

$xml_code = $dom->createElement('code');
$text = $dom->createTextNode(1);
$xml_code->appendChild($text);
$response->appendChild($xml_code);

$xml_desc = $dom->createElement('desc');
$text = $dom->createTextNode('Абонент не найден');
$xml_desc->appendChild($text);
$response->appendChild($xml_desc);

$dom->appendChild($response);
echo $dom->saveXML();

}

}

else
if
($command=="pay")
{
// тут уже обработка и зачисление платежа
}
else
{
echo 'Unknown command';
}

}

else
{
echo 'No data in request';
}
?>

Спустя 23 минуты, 41 секунда (17.03.2011 - 17:51) Trianon написал(а):
Что от Вас требуется, я уже понял. Я не понял, что Вы обрабатываете по факту.
В любом случае никаких echo Вы не видите - они уносятся оператору в канал.

Что бы я сделал , так это
1. сразу перехватил выходной поток
ob_start();
2. записал в файл входные данные в том виде, как они приняты
file_put_contents('input.txt', $HTTP_POST_RAW_DATA);

3. выполнил бы весь код, начиная от include "payment_config.php"; и по последнюю скобку,
4. сохранил бы перехваченный вывод в другом файле:
file_put_contents('output.txt', ob_get_contents());
5. и наконец, вывел бы буфер наружу.
ob_end_flush();

А потом можно было бы заняться файлами input.txt и output.txt на предмет анализа логических ошибок.

Спустя 1 час, 35 минут, 9 секунд (17.03.2011 - 19:27) web-monster написал(а):
А так в целом обработка правильно написана?

Спустя 7 минут (17.03.2011 - 19:34) Trianon написал(а):
Как может быть правильно написана обработка, если она начинается с обращения к неопределенной переменной?
Вслепую даже смотреть не буду.

Спустя 32 минуты, 38 секунд (17.03.2011 - 20:06) web-monster написал(а):
А кроме как $HTTP_POST_RAW_DATA ещё как нибудь можно принимать?

Потому-что судя из скрипта там идёт проверка
if(isset($HTTP_POST_RAW_DATA))
{
}

else
{
echo 'No request';
}

А они пишут что скрипт отдаёт No request

Спустя 30 минут, 10 секунд (17.03.2011 - 20:36) Trianon написал(а):
Где Вы определяете эту переменную?

Можно попробовать прочесть содержимое псевдофайла php://input функцией file_get_contents()
Или даже сразу тем, куда надо - simplexml_load_file()
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.