merge_fields Fehler 400 – Mailchimp api v3

Lesezeit: 3 Minuten

Benutzer-Avatar
Maicon Furtado

Ich habe eine Liste mit diesen Feldern: email, FNAME und LNAME. Wenn ich versuche zu senden merge_fields über Ajax gibt Ajax einen Fehler zurück:

string(400) “{“type”:”http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/“,”title”:”Ungültige Ressource”,”status”:400,”detail”:”Die eingereichte Ressource konnte nicht validiert werden. Feldspezifische Details finden Sie im Array „errors“.”,”instance”:”f311cff1-ec28-4003-8dde-007bc0001688″,”errors”:[{“field”:”merge_fields.FNAME”,”message”:”Data did not match any of the schemas described in anyOf.”}]}”

JS:

app.subscribe = function() {
$(document).on('submit', '.form-course', function(e) {
    var fullName = $('#name').val(),
        arrName = fullName.split(' '),
        fname = arrName.slice(0, 1).join(' '),
        lname = arrName.slice(1, arrName.length).join(' ');

    var data = {
        'email' : $('#email').val(),
        "merge_fields": {
            "FNAME": fname,
            "LNAME": lname
        }
    };

    console.log(data);

    $.ajax({
        url: url+'/wp-admin/admin-ajax.php?action=ux_subscribe',
        method: 'POST',
        data: data,
        success: function(response) {
            gtag('send', 'event', 'Modal', 'subscribed', 'Subscription');
            fbq('track', 'CompleteRegistration');

            $('#modal').fadeOut(function() {
                // window.location.replace("./sucesso");
            });
        }, error: function(data) {
            alert('ERRO! Tente novamente mais tarde!');
        }
    });

    return false;
    });
};

PHP:

function ux_subscribe() {
    //GET via front-end form
    $apiKey = 'XXX'; //Generate an API key via: Account > Extras > Api Keys
    $listId = 'XXX'; //Find this via: Lists > List > Settings > List name and defaults
    $email = $_POST['email']; //GET via front-end form
    $fname = $_POST['fname']; //GET via front-end form
    $lname = $_POST['lname']; //GET via front-end form
    $auth = base64_encode( 'user:' . $apiKey );

    echo $fname;

    $json = json_encode([
        'email_address' => $email,
        'status'        => "subscribed", // Choices include: "subscribed", "unsubscribed", "cleaned", "pending"
        'merge_fields'  => array(
            'FNAME' => $fname,
            'LNAME' => $lname
        )
    ]);

    $memberId = md5(strtolower( $email ));
    $dataCenter = substr($apiKey,strpos($apiKey,'-')+1);
    $url="https://" . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listId . '/members/';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Basic ' . $auth]);
    curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

    $result = curl_exec($ch);

     var_dump($result);

    wp_die();
}

Wenn ich die Variablen entferne und eine Zeichenfolge einfüge, funktioniert es:

$json = json_encode([
        'email_address' => $email,
        'status'        => "subscribed", // Choices include: "subscribed", "unsubscribed", "cleaned", "pending"
        'merge_fields'  => array(
            'FNAME' => 'hello',
            'LNAME' => 'bye'
        )
    ]);

Weiß jemand warum???

Sie können keine “leeren” Werte an die API senden.

Das funktioniert zum Beispiel:

$fname = "joe";
$lname = "smith"
'merge_fields'  => array(
    'FNAME' => $fname,
    'LNAME' => $lname
)

Dies würde jedoch fehlschlagen, beachten Sie, dass der lname nicht definiert ist.

$fname = "joe";
'merge_fields'  => array(
    'FNAME' => $fname,
    'LNAME' => $lname
)

Daher benötigen Sie eine einfache Abkürzung, um “leere” Werte bereitzustellen.

$fname = empty($fname) ? " " : $fname;
$lname = empty($lname ) ? " " : $lname ;
'merge_fields'  => array(
    'FNAME' => $fname,
    'LNAME' => $lname
)

Ich hatte ein großes Array mit 20 Segmenten darin und bekam immer wieder den gleichen Fehler, sobald ich etwas richtiges empty() hineingeworfen hatte, um zu überprüfen, ob alles in Ordnung war …

Dies ist alt, wollte aber darauf hinweisen, dass Ihr Javascript-Ajax-Aufruf diese Daten sendet:

var data = {
    'email' : $('#email').val(),
    "merge_fields": {
        "FNAME": fname,
        "LNAME": lname
    }
};

…Aber Ihr PHP-Skript versucht, die Post-Variablen zu finden in:

$fname = $_POST['fname'];
$lname = $_POST['lname'];

Aktualisieren Sie einfach Ihre Ajax-Daten wie folgt:

var data = {
  'email' : $('#email').val(),
  'fname': fname,
  'lname' : lname
};

1119970cookie-checkmerge_fields Fehler 400 – Mailchimp api v3

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy