Здравствуйте!
Долго мучился сам, но поскольку у меня нет базисных знаний, вопрос оказался не по зубам к сож.. Поэтому с благодарностью приму помощь!
Суть:
1. Есть страница с формой для данных оплаты и скриптом я-ты-мы-они[dot]рф/pay/pay.php
2. Заполненные данные должны лететь на сервер банка как xml через POST запрос
3. Должна срабатывать переадресация на страницу банка для ввода данных карты.
И вот тут возникает проблема..
Банк получает кириллические параметры запроса в виде набора знаков "?" => в свою систему вместо кириллических ФИО, описания заказа и проч - пишет что-то типа этого - "????? ?????"
Первая мысль - проблемы с кодировкой.
НО,
- в скрипте везде указана UTF-8;
- в настройках Wordpress - UTF-8
- в .htaccess - тоже прописано
1. MikhailFedorov - 08 Ноября, 2017 - 08:53:13 - перейти к сообщению
- в БД у меня прописывается все корректно
- вывод переменной $xml до отправки - корректный в кириллице
Код страницы /pay/pay.php:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- $ShopID = 'login'; //Логин
- $ShopPasswd = 'passw'; //Пароль
- $BackURL = 'http://xn------5ddshg2a5fc2b.xn--p1ai/pay/avangard_callback.php'; //Адрес возврата
- 'fullname' => 'Имя',
- 'id' => '777',
- 'amount'=> '10',
- 'address' => 'Москва',
- 'phone' => '81231231212',
- 'email' => 'devel@user.us',
- 'desc' => 'оплата',
- 'ip' => $_SERVER['REMOTE_ADDR']
- );
- $Error = false;
- $Step = 'form';
- /*$id = $_POST['id'];*/
- //$id = date('d.m.Y H:i:s', time ());
- $id = 'тестовый заказ';
- $fullname = $_POST['fullname'];
- $amount = $_POST['amount'];
- $desc = $_POST['desc'];
- $phone = $_POST['phone'];
- $email = $_POST['email'];
- $result = $_POST['submit'];
- if ( $_POST['oferta'] == '')
- {
- echo 'Для совершения оплаты Вы должны быть согласны с <a href="http://я-ты-мы-они.рф">офертой</a>';
- }
- else {
- $err = 0;
- /*if (empty($_POST['id'])) $err++;*/
- if ($err == 0) {
- $Step = 'redirect';
- /*$desc = $_POST['desc']." #{$_POST['id']}";*/
- $data = requestTicket($id, $_POST['fullname'], $defaultUser['address'], $_POST['phone'], $_POST['email'], $_POST['amount'], $_POST['desc'], $defaultUser['ip']);
- }
- else {
- $Error = 'Не заполнены обязательные поля формы, отмеченные звездочкой!';
- }
- }
- }
- function ticketXML($id, $fullname, $address, $phone, $email, $amount, $desc, $ip) {
- global $ShopID, $ShopPasswd, $BackURL;
- $amount = (int) ($amount * 100);
- $xml = "<?xml version='1.0' encoding='utf-8'?>
- <new_order>
- <shop_id>$ShopID</shop_id>
- <shop_passwd>$ShopPasswd</shop_passwd>
- <amount>$amount</amount>
- <order_number>$id</order_number>
- <order_description>$desc</order_description>
- <language>RU</language>
- <back_url>$BackURL</back_url>
- <client_name>$fullname</client_name>
- <client_address>$address</client_address>
- <client_email>$email</client_email>
- <client_phone>$phone</client_phone>
- <client_ip>$ip</client_ip>
- </new_order>";
- return $xml;
- }
- // Запрос тикета
- function requestTicket($id, $fullname, $address, $phone, $email, $amount, $desc, $ip) {
- $xml = ticketXML($id, $fullname, $address, $phone, $email, $amount, $desc, $ip);
- //echo rawurldecode(urlencode($xml));
- //exit;
- $url = "https://www.avangard.ru/iacq/pay?ticket={$respXML->ticket}";
- // Сохраняем в сессии
- 'form' => $_POST,
- 'order_id' => $id,
- 'ticket' => (string) $respXML->ticket,
- 'ok_code' => (string) $respXML->ok_code,
- 'failure_code' => (string) $respXML->failure_code
- );
- $_SESSION['form_xml'] = $xml;
- $_SESSION['form_data_id'] = $POST['id'];
- $_SESSION['form_data_fullname'] = $_POST['fullname'];
- $_SESSION['form_data_amount'] = $_POST['amount'];
- $_SESSION['form_data_desc'] = $_POST['desc'];
- $_SESSION['form_data_phone'] = $_POST['phone'];
- $_SESSION['form_data_email'] = $_POST['email'];
- }
- }
- return false;
- }
- ?>
- <? if ($Step == 'form'): ?>
- <?=$Error ? "$Error<br>" : ''?>
- <div class="login-page">
- <div id="polosa">
- <h2>Оплата банковской картой Visa и MasterCard </h2>
- </div>
- <link type="text/css" rel="stylesheet" href="/pay/style_form.css" />
- <p>Оплатить наши услуги Вы можете в режиме он-лайн через систему электронных платежей с помощью пластиковых карт Visa, MasterCard или Maestro.</p>
- <div class="form"> <img src="/pay/payment.png" width="200" height="20" />
- <form class="login-form" name="forma" action="/pay/pay.php" method="post" charset="utf-8">
- <!--<input name="id" type="text" placeholder="* Номер договора:" value="">-->
- <input name="fullname" type="text" placeholder="* ФИО Плательщика" value="">
- <input name="amount" type="text" placeholder="* Сумма оплаты, руб" value="">
- <input name="desc" type="text" placeholder="* Назначение платежа" value="">
- <input name="phone" type="text" placeholder="* Контактный телефон" value="">
- <input name="email" type="email" placeholder="email" value="">
- Согласие с <a href="http://я-ты-мы-они.рф">офертой</a> <input style="text-align: right" type="checkbox" name="oferta" value="1">
- <input name="result" type="submit" value="Оплатить">
- </form>
- </div>
- </div>
- <? endif;
- ?>
- <?
- $phpdb = mysql_connect("localhost","tatjano1_wp2","password") or die ("Не могу соединиться с MySQL."); // Логин и пароль от базы данны);
- $result = mysql_query("insert INTO avangard_temp (`contract`,`fullname`, `summ2`, `description`,`phone`, `email`) VALUES ('$id', '$fullname', '$amount', '$desc', '$phone', '$email')");
- ?>
Техподдержка банка уверяет что к ним данные УЖЕ приходят "битые"
Предлагают передавать xml как параметр пост запроса, а не как часть url на примере:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- 'xml' => '<тут должен быть склеенный xml>'
- )
- );
- 'method' => 'POST',
- 'header' => 'Content-type: application/x-www-form-urlencoded',
- 'content' => $postdata
- )
- );