PHP Parse Json из HTTP-ответа и итеративного массива Foreach

1

Есть несколько целенаправленных вопросов по этой теме, но, попробовав их все, я почувствовал необходимость искать помощи. Я использую 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");
?>
  • 0
    Вы устанавливаете переменные в цикле, а затем используете переменные позже. это означает, что вы будете получать только те данные из обработанного события LAST $, которые хранятся в $ contact ...
  • 0
    Ааа имеет смысл. Поскольку размер строки JSON (то есть: число массивов) является динамическим, и я не могу знать, сколько массивов или значений будет существовать, нужно ли добавлять каждое значение в массив, чтобы сохранить первое, второе и т. Д. События чтобы убедиться, что они хранятся? Кстати, спасибо за быстрый ответ.
Показать ещё 5 комментариев
Теги:
webhooks
sendgrid
infusionsoft

1 ответ

0
Лучший ответ

То, что вы могли бы сделать, - это так:

$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. Вы можете сделать цикл над этим массивом, чтобы сохранить данные.

  • 0
    Леуан спасибо за ответ! Я добавил ваш фрагмент и попытался проверить его. Пожалуйста, прости меня за недостаток знаний о коде, но я хотел бы, чтобы письма в массиве внутри $emails правильными? Как насчет событий? Это $event ? Если бы я сделал var_dump($emails) или var_dump($event) меня были бы значения? Мне нужно передать электронную почту и значение в мою CRM, и, насколько я могу судить, веб-крючок SendGrid имеет только 1 связанное электронное письмо с каждым ответом, поэтому, возможно, массив электронных писем не нужен? Спасибо за отзыв
  • 0
    Получил код для работы, обновил оригинал. Спасибо за предложение leuan.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню