Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Curl + Base64 encode, Нетривиальная проблема 
:(
    Опции темы
EasyTask
Дата 26.5.2012, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Добрый день! Помогите разобраться с непростой задачкой. Ситуация обстоит следующим образом:

Наш сайт генерирует XML, затем кодирует его в base64 и с помощью POST запроса отправляет кодированный XML на биллинг, где он уже конкретно обрабатывается. Проблемы пришла оттуда, откуда ее меньше всего ждали. При определенном сочетании символов мы получаем следующий кодированный XML:
Код

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGNoZWNrX29yZGVyIHBhcnRuZXJfaWQ9IjEwMjEiIHJlcXVlc3RfaWQ9IjEzMDc1MDQxIj48c2lnbmF0dXJlPjg4MDRmYjgyZDBjYWVlYmYzYjYyYjZlNzhhMGYxN2EzPC9zaWduYXR1cmU+PC9jaGVja19vcmRlcj4K

Что в оригинале означает:
Код

<?xml version="1.0" encoding="UTF-8"?>
<check_order partner_id="1021" request_id="13075041"><signature>8804fb82d0caeebf3b62b6e78a0f17a3</signature></check_order>

Все ыбы хорошо, если бы не одно НО. НО это заключается в одном, маленьком символе создающем большие проблемы:
Вырезка из кодированного XML:
Код

mU+PC

При отправке POST запроса, символ "+" проходит urlencode и в результате приобретает вид "%2B" и при раскодировке "бьет" нашу XML. 

Кто то сталкивался с подобным? Помогите с решением проблемы.
PM MAIL   Вверх
EasyTask
Дата 26.5.2012, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Пока что отвечу сам себе smile 
На данный момнет вижу два пути решения проблемы:

1. Существуют специальные функции для безпопасного base64 кодирования:
Код

function urlsafe_b64encode($string) {
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_',''),$data);
    return $data;
}

function urlsafe_b64decode($string) {
    $data = str_replace(array('-','_'),array('+','/'),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return base64_decode($data);
}

В наших реалиях мало реалзиуемо, т.к генерация и отправка base64  происходит в огромом количестве частей кода + кодер нужно весить на платформу, а декодер на биллинг.

2. Более изященое решение, перед декодом проводить замену "заурлэнкоженных" символов, на нормальные (т.е проводить "обратный" urlencode)

%2B => +
%3D => =
%26 => &
%2F => /

Но может все же есть более изященое решение? Например опция курла? (POST запросы отправляются через curl)
PM MAIL   Вверх
ksnk
Дата 26.5.2012, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(EasyTask @  26.5.2012,  04:31 Найти цитируемый пост)
Наш сайт генерирует XML, затем кодирует его в base64 и с помощью POST запроса отправляет кодированный XML на биллинг, где он уже конкретно обрабатывается

Как посылается этот XML? Curl? Какой тип передачи данных используется - загрузка файла или передача в поле формы?

По всей видимости, в процессе генерации-получения происходит еще одно, лишнее url-кодирование, так как в обычной жизни раскодировать вручную не нужно.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 26.5.2012, 08:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(EasyTask @  26.5.2012,  04:31 Найти цитируемый пост)
Наш сайт генерирует XML, затем кодирует его в base64 и с помощью POST запроса отправляет кодированный XML на биллинг

А зачем кстати? Почему не передавать просто XML?

Что касается вопроса, то 
Код

base64_decode(rawurldecode($encodedXml))
 должно решить проблему.
Проверять действительно ли где-то кодируется POST параметр, как писал ksnk,  сейчас негде

Это сообщение отредактировал(а) Fortop - 26.5.2012, 08:45


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
EasyTask
Дата 26.5.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Код

Как посылается этот XML? Curl? Какой тип передачи данных используется - загрузка файла или передача в поле формы?

Да курл. Ни так и ни так. xml кодируется в строку и выступает в результате post параметра отправляемых курлом.

Код

А зачем кстати? Почему не передавать просто XML?

Ранее был другой способ передачи:
http://billing.url/?order=xml_in_base64

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

Да, об этом я и писал что перед декодом, на биллинге, нужно использовать декодер урл.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.