За последние 24 часа нас посетили 36724 программиста и 7752 робота. Сейчас ищут 1846 программистов ...

Как отправить в POST запросе такие данные?

Тема в разделе "PHP для новичков", создана пользователем Атм_Евгений, 17 янв 2023.

  1. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    208
    Симпатии:
    5
    Всем привет!
    Пытаюсь подключить на сайт оплату в рассрочку от СберБанка. Дошел до отправки данных на сервис Сбера. Нужно для теста отправить в POST запросе следующие тестовые данные:

    Код (Text):
    1. amount=3200000&currency=643&language=ru&orderNumber=1590585951&password=testPwd&returnUrl=http://www.google.com&userName=login&description=INSTALLMENT&sessionTimeoutSecs=1200&orderBundle= {
    2. "cartItems": {
    3.     "items": [{
    4.         "agentInterest": {
    5.             "interestType": "3",
    6.             "interestValue": "2"
    7.         },
    8.         "discount": {
    9.             "discountType": "percent",
    10.             "discountValue": "5"
    11.         },
    12.         "itemAmount": "3000000",
    13.         "itemCode": "123",
    14.         "itemCurrency": "643",
    15.         "itemDetails": {},
    16.         "itemPrice": "3000000",
    17.         "name": "position_1",
    18.         "positionId": "1",
    19.         "quantity": {
    20.             "measure": "kg",
    21.             "value": 1
    22.         }
    23.     },
    24.     {
    25.         "agentInterest": {
    26.             "interestType": "3",
    27.             "interestValue": "2"
    28.         },
    29.         "discount": {
    30.             "discountType": "percent",
    31.             "discountValue": "5"
    32.         },
    33.         "itemAmount": "100000",
    34.         "itemCode": "456",
    35.         "itemCurrency": "643",
    36.         "itemDetails": {},
    37.         "itemPrice": "50000",
    38.         "name": "position_2",
    39.         "positionId": "2",
    40.         "quantity": {
    41.             "measure": ".",
    42.             "value": 2
    43.         }
    44.     },
    45.     {
    46.         "agentInterest": {
    47.             "interestType": "3",
    48.             "interestValue": "2"
    49.         },
    50.         "discount": {
    51.             "discountType": "percent",
    52.             "discountValue": "5"
    53.         },
    54.         "itemAmount": "100000",
    55.         "itemCode": "789",
    56.         "itemCurrency": "643",
    57.         "itemDetails":
    58.     },
    59.         "itemPrice": "100000",
    60.         "name": "position_3",
    61.         "positionId": "3",
    62.         "quantity": {
    63.             "measure": ".",
    64.             "value": 1
    65.         }
    66.     ]
    67. },
    68. "customerDetails": {
    69.     "contact": "Ivan",
    70.     "deliveryInfo": {
    71.         "city": "Moscow",
    72.         "country": "RU",
    73.         "deliveryType": "courier",
    74.         "postAddress": " , 1"
    75.     },
    76.     "email": "mail@bpcbt.com",
    77.     "phone": "79032177751"
    78. },
    79. "installments": {
    80.     "productID": "10",
    81.     "productType": "CREDIT",
    82.     "rightTerms": [3,5]
    83. },
    84. "orderCreationDate": "2019-02-04T13:51:00"
    85. }&jsonParams= {
    86.     "phone": "79262440101"
    87. }&additionalOfdParams= {
    88.     "agent_info.type": "7",
    89.     "agent_info.paying.operation": " ",
    90.     "agent_info.paying.phones": "+71111111111",
    91.     "agent_info.paymentsOperator.phones": "+72222222222",
    92.     "agent_info.MTOperator.address": " ",
    93.     "agent_info.MTOperator.inn": "169910020020",
    94.     "agent_info.MTOperator.name": " ",
    95.     "agent_info.MTOperator.phones": "+73333333333",
    96.     "supplier_info.phones": "+74444444444",
    97.     "additional_check_props": "09090909",
    98.     "additional_user_props.name": " ",
    99.     "additional_user_props.value": " ",
    100.     "cashier": " "
    101. }
    Подскажите, пожалуйста, как отправить это в запросе POST ?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    Молча....
    Или через форму, либо через curl
     
  3. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    208
    Симпатии:
    5
    Я отправляю через curl, у меня есть образец, который сам "делал", но там адрес типа: https://site.ru/api/push.json?id=233&type=465
    А отправляю кодом:

    Код (Text):
    1. $curl = curl_init(https://site.ru/api/push.json?id=233&type=465);
    2. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    3. curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    4. curl_setopt($curl, CURLOPT_POST, 1);
    5. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    6. $result = json_decode(curl_exec($curl), true);
    7. curl_close($curl);
    Где все, что мне нужно в массиве $data в формате json.

    А в этом случае с банком адрес типа (это все взято из их мануала):
    https://3dsec.sberbank.ru/sbercredi...r=1&returnUrl=http://yoursite.com&jsonParams=
    {"phone": "+79268936532"}&sessionTimeoutSecs=86400&orderBundle={"cartItems":{"items": [{ и пошло поехало, а в конце снова параметр }
    &installments={"productID":"10","productType":"INSTALLMENT"}}

    Т.е. в адресе не только параметры через амперсанд перечислены, а еще и данные в формате json.

    Вот как это передать? Я ума не приложу ...
     
  4. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Что то вроде:
    Код (Text):
    1.  
    2. $params = array(
    3. //массив параметров
    4. );
    5. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
    6. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
    7. $result = json_decode(curl_exec($curl), true);
     
  5. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    208
    Симпатии:
    5
    Т.е. взять все параметры из адресной строки, засунуть из в массив, перевести в json и отправить...
    Тоже так думаю, задал такой вопрос в поддержку, жду ответа.
     
  6. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Там есть возможность получения тестовых данных? Самая лучшая проверка - это увидеть результат запроса.:)
     
  7. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    208
    Симпатии:
    5
    Да, в начале все делается в тестовой среде.

    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params)); - можно исключить, если $params передавать не буду?
     
  8. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    208
    Симпатии:
    5
    Разобрался, если кому надо:

    Код (Text):
    1. $url = 'https://...';
    2.  
    3.  
    4. $data = 'amount=3200000&dummy=true&currency=643&language=ru&orderNumber=288_004&password=bb4FL52j&returnUrl=https://yandex.ru/&failUrl=https://www.google.ru/&userName=proyagodki-credit-api&description=INSTALLMENT&sessionTimeoutSecs=1200&orderBundle={"cartItems":{"items":[{"agentInterest":{"interestType":"3","interestValue":"2"},"discount":{"discountType":"percent","discountValue":"5"},"itemAmount":"3000000","itemCode":"123","itemCurrency":"643","itemDetails":{},"itemPrice":"3000000","name":"position_1","positionId":"1","quantity":{"measure":"шт","value":1}},{"agentInterest":{"interestType":"3","interestValue":"2"},"discount":{"discountType":"percent","discountValue":"5"},"itemAmount":"100000","itemCode":"456","itemCurrency":"643","itemDetails":{},"itemPrice":"50000","name":"position_2","positionId":"2","quantity":{"measure":"шт.","value":2}},{"agentInterest":{"interestType":"3","interestValue":"2"},"discount":{"discountType":"percent","discountValue":"5"},"itemAmount":"100000","itemCode":"789","itemCurrency":"643","itemDetails":{},"itemPrice":"100000","name":"position_3","positionId":"3","quantity":{"measure":"шт.","value":1}}]},"customerDetails":{"contact":"Ivan","deliveryInfo":{"city":"Moscow","country":"RU","deliveryType":"courier","postAddress":"Адресдоставки1"},"email":"test@bpcbt.com","phone":"79032177777"},"installments":{"productID":"10","productType":"INSTALLMENT","rightTerms":[3,5]},"orderCreationDate":"2019-02-04T13:51:00"}&jsonParams={"phone":"79262440101"}';
    5.  
    6. // В $data данные, которые отправляем
    7.  
    8. $curl = curl_init($url);
    9. curl_setopt($curl, CURLOPT_POST, 1);
    10. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    11. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    12. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    13. curl_setopt($curl, CURLOPT_HEADER, false);
    14. curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    15.  
    16. $result = json_decode(curl_exec($curl), true);
    17. curl_close($curl);
    18.  
    19. var_dump($result);
     
  9. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Получается, что строка $data прямо так и отправляется в curl методом POST ?
     
  10. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    @antoniii, ну формы постом так и отправляются, если ничего не путаю.
     
  11. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    @don.bidon просто первоначальная идея была закодировать исходный массив в json функцией encode_json, а тут $data это строка
     
  12. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    208
    Симпатии:
    5
    Да, строка, где параметр=значение в перемешку с параметр=json (все в куче одной строкой) отправляются в POST.
    --- Добавлено ---
    На том конце закодированное в json не принимают, только такой вариант разбирают.
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $data - обычный массив.
    PHP: curl_setopt - Manual (искать описание CURLOPT_POSTFIELDS)
    Если хотите строку - PHP: urlencode - Manual вам в помощь.
     
  14. mepihindeveloper

    mepihindeveloper Активный пользователь

    С нами с:
    20 ноя 2018
    Сообщения:
    12
    Симпатии:
    1
    А еще можно массив перевести через http_build_query в строку адекватным путем.