Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Настройка онлайн оплаты через POST запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: помогите с поиском и исправлением ошибки в скрипте
MikhailFedorov
Отправлено: 08 Ноября, 2017 - 08:53:13
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Нояб. 2017  


Помог: 0 раз(а)




Здравствуйте!
Долго мучился сам, но поскольку у меня нет базисных знаний, вопрос оказался не по зубам к сож.. Поэтому с благодарностью приму помощь!

Суть:
1. Есть страница с формой для данных оплаты и скриптом я-ты-мы-они[dot]рф/pay/pay.php
2. Заполненные данные должны лететь на сервер банка как xml через POST запрос
3. Должна срабатывать переадресация на страницу банка для ввода данных карты.

И вот тут возникает проблема..
Банк получает кириллические параметры запроса в виде набора знаков "?" => в свою систему вместо кириллических ФИО, описания заказа и проч - пишет что-то типа этого - "????? ?????"

Первая мысль - проблемы с кодировкой.
НО,
- в скрипте везде указана UTF-8;
- в настройках Wordpress - UTF-8
- в .htaccess - тоже прописано

- в БД у меня прописывается все корректно
- вывод переменной $xml до отправки - корректный в кириллице

Код страницы /pay/pay.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. header('Content-Type: text/html;charset=UTF-8');
  3.  
  4.  
  5. $ShopID         = 'login';  //Логин
  6. $ShopPasswd = 'passw';  //Пароль
  7. $BackURL        = 'http://xn------5ddshg2a5fc2b.xn--p1ai/pay/avangard_callback.php';   //Адрес возврата
  8. $defaultUser = array(
  9.         'fullname'      => 'Имя',
  10.         'id' => '777',
  11.         'amount'=> '10',
  12.         'address'       => 'Москва',
  13.         'phone'         => '81231231212',
  14.         'email'         => 'devel@user.us',
  15.         'desc'          => 'оплата',
  16.         'ip'            => $_SERVER['REMOTE_ADDR']
  17. );
  18.  
  19.  
  20.  
  21. $Error = false;
  22. $Step = 'form';
  23. /*$id = $_POST['id'];*/
  24. //$id = date('d.m.Y H:i:s', time ());
  25. $id = 'тестовый заказ';
  26. $fullname = $_POST['fullname'];
  27. $amount = $_POST['amount'];
  28. $desc = $_POST['desc'];
  29. $phone = $_POST['phone'];
  30. $email = $_POST['email'];
  31.  
  32. $result = $_POST['submit'];
  33.  
  34. if ( $_POST['oferta'] == '')
  35. {
  36. echo 'Для совершения оплаты Вы должны быть согласны с <a href="http://я-ты-мы-они.рф">офертой</a>';
  37. }
  38.   else {
  39.  
  40.  
  41.  
  42. if (!empty($_POST)) {
  43.         $err = 0;
  44.  
  45.         /*if (empty($_POST['id'])) $err++;*/
  46.         if (empty($_POST['amount'])) $err++;
  47.         if (empty($_POST['fullname'])) $err++;
  48.         if (empty($_POST['desc'])) $err++;
  49.         if (empty($_POST['phone'])) $err++;
  50.  
  51.  
  52.         if ($err == 0) {
  53.                 $Step = 'redirect';
  54.                 /*$desc = $_POST['desc']." #{$_POST['id']}";*/
  55.  
  56.                 $data = requestTicket($id, $_POST['fullname'], $defaultUser['address'], $_POST['phone'], $_POST['email'], $_POST['amount'], $_POST['desc'], $defaultUser['ip']);
  57.                 header("Location: {$data['url']}");
  58.  
  59.         }
  60.         else {
  61.                 $Error = 'Не заполнены обязательные поля формы, отмеченные звездочкой!';
  62.         }
  63. }
  64. }
  65.  
  66.  
  67.  
  68.  
  69. function ticketXML($id, $fullname, $address, $phone, $email, $amount, $desc, $ip) {
  70.         global $ShopID, $ShopPasswd, $BackURL;
  71.  
  72.         $amount = (int) ($amount * 100);
  73.  
  74.         $xml = "<?xml version='1.0' encoding='utf-8'?>
  75. <new_order>
  76. <shop_id>$ShopID</shop_id>
  77. <shop_passwd>$ShopPasswd</shop_passwd>
  78. <amount>$amount</amount>
  79. <order_number>$id</order_number>
  80. <order_description>$desc</order_description>
  81. <language>RU</language>    
  82. <back_url>$BackURL</back_url>    
  83. <client_name>$fullname</client_name>
  84. <client_address>$address</client_address>
  85. <client_email>$email</client_email>
  86. <client_phone>$phone</client_phone>
  87. <client_ip>$ip</client_ip>
  88. </new_order>";
  89.  
  90.  
  91.         return $xml;
  92. }
  93.  
  94.  
  95. // Запрос тикета
  96. function requestTicket($id, $fullname, $address, $phone, $email, $amount, $desc, $ip) {
  97.         $xml = ticketXML($id, $fullname, $address, $phone, $email, $amount, $desc, $ip);
  98.  
  99. //echo rawurldecode(urlencode($xml));
  100. //exit;
  101.  
  102.  
  103. $resp = file_get_contents('https://www.avangard.ru/iacq/h2h/reg?xml='.urlencode($xml));
  104.  
  105.          if ($respXML = simplexml_load_string($resp)) {
  106.                 if ($respXML->response_code == 0 && !empty($respXML->ticket)) {
  107.                         $url = "https://www.avangard.ru/iacq/pay?ticket={$respXML->ticket}";
  108.  
  109.  
  110.  
  111.  
  112.                         // Сохраняем в сессии
  113.                         $data = $_SESSION['avangard_order'] = $HTTP_SESSION_VARS['avangard_order'] = array(
  114.                                 'form'                  => $_POST,
  115.                                 'order_id'              => $id,
  116.                                 'ticket'                => (string) $respXML->ticket,
  117.                                 'ok_code'               => (string) $respXML->ok_code,
  118.                                 'failure_code'  => (string) $respXML->failure_code
  119.                         );
  120.             $_SESSION['form_xml'] = $xml;
  121.             $_SESSION['form_data_id'] = $POST['id'];
  122.             $_SESSION['form_data_fullname'] = $_POST['fullname'];
  123.             $_SESSION['form_data_amount'] = $_POST['amount'];
  124.             $_SESSION['form_data_desc'] = $_POST['desc'];
  125.             $_SESSION['form_data_phone'] = $_POST['phone'];
  126.             $_SESSION['form_data_email'] = $_POST['email'];
  127.                         return array('url' => $url, 'response' => $resp, 'data' => $data);
  128.                        
  129.                 }
  130.         }
  131.  
  132.         return false;
  133. }
  134.  
  135. ?>
  136.  
  137. <? if ($Step == 'form'): ?>
  138.         <?=$Error ? "$Error<br>" : ''?>
  139.         <div class="login-page">
  140.         <div id="polosa">
  141. <h2>Оплата банковской картой Visa и MasterCard </h2>
  142. </div>
  143.         <link type="text/css" rel="stylesheet" href="/pay/style_form.css" />
  144.         <p>Оплатить наши услуги Вы можете в режиме он-лайн через систему электронных платежей с помощью пластиковых карт Visa, MasterCard или Maestro.</p>
  145.         <div class="form"> <img src="/pay/payment.png" width="200" height="20" />
  146.        
  147.         <form class="login-form" name="forma" action="/pay/pay.php" method="post" charset="utf-8">
  148.  
  149.  
  150.     <!--<input name="id" type="text" placeholder="* Номер договора:" value="">-->
  151.    
  152.     <input name="fullname" type="text" placeholder="* ФИО Плательщика" value="">
  153.  
  154.     <input name="amount" type="text" placeholder="* Сумма оплаты, руб" value="">
  155.        
  156.         <input name="desc" type="text" placeholder="* Назначение платежа" value="">
  157.        
  158.     <input name="phone" type="text" placeholder="* Контактный телефон" value="">
  159.        
  160.     <input name="email" type="email" placeholder="email" value="">
  161.        
  162.     Согласие с  <a href="http://я-ты-мы-они.рф">офертой</a> <input style="text-align: right" type="checkbox" name="oferta" value="1">
  163.  
  164.        
  165.         <input name="result" type="submit" value="Оплатить">
  166.  
  167.         </form>
  168.         </div>
  169.         </div>
  170. <? endif;
  171.  
  172. ?>
  173.  
  174. <?
  175. $phpdb = mysql_connect("localhost","tatjano1_wp2","password")  or die ("Не могу соединиться с MySQL.");  // Логин и пароль от базы данны);
  176. mysql_select_db("tatjano1_wp2") or die ("Не могу соединиться базой.");   //Имя базы данныхх
  177. $result = mysql_query("insert INTO avangard_temp (`contract`,`fullname`, `summ2`, `description`,`phone`, `email`) VALUES ('$id', '$fullname', '$amount', '$desc', '$phone', '$email')");
  178. ?>
  179.  


Техподдержка банка уверяет что к ним данные УЖЕ приходят "битые"
Предлагают передавать xml как параметр пост запроса, а не как часть url на примере:
PHP:
скопировать код в буфер обмена
  1. $postdata = http_build_query(
  2.     array(
  3.         'xml' => '<тут должен быть склеенный xml>'
  4.     )
  5. );
  6.  
  7. $opts = array('http' =>
  8.     array(
  9.         'method'  => 'POST',
  10.         'header'  => 'Content-type: application/x-www-form-urlencoded',
  11.         'content' => $postdata
  12.     )
  13. );
  14. $context  = stream_context_create($opts);
  15. $result = file_get_contents('http://example.com/submit.php', false, $context);

Но вот, что сделать конкретно, какую часть кода какой заменить - сообщить не могут..
Я же, к сожалению, уже не могу уделить нужное кол-во времени на изучение/пробы/ошибки.

Буду благодарен за любую помощь! Спасибо заранее!

(Отредактировано автором: 08 Ноября, 2017 - 09:15:18)

 
 Top
Sound
Отправлено: 19 Февраля, 2018 - 12:51:49
Post Id



Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




В вашем случаи удобнее будет использовать curl, или попробуйте перекодировать кирилицу в win1251.

(Отредактировано автором: 19 Февраля, 2018 - 12:53:08)

 
 Top
Vladimir Kheifets
Отправлено: 20 Февраля, 2018 - 08:15:04
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




MikhailFedorov пишет:
Здравствуйте!
Долго мучился сам, но поскольку у меня нет базисных знаний, вопрос оказался не по зубам к сож.. Поэтому с благодарностью приму помощь!

Суть:
1. Есть страница с формой для данных оплаты и скриптом я-ты-мы-они[dot]рф/pay/pay.php
2. Заполненные данные должны лететь на сервер банка как xml через POST запрос
3. Должна срабатывать переадресация на страницу банка для ввода данных карты.

И вот тут возникает проблема..
Банк получает кириллические параметры запроса в виде набора знаков "?" => в свою систему вместо кириллических ФИО, описания заказа и проч - пишет что-то типа этого - "????? ?????"

Первая мысль - проблемы с кодировкой.
НО,
- в скрипте везде указана UTF-8;
- в настройках Wordpress - UTF-8
- в .htaccess - тоже прописано

Добрый день, Михаил!
Попробуйте в Вашем PHP-редакторе, открыть закладку File и в ней опцию Encoding и отметьте в списке UTF-8.
Удачи!

(Отредактировано автором: 20 Февраля, 2018 - 08:18:14)

 
 Top
Pavel
Отправлено: 25 Февраля, 2018 - 18:19:25
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2018  


Помог: 0 раз(а)




Вопрос задали в ноябре, а отвечают в феврале следующего года.
Вот это мучения!

Попробовать без Wordpress отправить запрос?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB