2014-10-03 4 views
0

Я пытаюсь использовать следующий код для подключения к sendgrid с помощью команд curl и использовать foreach для публикации результатов в моей базе данных. Прямо сейчас я получаю неопределенную ошибку индекса для моего имени пользователя и пароля, а также недопустимый аргумент в моем foreach. Я верю, что знаю, почему я получаю ошибку foreach, я прокомментировал ее в своем коде, но я не уверен в аспекте подключения через web api. СпасибоSendgrid - PHP - отправка данных json в мою базу данных

* edit - я бы хотел добавить, что моя конечная точка настроена, и я могу видеть тестовые данные через веб-интерфейс ngroks.

<?php 

require_once('../functions.php'); 
session_start(); 
connect(); 

//Enable Connection to Event Notifications 
    $url = 'https://api.sendgrid.com/'; 
    $user = $_SESSION["xxxxxxx"]; 
    $pass = $_SESSION["xxxxxxx"]; 
    $params = array(
     'api_user' => $user, 
     'api_key' => $pass, 
     'name' => 'eventnotify' //API App Name 
    ); 
    $request = $url . 'api/filter.activate.json'; //i believe the [module] and [action] is incorrect here. 

// Generate first curl request 
    $session = curl_init($request); 

// Tell curl to use HTTP POST 
    curl_setopt($session, CURLOPT_POST, true); 

// Tell curl that this is the body of the POST 
    curl_setopt($session, CURLOPT_POSTFIELDS, $params); 

// Tell curl not to return headers, but do return the response 
    curl_setopt($session, CURLOPT_HEADER, false); 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 

// obtain response 
    $response = curl_exec($session); 
    curl_close($session); 


    $data = $response[file_get_contents("php://input")]; // Can i do this? Or do i just pass a $json variable? 
    $records = json_decode($data, true); 

    foreach ($records as $record) { 
     // Here, you now have each event and can process them how you like 
     echo getArray($record); 
     $email = isset($record['email']) ? $record['email'] : null; 
     $event = $record['event']; 

     $uid = $_POST['uid']; 
     $timestamp = $_POST['timestamp']; 
     $event_type = $_POST['event']; 
     $email_address = $_POST['email']; 
     $smtpid = $_POST['smtpid']; 
     $sg_event_id = $_POST['sg_event_id']; 
     $sg_message_id = $_POST['sg_message_id']; 
     $category = $_POST['category']; 
     $newsletter = $_POST['newsletter']; 
     $response = $_POST['response']; 
     $reason = $_POST['reason']; 
     $ip = $_POST['ip']; 
     $useragent = $_POST['useragent']; 
     $attempt = $_POST['attempt']; 
     $status = $_POST['status']; 
     $type = $_POST['type']; 
     $url = $_POST['url']; 
     $additional_arguments = $_POST['additional_arguements']; 
     $event_post_timestamp = $_POST['event_post_timestamp']; 
     $raw = $_POST['raw']; 
     $customer_id = $_POST['customer_id']; 

     insert("sendgrid_events", array("uid" => $uid, 
      "timestamp" => $timestamp, 
      "event" => $event_type, 
      "email" => $email_address, 
      "smtpid" => $smtpid, 
      "sg_event_id" => $sg_event_id, 
      "sg_message_id" => $sg_message_id, 
      "category" => $category, 
      "newsletter" => $newsletter, 
      "response" => $response, 
      "reason" => $reason, 
      "ip" => $ip, 
      "useragent" => $useragent, 
      "attempt" => $attempt, 
      "status" => $status, 
      "type" => $type, 
      "url" => $url, 
      "additional_arguments" => $additional_arguments, 
      "event_post_timestamp" => $event_post_timestamp, 
      "raw" => $raw, 
      "customer_id" => $customer_id)); //Unique Arguement to attach customer id on original outbound email? Yes 
    } 

Еще очень много нового в PHP, спасибо вам за помощь.

В ответ на ответы: есть POSTed данные из sendgid в виде массива после обработки функции json_decode? Я все еще не совсем уверен, что я делаю неправильно. Я изменен свой код на следующее и я получаю неопределенный индекс все мои переменные вне Еогеаспа и недопустимого arguement на самом Еогеаспа ...

<?php 

require_once('../functions.php'); 
connect(); 

    $data = file_get_contents("php://input"); // Can i do this? Or do i just pass a $json variable? 
    $records = json_decode($data, true); 

    $uid = $_POST['uid']; 
    $timestamp = $_POST['timestamp']; 
    $event_type = $_POST['event']; 
    $email_address = $_POST['email']; 
    $smtpid = $_POST['smtpid']; 
    $sg_event_id = $_POST['sg_event_id']; 
    $sg_message_id = $_POST['sg_message_id']; 
    $category = $_POST['category']; 
    $newsletter = $_POST['newsletter']; 
    $response = $_POST['response']; 
    $reason = $_POST['reason']; 
    $ip = $_POST['ip']; 
    $useragent = $_POST['useragent']; 
    $attempt = $_POST['attempt']; 
    $status = $_POST['status']; 
    $type = $_POST['type']; 
    $url = $_POST['url']; 
    $additional_arguments = $_POST['additional_arguments']; 
    $event_post_timestamp = $_POST['event_post_timestamp']; 
    $raw = $_POST['raw']; 
    $customer_id = $_POST['customer_id']; 

    foreach ($records as $record) { 

     insert("sendgrid_events", array("uid" => $uid, 
             "timestamp" => $timestamp, 
             "event" => $event_type, 
             "email" => $email_address, 
             "smtpid" => $smtpid, 
             "sg_event_id" => $sg_event_id, 
             "sg_message_id" => $sg_message_id, 
             "category" => $category, 
             "newsletter" => $newsletter, 
             "response" => $response, 
             "reason" => $reason, 
             "ip" => $ip, 
             "useragent" => $useragent, 
             "attempt" => $attempt, 
             "status" => $status, 
             "type" => $type, 
             "url" => $url, 
             "additional_arguments" => $additional_arguments, 
             "event_post_timestamp" => $event_post_timestamp, 
             "raw" => $raw, 
             "customer_id" => $customer_id)); //Unique Arguement to attach customer id on original outbound email? Yes 
    } 

    echo "POST Received"; 
+0

Вы начинаете сеанс php в начале этого скрипта? то есть 'session_start();'? – Latheesan

+0

Прошу прощения, я не включил эту часть. Я отредактирую в. – GRANDLarsony

ответ

1

Похоже, что вы можете быть искажая как Event Webhook. Данные webhook POST s на конечную точку (в случае, ваш PHP-скрипт) каждый раз, когда происходит событие (например, кто-то открывает ваше электронное письмо). Все это происходит в режиме реального времени. Это - это API, который вы хотите использовать для получения и хранения событий.

Однако ваш сценарий также использует App/Filter Activation Endpoint. Эта конечная точка включает и выключает использование фильтра (также называемого приложением). Вам нужно будет использовать это только один раз, чтобы убедиться, что вы отправляете данные на свой PHP-скрипт при возникновении события. Однако может быть проще просто активировать его через SendGrid's Web Interface. Более подробную информацию о приложении и способах его использования и изменения можно найти на app description page.

Если вы удалите бит запроса cURL со своего сценария, вам останется просто получить данные из запроса POST и сохранить его. Изменяя свой сценарий к следующему, все должно работать:

<?php 

// All your boilerplate code 
require_once('../functions.php'); 
connect(); 

// Get the raw POSTed data 
$data = file_get_contents("php://input"); 

// Decode said data 
$records = json_decode($data, true); 

// Loop through the records 
foreach ($records as $record) { 
    // Store the event 
    // Assume store_event does your data processing and inserting 
    store_event($record); 

    // You should be able to access any parameter of the event as so 
    // $record["email"]; 
    // e.g. 

    echo $record["email"]; 
    echo " had an email "; 
    echo $record["event"]; 
} 

Ваша ошибка была в следующей строке, где вы пытались нам вход POST ред к вам в качестве ключа на ответ API при установке фильтра , Так как его не было, данные были неопределенными и поэтому не повторялись с foreach.

// The "bad" code 
$data = $response[file_get_contents("php://input")]; 

Вы можете увидеть working code example of the event webhook on SendGrid's Documentation.

+0

благодарим вас за понимание, я думаю, что теперь у меня есть гораздо лучшее понимание того, как данные отправляются на мою конечную точку, учитывая необходимость в коревом коде, который у меня был, но мне все равно не понадобится какая-то аутентификация на моей конечной точке с моими учетными данными sendgrid? Я переработал код выше со всем, кроме проверки подлинности. – GRANDLarsony

+0

Поскольку вы «авторизованы», когда вы отправляете SendGrid URL-адрес, к которому вы хотите отправить данные, вам не нужно проходить аутентификацию с помощью SendGrid во второй раз (когда мы отправляем вам данные). Если вы хотите, чтобы SendGrid предоставил вам данные, способ добавления аутентификации подробно описан в этом ответе: http://stackoverflow.com/a/20865822/648494 –

Смежные вопросы