Анализ данных JSON, отправленных с Calendly.com

Я пытаюсь отправить данные, отправленные calendly.com на мой веб-сервер. Я подключаюсь к этому веб-серверу и могу просто публиковать на нем данные, используя

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

$myvars = 'first_name=' . $full_name . '&email=' . $thisemail;

Тем не менее, я испытываю трудности с получением данных в $myvars, Я пробовал это

$data = $_REQUEST['payload'];
$unescaped_data = stripslashes($data);
$obj = json_decode($unescaped_data);
$thisemail = $obj->invitee->email;
$full_name = $obj->invitee->name;

Но эта переменная не заполняется. Я также изменил

$data = $_REQUEST['payload']

в

$data = $_POST['payload']

Я также попробовал совершенно другой подход

$json = file_get_contents('php://input');
$request = json_decode($json, true);
$thisemail = $request["payload"]["invitee"]["email"];

Когда я просто вставил фиктивную строку в $thisemail а также $full_name это работает как ожидалось.

Я также читал, что эти данные gzip закодирован. Так что я тоже попытался изменить это

$request = json_decode($json, true);

к этому

$request = gzdecode($json);

но тоже без эффекта.

Вот фрагмент того, как должны выглядеть данные

{
"event":"invitee.created",
"time":"2016-08-23T19:16:01Z",
"payload":{
"event_type":{
"kind":"1-on-1",
"slug":"event_type_name",
"name":"Event Type Name",
"duration":15
},
"event":{
"uuid":"BBBBBBBBBBBBBBBB",
"assigned_to":[
"Jane Sample Data"],
"extended_assigned_to": [
"name": "Jane Sample Data",
"email": "user@example.com",
"primary": false
],
"start_time":"2016-08-23T12:00:00Z",
"start_time_pretty":"12:00pm - Tuesday, August 23, 2016",
"invitee_start_time":"2016-08-23T12:00:00Z",
"invitee_start_time_pretty":"12:00pm - Tuesday, August 23, 2016",
"end_time":"2016-08-23T12:15:00Z",
"end_time_pretty":"12:15pm - Tuesday, August 23, 2016",
"invitee_end_time":"2016-08-23T12:15:00Z",
"invitee_end_time_pretty":"12:15pm - Tuesday, August 23, 2016",
"created_at":"2016-08-23T00:00:00Z",
"location":"The Coffee Shop",
"canceled":false,
"canceler_name":null,
"cancel_reason":null,
"canceled_at":null
},
"invitee":{
"uuid":"AAAAAAAAAAAAAAAA",
"first_name":"Joe",
"last_name":"Sample Data",
"name":"Joe Sample Data",
"email":"not.a.real.email@example.com",

...

0

Решение

JSON недействителен.
Квадратные скобки используются для массивов ex. ["Jane", "John", "Jack"]
Брекеты используются для объектов напр. {"name": "John", "surname" : "Wick"}

Пытаться

"extended_assigned_to": {
"name": "Jane Sample Data",
"email": "user@example.com",
"primary": false
},

Вместо

  "extended_assigned_to": [
"name": "Jane Sample Data",
"email": "user@example.com",
"primary": false
],

В этом случае вы можете написать функцию, которая исправляет ошибки в кодированном JSON перед передачей его в JSON-декодирование. Я написал функцию, которая будет обрабатывать его для вас с помощью регулярного выражения. Он ищет все случаи, когда двоеточие заключено в квадратные скобки, и заменяет их скобками. Должно работать с любым количеством таких случаев в одном ответе. Надеюсь, это поможет.

function correctJSON ($string) {
//Get an array of all cases with invalid brackets
preg_match_all('/\[".*":.*\]/', $string, $matches);

//Create an array with braces with inside content to replace with
for($i=0; $i<count($matches[0]); $i++) {
$replace[$i] = str_replace(array('[',']'), array('{','}'), $matches[0][$i]);
}

//Replace
return $string = str_replace($matches[0], $replace, $string);
}

Постскриптум Нельзя просто заменить квадратные скобки на фигурные скобки сразу в источнике. Это заменит массивы ["Jane", "John", "Jack"] с {"Jane", "John", "Jack"} это не является действительным JSON либо.

1

Другие решения

Ответ @ blewherself выявляет тот важный факт, что JSON в примере нашел Вот недействителен JSON, и по этой причине я проголосовал против их ответа.

Однако после дальнейшего изучения я считаю, что это ошибка только на этой странице и фактический JSON, переданный ими, не является недействительным. Тем не менее, я рад добавить сюда мой ответ, который я нашел после долгой настойчивости, так как считаю, что документация на calendly.com слишком кратко, чтобы быть очень полезным.

Файл JSON можно получить с помощью $HTTP_RAW_POST_DATA в противном случае вы можете получить доступ к отдельным компонентам более или менее в соответствии с примером в документации, по крайней мере, той частью, которая меня интересовала.

$data = json_decode($HTTP_RAW_POST_DATA, true);
$full_name = $data["payload"]["invitee"]["name"];
$thisemail = $data["payload"]["invitee"]["email"];
$first_name = explode(" ", $full_name)[0];
$last_name = explode(" ", $full_name)[1];

Вы заметите явное упущение, что их форма спрашивает клиентов: номер телефона. Похоже, что даже если клиент запрашивает его, он не передается на ваш URL в файле JSON. Кроме того, хотя имя и фамилия задаются как переданный элемент в примере JSON в документах, ни его, ни многие другие элементы в примере не запрашиваются в их форме. Я не уверен, как они ожидают, что данные будут передаваться в их JSON. Я искренне надеюсь, что люди в calendly решить эти проблемы в ближайшее время.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector