0

我正在尝试将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",

     ...
4

2 回答 2

1

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);
}

PS One 不能直接在源代码中用大括号替换方括号。["Jane", "John", "Jack"]它也将用{"Jane", "John", "Jack"}无效的 JSON替换数组。

于 2017-02-03T13:38:52.857 回答
0

@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];

您会注意到他们的表格要求客户有一个明显的遗漏:电话号码。看起来即使客户端被要求提供它,它也不会传递到 JSON 文件中的您的 url。此外,尽管在文档中的 JSON 示例中将名字和姓氏作为传递的项目给出,但在其形式中都没有要求它或示例中的许多其他项目。我不确定他们如何期望这些数据在他们的 JSON 中传递。我真诚地希望calendy的人们尽快解决这些问题。

于 2017-02-05T12:30:17.530 回答