Hoe krijg ik de data van een webhook verwerkt?

Status
Niet open voor verdere reacties.

ariecade

Gebruiker
Lid geworden
5 jun 2019
Berichten
146
Hallo,

Ik loop even ergens tegenaan en weet niet hoe ik dit verder moet aanpakken.

Ik gebruik Laposta om nieuwsbrieven te versturen en wil dat een afmelding via een nieuwsbrief verwerkt wordt in een MySQL tabel zodat ook daar de afmelding verwerkt wordt.

Ik heb dus een webhook.php pagina welke dus in die verzendlijst als webhook URL staat ingesteld.

Deze webhook.php ziet er nu zo uit:

Code:
$sJsonData = @file_get_contents('php://input');

mail('xxx@xx.com', 'mail 1',$sJsonData); // E-mail naar mijzelf om te kijken wat er in de webhook staat

$arr = json_decode($sJsonData, true);

$event1 = $arr["event"];
$event2 = $arr["data"]["event"];
$event3 = $arr["data"]["data"]["event"];

mail('xxx@xx.com', 'mail 2', 'event1 = ' . $event1 . ' and event2 = ' . $event2  . ' and event3 = ' . $event3); // E-mail naar mijzelf om te kijken of de (test) variabelen $event1, $event2 en / of $event3 gevuld is

In e-mail 1 staat:

Code:
{
"data": [
    {
        "type": "member",
        "event": "deactivated",
        "data": {
            "member_id": "***",
            "list_id": "***",
            "email": "xxx@xx.com",
            "state": "unsubscribed",
            "signup_date": "2020-11-18 15:50:34",
            "modified": "2020-11-23 16:56:25",
            "confirm_date": null,
            "ip": "***",
            "source_url": "",
            "custom_fields": {
                "spelersnaam": "***"
            }
        },
        "info": {
            "source": "external",
            "action": "unsubscribed",
            "date_event": "2020-11-23 17:05:15"
        }
    }
],
"date_requested": "2020-11-23 17:05:20"
}

Maar in mijn 2e mail staat 3 x een lege waarde achter de 3 variabelen.

Enig idee wat ik fout doe?

Het lijkt erop dat de json naar naar een PHP array wordt omgezet of zie ik wat anders over het hoofd?

Groeten,

Arie
 
Kijk eens wat een var_dump($arr["event"]) geeft ;-)

Tevens is het onzinnig om deze opnieuw op te slaan in $event1, $event2 en $event3.
 
Laatst bewerkt:
Kan je hier wat mee?
Code:
$sJsonData = @file_get_contents('php://input');
if ($sJsonData !== false) {
    $arr = json_decode($sJsonData, true);
    if (is_array($arr) && isset($arr["data"][0]["data"])) {
        $laposta = $arr["data"][0];
        echo "<br>" . $laposta["type"];
        echo "<br>" . $laposta["data"]["email"];
        echo "<br>" . $laposta["data"]["custom_fields"]["spelersnaam"];
        echo "<br>" . $laposta["info"]["action"];
    } else {
        echo "json bevat geen geldige data";
    }
} else {
    echo "Geen json data ontvangen.";
}
 
Laatst bewerkt:
Kijk eens wat een var_dump($arr["event"]) geeft ;-)

Tevens is het onzinnig om deze opnieuw op te slaan in $event1, $event2 en $event3.

De var_dump is inderdaad een optie alleen heb ik nog niet kunnen achterhalen hoe ik de webhook voor de juiste contactpersoon en maillijst kan oproepen vanuit de browser dus ik test het nu door gewoon de uitschrijflink vanuit een nieuwsbrief te gebruiken. En dan heeft het helaas niet veel zin om de var_dump te gebruiken.

En die 3 variabelen was alleen maar om aan te geven dat ik voor mij gevoel alle opties had geprobeert om de variabele te achterhalen maar helaas zijn ze alledrie leeg.
 
Als je moeite hebt om de data te kunnen debuggen, omdat iets op de achtergrond wordt uitgevoerd, of geen output kan/mag tonen.
Gebruik dan FirePHP. Daarmee kan je alle PHP-waardes doorsturen naar je lokale debugger van je browser.

Ik weet niet of het nog actueel is, maar vroeger heb ik dit vaak gebruikt.
 
Kan je hier wat mee?
Code:
$sJsonData = @file_get_contents('php://input');
if ($sJsonData !== false) {
    $arr = json_decode($sJsonData, true);
    if (is_array($arr) && isset($arr["data"][0]["data"])) {
        $laposta = $arr["data"][0];
        echo "<br>" . $laposta["type"];
        echo "<br>" . $laposta["data"]["email"];
        echo "<br>" . $laposta["data"]["custom_fields"]["spelersnaam"];
        echo "<br>" . $laposta["info"]["action"];
    } else {
        echo "json bevat geen geldige data";
    }
} else {
    echo "Geen json data ontvangen.";
}

Dit was inderdaad de oplossing, tnx Bron! Het zat hem dus in de $arr["data"][0], dat miste ik dus ;)

Ik lees nog wel dat de webhook om de 5 seconden opgeroepen wordt en dat als er toevallig meerdere afmeldingen zijn, dan worden ze in 1 webhook gezet.

Dan vermoed ik dat ik daar nog een foreach aan toe moet voegen om dit af te vangen, zit ik dan op het goede spoor en hoe worden dan de variabelen aangeroepen?
 
Als je moeite hebt om de data te kunnen debuggen, omdat iets op de achtergrond wordt uitgevoerd, of geen output kan/mag tonen.
Gebruik dan FirePHP. Daarmee kan je alle PHP-waardes doorsturen naar je lokale debugger van je browser.

Ik weet niet of het nog actueel is, maar vroeger heb ik dit vaak gebruikt.

Tnx, ik zal daar eens induiken :thumb:
 
Je had de opbouw van de array kunnen vinden met deze 3 regels ertussen ;-)
Code:
if (is_array($arr) && isset($arr["data"][0]["data"])) {
    echo "<br><pre>";
    print_r ($arr);
    echo "</pre><br>";
    ....

Het stukje && isset($arr["data"][0]["data"]) is om te controleren of er data in de array is.
Omdat ik niet weet welke error meldingen Laposta kan geven heb ik het zo opgelost (maar het is niet netjes).
 
Ik lees nog wel dat de webhook om de 5 seconden opgeroepen wordt en dat als er toevallig meerdere afmeldingen zijn, dan worden ze in 1 webhook gezet.
Dan vermoed ik dat ik daar nog een foreach aan toe moet voegen om dit af te vangen, zit ik dan op het goede spoor en hoe worden dan de variabelen aangeroepen?
Het is niet zinvol om het complete script met sleep(5) stil te leggen. Je kan beter de resultaten direct in de DB wegschrijven en via een cronjob telkens elke minuut (5 sec is ook niet zo zinvol) het script aanroepen. Het is voldoende om telkens met een insert query en update query de resultaten opnieuw in de DB weg te schrijven. Als een item al in de DB bestaat dan overschrijf je het zodat je altijd unieke items in de DB hebt.
 
Laatst bewerkt:
Het is niet zinvol om het complete script met sleep(5) stil te leggen. Je kan beter de resultaten direct in de DB wegschrijven en via een cronjob telkens elke minuut (5 sec is ook niet zo zinvol) het script aanroepen. Het is voldoende om telkens met een insert query en update query de resultaten opnieuw in de DB weg te schrijven. Als een item al in de DB bestaat dan overschrijf je het zodat je altijd unieke items in de DB hebt.

Ik vrees dat ik het niet goed uitgelegd hebt, anders snap ik jouw bovenstaande verhaal niet helemaal ..... :P

Het is dus mogelijk dat 2 deelnemers onafhankelijk van elkaar zich uitschrijven van de nieuwsbrief, Laposta bundelt deze verzoeken dus samen in 1 webhook.

Dan moet ik toch met een foreach door deze afmeldingen lopen zodat beide afmeldingen verwerkt gaan worden in de database?
 
Je kan het met een foreach of een simpele for loop uitlezen. Met de for loop heb je gelijk een pointer binnen de array naar elk item. Ik vermoed dat het dit is maar zonder voorbeeld van de json met meerdere items weet ik het niet zeker.
Code:
if (is_array($arr) && isset($arr["data"][0]["data"])) {
   $arrLength = count($arr["data"]);
   for ($i = 0; $i < $arrLength; $i++) {
      $lapostaItem = $arr["data"][$i];
      echo "<br>" . $lapostaItem["data"]["email"];
   }
}
 
Laatst bewerkt:
Tnx Bron voor de aanvulling van de code, zojuist getest en het werkt als een trein :thumb:
 
Top. Suc6 met je project :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan