Question

I'm trying to POST using cURL to a Zapier webhook.

Zapier is configured so that if I were to type their URL like so -- https://zapier.com/hooks/catch/n/abcd?email=foo@bar.com&guid=foobar

It will receive the post, but when I try to do the same thing with cURL, it does not seem to receive it.

Here's my code for posting with cURL -->

<?php
    // Initialize curl
    $curl = curl_init();

    // Configure curl options
    $opts = array(
        CURLOPT_URL             => 'https://zapier.com/hooks/catch/n/abcd',
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_CUSTOMREQUEST   => 'POST',
        CURLOPT_POST            => 1,
        CURLOPT_POSTFIELDS      => 'guid='+ $_POST["guid"] + '&video_title=' + $_POST["video_title"] + '&email=' + $_POST["email"], 
    );

    // Set curl options
    curl_setopt_array($curl, $opts);

    // Get the results
    $result = curl_exec($curl);

    // Close resource
    curl_close($curl);

    echo $result;
?>

When I run this, it displays success, but Zapier does not receive it.

On Zapier's docs, someone gave an example with a proper cURL post, like so -->

curl -v -H "Accept: application/json" \
        -H "Content-type: application/json" \
        -X POST \
        -d '{"first_name":"Bryan","last_name":"Helmig","age":27}' \
        https://zapier.com/hooks/catch/n/Lx2RH/

I'm guessing that I'm missing something in the PHP file, help greatly appreciated!

Was it helpful?

Solution

You need to json encode the data you are sending and set the content-type also:

Change:

$opts = array(
    CURLOPT_URL             => 'https://zapier.com/hooks/catch/n/abcd',
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_CUSTOMREQUEST   => 'POST',
    CURLOPT_POST            => 1,
    CURLOPT_POSTFIELDS      => 'guid='+ $_POST["guid"] + '&video_title=' + $_POST["video_title"] + '&email=' + $_POST["email"], 
);

to:

$data = array('guid' => $_POST["guid"], 'video_title' => $_POST["video_title"], 'email' => $_POST["email"]);
$jsonEncodedData = json_encode($data);
$opts = array(
    CURLOPT_URL             => 'https://zapier.com/hooks/catch/n/abcd',
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_CUSTOMREQUEST   => 'POST',
    CURLOPT_POST            => 1,
    CURLOPT_POSTFIELDS      => $jsonEncodedData,
    CURLOPT_HTTPHEADER  => array('Content-Type: application/json','Content-Length: ' . strlen($jsonEncodedData))                                                                       
);

This should work.

OTHER TIPS

Your not sending the POSTFIELDS correctly, you need to use . not + and also you should be url encoding the string...

$opts = array(
    CURLOPT_URL             => 'https://zapier.com/hooks/catch/n/abcd',
    CURLOPT_HEADER          => false,
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_POST            => true,
    CURLOPT_POSTFIELDS      => http_build_query(array('guid' => $_POST['guid'], 'video_title' => $_POST['video_title'], 'email' => $_POST['email']))
);

You don't receive it in Zapier because you haven't set the 'Child key' structure. Take a look at what you need to do inside the image below.

Keep in mind that in my case I wanted to catch the 'company_name'. You'll have to replace it with your own parameter. You can also define additional parameters or even completely change the 'Child key' structure.

enter image description here

To give something functional, took the code from before and made a simple re-usable function.

function send_array_to_zapier_webhook($php_array, $hook_url){
  // Initialize curl
  $curl = curl_init();

  $json_encoded_data = json_encode($php_array);
  $opts = array(
    CURLOPT_URL => $hook_url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $json_encoded_data,
    CURLOPT_HTTPHEADER => array('Content-Type: application/json','Content-Length: ' . strlen($json_encoded_data))
  );

  // Set curl options
  curl_setopt_array($curl, $opts);

  // Get the results
  $result = curl_exec($curl);

  // Close resource
  curl_close($curl);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top