За последние 24 часа нас посетили 20194 программиста и 1084 робота. Сейчас ищет 801 программист ...

Как правильно передать данные JSON?

Тема в разделе "Вопросы от блондинок", создана пользователем Griasha, 9 окт 2020.

Метки:
  1. Griasha

    Griasha Новичок

    С нами с:
    10 дек 2017
    Сообщения:
    8
    Симпатии:
    0
    Не особо силен в php, а с json тем более...Образовалась задача, получить данные с одного сервиса на свой сайт. Мучаюсь уже не первый день, получаю одну и ту же ошибку "no signature". Поддержка на сервисе не бум-бум. Из документации: "
    Все вызовы API осуществляются по протоколу HTTP, метод POST.
    Все вызовы API осуществляются по адресу ...
    Данные передаются в формате JSON в POST переменной "data"
    Для верификации пользователя все вызовы API должны содержать логин пользователя и сигнатуру.
    Сигнатура передаётся в POST переменной "signature" и является конкатенацией POST переменной "data" и API KEY пользователя обработанных алгоритмом MD5.
    Если у вас нет API KEY, запросите его у администратора.(есть)
    Пример генерации сигнатуры на языка PHP:
    PHP:
    1. $API_KEY = "...";
    2. $data = array(...);
    3. $post['data'] = json_encode($data);
    4. $post['signature'] = md5($post['data'].$API_KEY);
    JSON объект, передаваемый в POST переменной "data" всегда должен содержать поля
    "login" - логин пользователя и
    "method" - метод API который вызывают."
    Пример JSON в запросе:
    Код (Text):
    1. {"login":"user1",
    2. "method":"checkCard",
    3. "type":2,
    4. "value":"19384757346343681"
    5. }
    "
    Собственно мой код
    PHP:
    1. <?php
    2. $API_KEY = "XXXXXXXXXXX";
    3. $data = array(
    4. "login" => "XXXXXXXXXX",
    5. "method" => "loadCardData",
    6. "type" => 1,
    7. "value" => "А111АА70"
    8. );
    9. $post['data'] = json_encode($data);
    10. $post['signature'] = md5($post['data'].$API_KEY);
    11. $options = array (
    12.     'http' => array (
    13.         'method' => 'POST',
    14.         'header' => "Content-Type: application/json; charset=utf-8\r\n",
    15.         'content' => $post
    16.     )
    17. );
    18. $context = stream_context_create($options);
    19. echo file_get_contents('https://www.xxx.org/xxx', 0, $context);
    20. // Открываем на чтение поток ввода
    21. $f = fopen('php://input', 'r');
    22. // Получаем содержимое потока
    23. $data = stream_get_contents($f);
    24. if ($data) {
    25.     // Код обработки
    26.    
    27.     print_r(json_decode($data));
    28. }
    29. ?>
    В ответ получаю это
    Код (Text):
    1. {"success":false,"data":[],"message":"No signature."}
    А нужно чтобы было это:
    Код (Text):
    1. {
    2. "success":true,
    3. "data":{
    4. "mark":"RENAULT",
    5. "model":"-(SR)",
    6. "yearIssue":"2010",
    7. "power":"",
    8. "vin":"X7LBSRB1HAH315021",
    9. "bodyNumber":"X7LBSRB1HAH315021",
    10. "chassisNumber":"",
    11. "regNumber":"Р774ВУ190",
    12. "lastname":"Матафонова",
    13. "firstname":"Светлана",
    14. "patronymic":"Николаевна",
    15. "docType":"1",
    16. "docSeries":"50УВ",
    17. "docNumber":"661182",
    18. "docIssued":"2010-09-30",
    19. "owType":"1",
    20. "compName":"",
    21. "isForeign":"0",
    22. "giver":"РЭП ГИБДД ИСТРИНСКОГО ОВД ",
    23. "category":"2",
    24. "noload":"1048",
    25. "maxWeight":"1536",
    26. "fuel":"1",
    27. "breaks":"1",
    28. "tyres":"Kama",
    29. "notes":"0",
    30. "comment":""
    31. },
    32. "message":""
    Что я делаю не так? Как правильно передать сигнатуру?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    может логин то не в данных передавать
    а?
    PHP:
    1. $post['login'] = .....
     
  3. Griasha

    Griasha Новичок

    С нами с:
    10 дек 2017
    Сообщения:
    8
    Симпатии:
    0
    Это не помогло
     
  4. ADSoft

    ADSoft Старожил

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

    Griasha Новичок

    С нами с:
    10 дек 2017
    Сообщения:
    8
    Симпатии:
    0
    В том, то и дело, что рабочих примеров нет. Думал может ошибки какие в коде у меня, поэтому сюда выложил.
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Griasha, где-нибудь написано, что Content-Type должен быть именно application/json?
     
  7. Griasha

    Griasha Новичок

    С нами с:
    10 дек 2017
    Сообщения:
    8
    Симпатии:
    0
    Нет, написано только "Данные передаются в формате JSON в POST переменной "data"". А в каком формате еще можно передать json?
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Вы передаёте не только json, но и другие данные.
    Просто не указывайте header в заголовке
     
  9. Griasha

    Griasha Новичок

    С нами с:
    10 дек 2017
    Сообщения:
    8
    Симпатии:
    0
    Удалил header, но это не помогло. Такое ощущение, что их сервер не принимает данные, а только отправляет - это возможно?
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Спросите их. Мы откуда знаем