PHP / CakePHP возвращает некорректный XML - PullRequest
0 голосов
/ 30 января 2012

Обычно я пытаюсь добавить обработку заказов Google Checkout (интеграция уровня 2) в приложение CakePHP, используя пример кода PHP Google Checkout.

Я могу успешно создавать корзины и получать уведомления, отправленные из Google в мое приложение, однако он не может их должным образом подтвердить.

Функция в коде Google, чтобы сделать это эхо это:

<?xml version="1.0" encoding="UTF-8" ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number="119963104284921-00001-7" />

Однако Google Checkout получает этот код следующим образом:

<?xml version=1.0 encoding=UTF-8 ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number=119963104284921-00001-7 />

Я не могу понять, что является причиной этого, я не думаю, что это имеет какое-либо отношение к Cake, и я отключил короткие теги PHP, чтобы я мог использовать встроенный XML, но это не имеет значения.

Если я удаляю первый < из строки, функция правильно отображает остальную часть кода, оставляет его и тормозит (очевидно, это также относится к символу ? и закрывающему символу >, просто не могу иметь их всех сразу!).

Мне удалось воспроизвести это сам, пытаясь удалить все невидимые вещи, которые делаются в коде Google, используя нижеприведенную функцию. Он делает то же самое, но содержится в контроллере (Cake) и жестко кодирует переменные.

public function blank($tags = null) {
    $schema = 'http://checkout.google.com/schema/2';
    $serial = '119963104284921-00001-7';
    if ($tags != null) {
        $acknowledgment = '<?xml version="1.0" encoding="UTF-8" ?'.'>'.'<notification-acknowledgment xmlns="'.$schema.' '.'serial-number="'.$serial.'" />';
    } else {
        $acknowledgment = '?xml version="1.0" encoding="UTF-8" ?>'.'<notification-acknowledgment xmlns="'.$schema.' '.'serial-number="'.$serial.'" />';
    }
    $this->set('_ack', $acknowledgment);
}

Оператор IF используется, чтобы показать разницу, которую составляет символ <.

Вызов его без ничего ( $ tags == null ) дает такой вывод:

<?xml version="1.0" encoding="UTF-8" ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number="119963104284921-00001-7" />

Источник .

Вызов его с любым другим значением ( $ tags! = Null ) дает такой вывод:

<?xml version=1.0 encoding=UTF-8 ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number=119963104284921-00001-7 />

Источник .

Мой вопрос (наконец-то!): Почему это происходит? и как я могу получить правильный вывод XML?

Извините, если я пропустил что-то действительно очевидное, но я бы предпочел, чтобы это было указано здесь, а не находить что-либо еще на один день!

Ответы [ 3 ]

0 голосов
/ 30 января 2012

Вы забыли закрыть кавычки в атрибуте xmlns, это вероятная причина.Попробуйте это:

$acknowledgment = '<?xml version="1.0" encoding="UTF-8" ?'.'>'.'<notification-acknowledgment xmlns="'.$schema.'" '.'serial-number="'.$serial.'" />';
0 голосов
/ 30 января 2012

Некоторые анализаторы XML не позволяют указывать кодировку заглавными буквами (например, UTF-8 неверен).

Попробуйте изменить кодировку на "utf-8", чтобы посмотреть, исправит ли она это.

0 голосов
/ 30 января 2012

эта «проблема» связана с интерпретатором PHP.

Есть решения, но все в поле зрения, а не в контролируемом.

//var
$questionmark = "?";
echo "<".$questionmark."xml version=\"1.0\" encoding=\"utf-8\"".$questionmark.">";
// separate
echo '<' . '?xml version="1.0" encoding="utf-8"?' . '>';
...