Я пытаюсь использовать следующий код для подключения к sendgrid с помощью команд curl и использовать foreach для публикации результатов в моей базе данных. Прямо сейчас я получаю неопределенную ошибку индекса для моего имени пользователя и пароля, а также неверный аргумент для моего foreach. Мне кажется, я знаю, почему я получаю ошибку foreach, я прокомментировал ее в своем коде, но я не уверен в аспекте подключения через веб-API. Спасибо
* 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, так что спасибо за помощь.
В ответ на ответы: передаются ли POST-данные из sendgid в виде массива после обработки функцией json_decode? Я все еще не совсем уверен, что я делаю неправильно. Я изменил свой код следующим образом, и я получаю неопределенный индекс для всех моих переменных за пределами foreach и неверный аргумент для самого foreach …
<?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";
Похоже, вы можете неправильно истолковать, как Событие Webhook. Веб-крючок POST
Данные о вашей конечной точке (в данном случае, вашем PHP-скрипте) каждый раз, когда происходит событие (например, кто-то открывает ваше электронное письмо). Все это происходит в режиме реального времени. Это является API, который вы хотите использовать для получения и хранения событий.
Тем не менее, ваш сценарий также использует Конечная точка активации приложения / фильтра. Эта конечная точка включает и отключает использование фильтра (также называемого приложением). Вам нужно будет использовать это только один раз, чтобы убедиться, что вы публикуете данные в свой PHP Script, когда происходит событие. Тем не менее, может быть проще просто активировать его через Веб-интерфейс SendGrid. Дополнительную информацию о приложении и способах его использования и изменения можно найти на страница описания приложения.
Если вы удалите 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")];
Вы можете увидеть пример рабочего кода события webhook в документации SendGrid.
Других решений пока нет …