Хранить данные, полученные от третьих сторон, в URL конечной точки с PHP - PullRequest
3 голосов
/ 20 марта 2020

Я пытаюсь получить ответ от сторонней системы API на мою конечную точку URL с PHP. Таким образом, третьи части отправляют запрос на отправку моей конечной точке (URL, который я заполнил в их панели API) всякий раз, когда у меня есть новый ответ на данные для меня. В основном они отправляют только последние данные ответа, когда из своей системы они получают новую отправку. Я добавил это в свой URL-адрес конечной точки, чтобы увидеть, могу ли я увидеть полученный ответ:

$request_data = file_get_contents('php://input');

var_dump($request_data);

На их панели я могу проверить результат URL-адреса конечной точки, и на их панели у меня есть этот результат, когда я нажимаю на кнопка запрос теста , которая в основном является результатом моего var_dump:

result in their API panel

Но на моей стороне вывод как полная строка, но я не получаю ничего на моей стороне в URL моей конечной точки.

my endpoint URL

Это post_max_size в моем phpinfo файл, поэтому моя переменная $ _POST не должна быть пустой:

enter image description here

Формат отправленных данных, которые я должен ожидать получить к моей конечной точке URL как показано ниже:

{
    "data": {
        "id": "",
        "name": "",
        "email": "",
        "phone": "",
        "description": "",
        "street": "",
        "housenumber": "",
        "postcode": "",
        "city": "",
        "questions": {
            "Type opdracht": "",
            "Wat wil je laten opstellen?": ""
        },
        "questions_unmapped": {
            "114": "",
            "187": ""
        },
        "date": "",
        "notes": ""
    }
}

Есть ли способ:

  • преобразовать эту строку в PHP объект
  • распечатать / сохранить эти данные на моем сторона (URL моей конечной точки)

Ответы [ 4 ]

1 голос
/ 25 марта 2020

Если вы не получаете запрос с Content-Type: multipart/form-data, вы можете получить тело запроса, используя:

$request_data = file_get_contents('php://input');

Теперь, если вы получаете запрос multipart/form-data и вы не можете изменить тип содержимого его тела, вы можете попробовать изменить следующую опцию в вашем php .ini (PHP 5.4 +):

enable_post_data_reading = On

Это позволит вам проанализировать POST запросы, использующие php: // input, НО, это отключит автоматический c анализ данных на PHP внутренних массивах $ _POST и даже $ _FILES. См. Дополнительную информацию об этой опции на следующей странице: https://www.php.net/manual/en/ini.core.php#ini .enable-post-data-read

Вы можете прочитать, почему вы не можете подготовить тело запроса для multipart/form-data на следующей странице (ищите: php: // input): https://www.php.net/manual/en/wrappers.php.php

После получения запроса его можно проанализировать следующим образом (при условии, что JSON строка, как на изображении, которое вы предоставили):

$jsonRequest = json_decode($requestBody, true);

json_decode документация: https://www.php.net/manual/es/function.json-decode.php

1 голос
/ 20 марта 2020

Брат Угол,

Что я буду делать, всякий раз, когда кто-то отправляет запрос на пост в наш API (конечная точка)

Решения

Метод 1

  1. Сохраните json в вашей базе данных tbl_input_ json
  2. Затем, когда администратор получит доступ к системе, они могут решить, хотят ли они постоянно вставлять эти json записи в таблицы базы данных или нет.

Метод 2

  1. Напрямую, используйте json_decode, чтобы изменить строку на php array
  2. Затем, непосредственно вставьте все эти записи в базу данных.

** Надеюсь, это решит ваше любопытство.

1 голос
/ 24 марта 2020

Я эмулировал ваши посты сторонних API с помощью скрипта Curl следующим образом

$data_string = '{
"operacion": {
   "tok": "[generated token]",
   "shop_id": "12313",
   "respuesta": "S",
   "respuesta_details": "respuesta S",
   "extended_respuesta_description": "respuesta extendida",
   "moneda": "PYG",
   "monto": "10100.00",
   "authorization_number": "123456",
   "ticket_number": "123456789123456",
   "response_code": "00",
   "response_description": "Transacción aprobada.",
   "security_information": {
       "customer_ip": "123.123.123.123",
       "card_source": "I",
       "card_country": "Croacia",
       "version": "0.3",
       "risk_index": "0"
   }
}}';


$ch = curl_init('http://localhost/test/index.php');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
'Content-Type: application/json',                                                                                
'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

$result = curl_exec($ch);
echo $result;

В моем индексе. php Я эмулировал вашу конечную точку URL следующим образом

$request_data = file_get_contents('php://input');   
$decoded_params = json_decode($request_data,true);
var_dump($decoded_params);

И я получил следующий вывод:

Array
(
[operacion] => Array
    (
        [tok] => [generated token]
        [shop_id] => 12313
        [respuesta] => S
        [respuesta_details] => respuesta S
        [extended_respuesta_description] => respuesta extendida
        [moneda] => PYG
        [monto] => 10100.00
        [authorization_number] => 123456
        [ticket_number] => 123456789123456
        [response_code] => 00
        [response_description] => Transacción aprobada.
        [security_information] => Array
            (
                [customer_ip] => 123.123.123.123
                [card_source] => I
                [card_country] => Croacia
                [version] => 0.3
                [risk_index] => 0
            )

    )

)

Я только что внес следующее изменение в код вашей конечной точки

$ decoded_params = json_decode ($ request_data); => $ decoded_params = json_decode ($ request_data, true);

1 голос
/ 20 марта 2020

Попробуйте $ _ POST экземпляр file_get_contents ('php: // input');

...