Есть несколько целенаправленных вопросов по этой теме, но, попробовав их все, я почувствовал необходимость искать помощи. Я использую Sendgrid, их webhook отправляет ответ json, и по какой-то причине я не смог понять, как интегрироваться с нашим CRM.
Обновление: 12/3/2015 @13:01 - У меня есть код для работы (возможно, не самый эффективный, но он работает) см. Ниже.
Пример отправки JSON из отправителя:
[
{
"sg_message_id":"sendgrid_internal_message_id",
"email": "[email protected]",
"timestamp": 1337197600,
"smtp-id": "<[email protected]>",
"event": "spamreport"
},
{
"sg_message_id":"sendgrid_internal_message_id",
"email": "[email protected]",
"timestamp": 1337966815,
"category": "newuser",
"event": "bounce",
"url": "https://sendgrid.com"
},
{
"sg_message_id":"sendgrid_internal_message_id",
"email": "[email protected]",
"timestamp": 1337969592,
"smtp-id": "<[email protected]>",
"event": "unsubscribe",
"asm_group_id": 42
}
]
Проблема, с которой я сталкиваюсь, заключается в том, что каждый массив в JSON относится к определенному событию. Например, "Спам", или "Отскок" или "Отменить подписку". Я настроил его так, чтобы были отправлены только те три события. Однако есть вероятность, что кто-то сначала подпрыгнет, затем получит его, затем ударит спам, а затем отменит подписку.
Самое простое решение для этого (без учета системы иерархии) заключается в том, чтобы каждое из этих событий проходило в определенной области нашего CRM. Например, если событие = спам, то оно будет заполнять спам "спамом". Однако, если его нет, он ничего не должен делать.
Последнее замечание, я должен передать заголовок так, чтобы Sendgrid прекратил рассылку сценария. Кроме того, я не кодер, или программист, за последние несколько месяцев я просто взял несколько вещей.
Мой скрипт, который не работает:
<?php
$data = file_get_contents("php://input");
$events = json_decode($data, true);
require_once('Infusionsoft/infusionsoft.php');
$contact = new Infusionsoft_Contact();
$custom = array(
'_SGBounce',
'_SGSpam',
'_SGUnsub'
);
$contact->addCustomFields($custom);
if (is_array($events) || $events instanceof Traversable) {
foreach ($events as $event) {
$email = $event['email'];
if($event['event'] === 'bounce') {
$bounce = 'bounce';
} elseif ($event['event'] === 'spamreport') {
$spam = 'spam';
} elseif ($event['event'] === 'unsubscribe') {
$unsub = 'unsubscribe';
} else {
die echo header("HTTP/1.1 200 OK");
}
process_event($event);
}}
if (empty($email)) {
die echo header("HTTP/1.1 200 OK");
} else {
$contact->Email = $email;
$contact->_SGBounce = $bounce;
$contact->_SGSpam = $spam;
$contact->_SGUnsub = $unsub;
$contact->save();
}
header("HTTP/1.1 200 OK");
?>
У меня также есть сценарий, который я использую, который записывает в файл, просто чтобы проверить и посмотреть, могу ли я получить правильные события для записи. Однако мне не удалось получить его, чтобы пройти через первый массив. Я попытался вложить foreach() в другой foreach() с помощью ключевого решения = value, размещенного в другом ответе здесь. Однако это тоже был тупик.
Любые советы, помощь и руководство... были бы очень благодарны.
<?php
$data = file_get_contents("php://input");
$events = json_decode($data, true);
require_once('Infusionsoft/infusionsoft.php');
$contact = new Infusionsoft_Contact();
$custom = array(
'_SendGrid',
);
$contact->addCustomFields($custom);
$emails = array();
$em = '';
if (is_array($events) || $events instanceof Traversable) {
foreach ($events as $event) {
$email = $event['email'];
$em = $email;
if($event['event'] === 'unsubscribe') {
$event = 'unsubscribe';
$unsubscribe = 'unsubscribe';
} elseif($event['event'] === 'spamreport') {
$event = 'spam';
$spam = 'spam';
} elseif($event['event'] === 'bounce') {
$event = 'bounce';
$bounce = 'bounce';
} else {
continue;
}
$default = array(
'bounce' => false,
'spam' => false,
'unsubscribe' => false
);
if(!is_null($event)) {
if(array_key_exists($email, $emails)) {
$entry = $emails[$email];
} else {
$entry = $default;
}
switch($event) {
case "bounce":
$entry['bounce'] = true;
break;
case "spam":
$entry['spam'] = true;
break;
case "unsubscribe":
$entry['unsubscribe'] = true;
break;
}
}
}}
if($unsubscribe === 'unsubscribe'){
$param = 'unsubscribe';
} elseif($spam === 'spam'){
$param = 'spam';
} elseif($bounce === 'bounce'){
$param = 'bounce';
} else {
echo header("HTTP/1.1 200 OK");
}
$contact->Email = $em;
$contact->_SendGrid = $param;
$contact->save();
header("HTTP/1.1 200 OK");
?>
То, что вы могли бы сделать, - это так:
$emails = array();
foreach ($events as $event) {
$email = $event['email'];
if($event['event'] === 'bounce') {
$event = 'bounce';
} elseif ($event['event'] === 'spamreport') {
$event = 'spam';
} elseif ($event['event'] === 'unsubscribe') {
$event = 'unsubscribe';
} else {
continue;
}
// Set defaults
$default = array(
'bounce' => false,
'spam' => false,
'unsubscribe' => false
);
if(!is_null($event)) {
if(array_key_exists($email, $emails)) {
$entry = $emails[$email];
} else {
$entry = $default;
}
switch($event) {
case "bounce":
$entry['bounce'] = true;
break;
case "spam":
$entry['spam'] = true;
break;
case "unsubscribe":
$entry['unsubscribe'] = true;
break;
}
}
}
Затем вы получите список электронных писем, которые являются их собственным массивом с булевыми значениями для bounce
клавиш, spam
и unsubscribe
. Вы можете сделать цикл над этим массивом, чтобы сохранить данные.
$emails
правильными? Как насчет событий? Это $event
? Если бы я сделал var_dump($emails)
или var_dump($event)
меня были бы значения? Мне нужно передать электронную почту и значение в мою CRM, и, насколько я могу судить, веб-крючок SendGrid имеет только 1 связанное электронное письмо с каждым ответом, поэтому, возможно, массив электронных писем не нужен? Спасибо за отзыв