За последние 24 часа нас посетили 20574 программиста и 1133 робота. Сейчас ищут 665 программистов ...

JSON POST-запрос на php

Тема в разделе "PHP для новичков", создана пользователем adept77, 28 ноя 2022.

  1. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    Добрый вечер
    Нужна помощь спецов
    Вопрос такой: Необходимо отправить POST-запрос на платежную систему (Запросы и ответы в API передаются в формате JSON. - цитата из инструкции)
    Написал такой скрипт:
    $url="https://sandboxapi";
    $ch=curl_init();
    $ch_post= array(
    CURLOPT_URL=>$url.'/ping',
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER =>TRUE,
    CURLOPT_TIMEOUT =>10,
    CURLOPT_SSLCERT =>'umit_life.p12',
    CURLOPT_SSLCERTTYPE => 'P12',
    CURLOPT_SSLCERTPASSWD =>'W111111',
    );
    curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);
    curl_setopt($ch,CURLOPT_USERPWD,"umit_life:b1111111");
    curl_setopt_array($ch,$ch_post);
    $response = curl_exec($ch);
    var_dump($response);

    выдает ошибку:
    {"failure_type":"error","order_id":null,"failure_message":"Invalid JSON"}
    при этом на самой странице, где вписан этот php-скрипт появляется подозрительная надпись - bool(false)
    Кто подскажет, где я накосячил ?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    Возможно везде...
    Но для начала, всё же надо что-то то отсылать в теле запроса, где это у вас? Нету...
     
  3. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    <form action="https://sandboxapi" name="pay_form" method="POST">
    <input type="hidden" name="AMOUNT" value="<?php echo $amount ?>"/>
    <input type="hidden" name="CURRENCY" value="<?php echo $currency ?>"/>
    <input type="hidden" name="MERCHANT_ORDER_ID" value='<?php echo $order ?>'/>
    <input type="hidden" name="DESCRIPTION" value='<?php echo $desc ?>'/>
    <button type="submit" >Оплатить <?php echo $amount; echo $currency?> </button>
    </form>

    данные по идее должны из этой формы браться...

    P.S. я в этой теме совсем чайник, потому хочу разобраться на будущее. А рядом спросить не у кого (
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    Может не стоит прям с платёжных форм начинать? Азы какие то освоить?

    Форма это форма, как в вашем случае она связана с первым кодом..??
     
  5. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    У тебя и форма и запрос в одном файле?
     
  6. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    Они в одном файле. Форма и скрипт. Вот и не могу понять, как они должны между собой связаться. Т.е. к прошлому банку (условия фигня, поэтому в другой ушел) подключался, там проще было, просто пост-запрос делал и все. А этот банк хочет вот именно JSON.
    --- Добавлено ---
    да, в одном
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    1. Читайте внимательно инструкцию от банка. Смотрите их примеры
    2. Если что-то непонятно - идем п. 1 и повторяем до ясности
     
  8. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    гениальный ответ. спасибо за помощь. таких "специалистов" я уже в банке наслушался
     
  9. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    ну тут телепатов тоже нема.... чего вам там надо, куда отправлять, какие условия ... у каждого банка свои требования

    Если бы был вопрос по php - тут помогли бы
     
  10. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    Вопрос и стоит - Как сформировать нормально запрос в json на php и отправить его в api банка.
    в запросе 4 параметра и сертификат авторизации, которые берутся из формы в этом же файле (веб-странице).
    что упустил ? какую инфу еще нужно знать?

    я так понял, что этот скрипт отправляет только сертификат и авторизуется на сервере. Как ему втолкнуть данные, из полей формы ?
     
  11. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    ну а попробовать посмотреть в интернетах как с cURL работают и POSt запросы шлют - религия не позволяет?

    первая же ссылка даст что-то типа такого:

    PHP:
    1. $array = array(
    2.     'field1'    => 'value1',
    3.     'field2' => 'value2'
    4. );      
    5.  
    6. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));
    --- Добавлено ---
    не болтайте ерундой... никаких сертификатов в форме нет
    --- Добавлено ---
    Вы должны понимать принцип работы веба... азы!

    1) Форма передает данные куда-то .... в вашем случае пусть в какой то файл - который вы первым описали ...пусть sender.php он будет
    2) Cобираете там данные какие вам надо из формы... обращаясь с гл. супермассиву $_POST, например $_POST['sum'];
    если там есть все что нужно то возможно так
    PHP:
    1. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST, '', '&'));
    3) Если банк в теле post запроса ждет json - то возможно так
    PHP:
    1. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
    2.  
    3. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($_POST));
    и cURLом отправляете в банк,
    так как вам сказано сто ответ тоже в json - декодируете
    PHP:
    1. $response = curl_exec($ch);
    2. var_dump(json_decode($response));
     
  12. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    сертификат не в форме, лежит на сервере, в том же каталоге с веб-страницей
     
  13. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    У тебя форма на какой адрес данные отправляет?
     
  14. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    на api банка
     
  15. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    если на апи банка форма что-то отправляет - то ваш файл с курлом - вообще не задействован
     
    antoniii нравится это.
  16. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    вот теперь совсем не понял (((
    у меня в форме указан апи
    <form action="https://sandboxapi" name="pay_form" method="POST">
    и в скрипте указан апи.
    $url="https://sandboxapi";
     
  17. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Или вообще убери адрес из поля action формы или вынеси курл в отдельный файл. А в поле экшен пропиши его адрес. Тогда данные попадут в запрос.
     
  18. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    т.е. вот так ?
    <body>
    <?php
    $url="https://sandboxapi";
    $ch=curl_init();
    $ch_post= array(
    CURLOPT_URL=>$url.'/ping',
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER =>TRUE,
    CURLOPT_TIMEOUT =>10,
    CURLOPT_SSLCERT =>'umit_life.p12',
    CURLOPT_SSLCERTTYPE => 'P12',
    CURLOPT_SSLCERTPASSWD =>'W11111',
    );
    curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);
    curl_setopt($ch,CURLOPT_USERPWD,"umit_life:b1111111");
    curl_setopt_array($ch,$ch_post);
    $response = curl_exec($ch);
    var_dump($response);
    ?>
    <form name="pay_form" method="POST">
    <div class="row">
    <input type="hidden" name="AMOUNT" value="<?php echo $amount ?>"/>
    <input type="hidden" name="CURRENCY" value="<?php echo $currency ?>"/>
    <input type="hidden" name="MERCHANT_ORDER_ID" value='<?php echo $order ?>'/>
    <input type="hidden" name="DESCRIPTION" value='<?php echo $desc ?>'/>

    <button type="submit" ">Оплатить <?php echo $amount; echo $currency?> </button>
    </div>
    </body>
     
  19. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Теперь в курл нужно добавить:
    Код (Text):
    1. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
    2. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($_POST));
    только перед curl_exec
     
  20. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    т.е. теперь вот такой скрипт
    <?php

    $url="https://sandboxapi";
    $ch=curl_init();
    $ch_post= array(
    CURLOPT_URL=>$url.'/ping',
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER =>TRUE,
    CURLOPT_TIMEOUT =>10,
    CURLOPT_SSLCERT =>'umit_life.p12',
    CURLOPT_SSLCERTTYPE => 'P12',
    CURLOPT_SSLCERTPASSWD =>'W111111',
    );
    $array = array(
    'AMOUNT' => $_POST['amount'],
    'CURRENCY' => $_POST['currency'],
    'MERCHANT_ORDER_ID' => $_POST['order'],
    'DESCRIPTION' => $_POST['desc_order']
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($_POST));
    curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);
    curl_setopt($ch,CURLOPT_USERPWD,"umit_life:b1111111");
    curl_setopt_array($ch,$ch_post);
    $response = curl_exec($ch);
    var_dump(json_decode($response));

    ?>
     
  21. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    @adept77 будь добр оформлять код в соответсвующих тегах...
     
  22. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    чет где-то опять лажаю. Скрипт отрабатывает, но не выхватывает все значения из $POST
    эти значения подхватывает и передает
    'AMOUNT' => $_POST['amount'],
    'CURRENCY' => $_POST['currency'],
    а вот эти - нет
    'MERCHANT_ORDER_ID' => $_POST['order'],
    'DESCRIPTION' => $_POST['desc_order']
    причем даже если я указываю принудительно, все равно не передает
    'MERCHANT_ORDER_ID' => '123456789',
    'DESCRIPTION' => 'какая-то фигня'
    --- Добавлено ---
    сорри, щас правила гляну )
     
  23. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Откуда у тебя скрипт берет значения $order $desc и другие? Где ты их определяешь?
    сделай print_r($_POST)
     
  24. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    чудес не бывает - скрипт делает то что ему приказали, и получает то - что ему передали

    перед тем как послать курлом - посмотри что же ты передаешь

    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($_POST));
    зачем же готовить $array если передавать $_POST ?
     
  25. adept77

    adept77 Новичок

    С нами с:
    19 окт 2022
    Сообщения:
    61
    Симпатии:
    0
    amount - указывает пользователь
    currency - указывает пользователь
    order - по рандому - скрытое поле
    desc_order - в скрытом поле на форме
    --- Добавлено ---
    вот я уже хотел этот вопрос задать....
    получается, что:
    Код (Text):
    1. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($_POST));
    должен выглядеть так:
    Код (Text):
    1. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($array));
    правильно ?