Добавление подписчиков в список с помощью API Mailchimp v3

Я пытаюсь добавить пользователей в список, который я создал в Mailchimp, но я не могу найти примеры кода нигде. Я попытался выяснить, как использовать API, но я очень люблю «взглянуть на пример и изучить» человека.

Я пробовал использовать версию 2 API, но ничего не работает, несмотря на работу с примерами в сети, и Mailchimp говорит о более ранних версиях своего API на своем веб-сайте:

Версии 2.0 и ранее устарели. Для этих версий будут доступны только минимальные исправления ошибок, исправления безопасности.

ОБНОВЛЕНИЕ 1 : Я провел некоторое исследование, основанное на ответе TooMuchPete в отношении ссылки на «Управление подписчиками» и изменил код, который я нашел здесь , но он не будет работать, потому что функция http_build_query () не имеет отношения к вложенным массивам. Я не уверен, как иметь дело с частью merge_fields добавления подписчика. Мой текущий код ниже:

$postdata = http_build_query( array( 'apikey' => $apikey, 'email_address' => $email, 'status' => 'subscribed', 'merge_fields' => array( 'FNAME' => $name ) ) ); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata ) ); $context = stream_context_create($opts); $result = file_get_contents('https://us2.api.mailchimp.com/3.0/lists/<list_id>/members/', false, $context); var_dump($result); die('Mailchimp executed'); 

ОБНОВЛЕНИЕ 2 : Я теперь прибегал к использованию завитка, и мне удалось получить что-то почти работающее. Данные отправляются Mailchimp, но я получаю сообщение об ошибке «Ваш запрос не включал ключ API». Я предполагаю, что мне нужно пройти аутентификацию, как упомянуто здесь . Я попытался добавить его в заголовок http, который не работал. Смотрите мой код ниже:

 $apikey = '<api_key>'; $auth = base64_encode( 'user:'.$apikey ); $data = array( 'apikey' => $apikey, 'email_address' => $email, 'status' => 'subscribed', 'merge_fields' => array( 'FNAME' => $name ) ); $json_data = json_encode($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://us2.api.mailchimp.com/3.0/lists/<list_id>/members/'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json/r/n 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_data); $result = curl_exec($ch); var_dump($result); die('Mailchimp executed'); 

    Основанный на документах экземпляров List List , самый простой способ – использовать запрос PUT который согласно документам «добавляет новый элемент списка или обновляет член, если почта уже существует в списке» .

    Кроме того, apikey определенно не является частью json-схемы, и нет смысла включать его в ваш запрос json.

    Кроме того, как отмечено в комментарии @ TooMuchPete, вы можете использовать CURLOPT_USERPWD для базового HTTP-аутентификации, как показано ниже.

    Я использую следующую функцию для добавления и обновления элементов списка. Возможно, вам потребуется включить немного другой набор merge_fields зависимости от ваших параметров списка.

     $data = [ 'email' => 'johndoe@example.com', 'status' => 'subscribed', 'firstname' => 'john', 'lastname' => 'doe' ]; syncMailchimp($data); function syncMailchimp($data) { $apiKey = 'your api key'; $listId = 'your list id'; $memberId = md5(strtolower($data['email'])); $dataCenter = substr($apiKey,strpos($apiKey,'-')+1); $url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listId . '/members/' . $memberId; $json = json_encode([ 'email_address' => $data['email'], 'status' => $data['status'], // "subscribed","unsubscribed","cleaned","pending" 'merge_fields' => [ 'FNAME' => $data['firstname'], 'LNAME' => $data['lastname'] ] ]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, $json); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $httpCode; } 

    Я заработал. Я неправильно добавлял аутентификацию в заголовок:

     $apikey = '<api_key>'; $auth = base64_encode( 'user:'.$apikey ); $data = array( 'apikey' => $apikey, 'email_address' => $email, 'status' => 'subscribed', 'merge_fields' => array( 'FNAME' => $name ) ); $json_data = json_encode($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://us2.api.mailchimp.com/3.0/lists/<list_id>/members/'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('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_data); $result = curl_exec($ch); var_dump($result); die('Mailchimp executed'); 

    Это хорошие ответы, но они отделились от полного ответа о том, как вы получите форму для отправки данных и обработки этого ответа. Это покажет, как добавить участника в список с v3.0 API с HTML-страницы через jquery .ajax() .

    В Mailchimp:

    1. Приобретите свой ключ API и идентификатор списка
    2. Убедитесь, что вы настроили свой список и какие пользовательские поля вы хотите использовать с ним. В этом случае я установил zipcode в качестве настраиваемого поля в списке ПЕРЕД вызовом API.
    3. Ознакомьтесь с документами API по добавлению членов в списки. Мы используем метод create который требует использования HTTP POST запросов. Существуют и другие варианты, которые требуют PUT если вы хотите иметь возможность изменять / удалять субтитры.

    HTML:

     <form id="pfb-signup-submission" method="post"> <div class="sign-up-group"> <input type="text" name="pfb-signup" id="pfb-signup-box-fname" class="pfb-signup-box" placeholder="First Name"> <input type="text" name="pfb-signup" id="pfb-signup-box-lname" class="pfb-signup-box" placeholder="Last Name"> <input type="email" name="pfb-signup" id="pfb-signup-box-email" class="pfb-signup-box" placeholder="youremail@example.com"> <input type="text" name="pfb-signup" id="pfb-signup-box-zip" class="pfb-signup-box" placeholder="Zip Code"> </div> <input type="submit" class="submit-button" value="Sign-up" id="pfb-signup-button"></a> <div id="pfb-signup-result"></div> </form> 

    Ключевые вещи:

    1. Дайте вашей <form> уникальный идентификатор и не забудьте атрибут method="post" чтобы форма работала.
    2. Обратите внимание, что последняя строка #signup-result – это то, где вы будете откладывать обратную связь от скрипта PHP.

    PHP:

     <?php /* * Add a 'member' to a 'list' via mailchimp API v3.x * @ http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#create-post_lists_list_id_members * * ================ * BACKGROUND * Typical use case is that this code would get run by an .ajax() jQuery call or possibly a form action * The live data you need will get transferred via the global $_POST variable * That data must be put into an array with keys that match the mailchimp endpoints, check the above link for those * You also need to include your API key and list ID for this to work. * You'll just have to go get those and type them in here, see README.md * ================ */ // Set API Key and list ID to add a subscriber $api_key = 'your-api-key-here'; $list_id = 'your-list-id-here'; /* ================ * DESTINATION URL * Note: your API URL has a location subdomain at the front of the URL string * It can vary depending on where you are in the world * To determine yours, check the last 3 digits of your API key * ================ */ $url = 'https://us5.api.mailchimp.com/3.0/lists/' . $list_id . '/members/'; /* ================ * DATA SETUP * Encode data into a format that the add subscriber mailchimp end point is looking for * Must include 'email_address' and 'status' * Statuses: pending = they get an email; subscribed = they don't get an email * Custom fields go into the 'merge_fields' as another array * More here: http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#create-post_lists_list_id_members * ================ */ $pfb_data = array( 'email_address' => $_POST['emailname'], 'status' => 'pending', 'merge_fields' => array( 'FNAME' => $_POST['firstname'], 'LNAME' => $_POST['lastname'], 'ZIPCODE' => $_POST['zipcode'] ), ); // Encode the data $encoded_pfb_data = json_encode($pfb_data); // Setup cURL sequence $ch = curl_init(); /* ================ * cURL OPTIONS * The tricky one here is the _USERPWD - this is how you transfer the API key over * _RETURNTRANSFER allows us to get the response into a variable which is nice * This example just POSTs, we don't edit/modify - just a simple add to a list * _POSTFIELDS does the heavy lifting * _SSL_VERIFYPEER should probably be set but I didn't do it here * ================ */ curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $api_key); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_pfb_data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $results = curl_exec($ch); // store response $response = curl_getinfo($ch, CURLINFO_HTTP_CODE); // get HTTP CODE $errors = curl_error($ch); // store errors curl_close($ch); // Returns info back to jQuery .ajax or just outputs onto the page $results = array( 'results' => $result_info, 'response' => $response, 'errors' => $errors ); // Sends data back to the page OR the ajax() in your JS echo json_encode($results); ?> 

    Ключевые вещи:

    1. CURLOPT_USERPWD обрабатывает ключ API, и Mailchimp на самом деле не показывает вам, как это сделать.
    2. CURLOPT_RETURNTRANSFER дает нам ответ таким образом, что мы можем отправить его обратно на HTML-страницу с помощью .ajax() .
    3. Используйте json_encode для данных, которые вы получили.

    JS:

     // Signup form submission $('#pfb-signup-submission').submit(function(event) { event.preventDefault(); // Get data from form and store it var pfbSignupFNAME = $('#pfb-signup-box-fname').val(); var pfbSignupLNAME = $('#pfb-signup-box-lname').val(); var pfbSignupEMAIL = $('#pfb-signup-box-email').val(); var pfbSignupZIP = $('#pfb-signup-box-zip').val(); // Create JSON variable of retreived data var pfbSignupData = { 'firstname': pfbSignupFNAME, 'lastname': pfbSignupLNAME, 'email': pfbSignupEMAIL, 'zipcode': pfbSignupZIP }; // Send data to PHP script via .ajax() of jQuery $.ajax({ type: 'POST', dataType: 'json', url: 'mailchimp-signup.php', data: pfbSignupData, success: function (results) { $('#pfb-signup-box-fname').hide(); $('#pfb-signup-box-lname').hide(); $('#pfb-signup-box-email').hide(); $('#pfb-signup-box-zip').hide(); $('#pfb-signup-result').text('Thanks for adding yourself to the email list. We will be in touch.'); console.log(results); }, error: function (results) { $('#pfb-signup-result').html('<p>Sorry but we were unable to add you into the email list.</p>'); console.log(results); } }); }); 

    Ключевые вещи:

    1. Данные JSON ОЧЕНЬ обидчивы при передаче. Здесь я помещаю его в массив, и это выглядит легко. Если у вас возникли проблемы, это, скорее всего, связано с тем, как структурированы ваши данные JSON. Проверь это!
    2. Ключи для ваших данных JSON станут тем, что вы ссылаетесь в глобальной переменной PHP _POST . В этом случае это будет _POST['email'] , _POST['firstname'] и т. Д. Но вы можете назвать их, как хотите, – просто помните, как вы называете ключи части data вашей передачи JSON, – это то, как вы получаете доступ их в PHP.
    3. Это явно требует jQuery;)

    BATCH LOAD – ОК, поэтому после того, как мой предыдущий ответ был удален для использования только ссылок, я обновил код, который мне удалось получить. Цените кого-нибудь, чтобы упростить / исправить / усовершенствовать / вставить функцию и т. Д., Поскольку я все еще изучаю этот материал, но у меня есть список членов партии, добавляющий работу 🙂

     $apikey = "whatever-us99"; $list_id = "12ab34dc56"; $email1 = "jack@email.com"; $fname1 = "Jack"; $lname1 = "Black"; $email2 = "jill@email.com"; $fname2 = "Jill"; $lname2 = "Hill"; $auth = base64_encode( 'user:'.$apikey ); $data1 = array( "apikey" => $apikey, "email_address" => $email1, "status" => "subscribed", "merge_fields" => array( 'FNAME' => $fname1, 'LNAME' => $lname1, ) ); $data2 = array( "apikey" => $apikey, "email_address" => $email2, "status" => "subscribed", "merge_fields" => array( 'FNAME' => $fname2, 'LNAME' => $lname2, ) ); $json_data1 = json_encode($data1); $json_data2 = json_encode($data2); $array = array( "operations" => array( array( "method" => "POST", "path" => "/lists/$list_id/members/", "body" => $json_data1 ), array( "method" => "POST", "path" => "/lists/$list_id/members/", "body" => $json_data2 ) ) ); $json_post = json_encode($array); $ch = curl_init(); $curlopt_url = "https://us99.api.mailchimp.com/3.0/batches"; curl_setopt($ch, CURLOPT_URL, $curlopt_url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Basic '.$auth)); curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/3.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_post); print_r($json_post . "\n"); $result = curl_exec($ch); var_dump($result . "\n"); print_r ($result . "\n"); 

    v2.0 все еще определенно работает. v1.3 тоже, на самом деле, но если вы ищете примеры API v3.0, я бы проверил это репо GitHub . Сейчас он имеет только Python, но этого может быть достаточно, чтобы вы указали в правильном направлении на своем языке.

    Также есть страница в документах об управлении подписчиками , что является шагом от фактических примеров кода, но может по-прежнему быть полезным.

    Если вы хотите запустить пакетную подписку в списке с помощью API Mailchimp . Затем вы можете использовать следующую функцию.

      /** * Mailchimp API- List Batch Subscribe added function * * @param array $data Passed you data as an array format. * @param string $apikey your mailchimp api key. * * @return mixed */ function batchSubscribe(array $data, $apikey) { $auth = base64_encode('user:' . $apikey); $json_postData = json_encode($data); $ch = curl_init(); $dataCenter = substr($apikey, strpos($apikey, '-') + 1); $curlopt_url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/batches/'; curl_setopt($ch, CURLOPT_URL, $curlopt_url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Basic ' . $auth)); curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/3.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_postData); $result = curl_exec($ch); return $result; } 

    Формат использования функции и данных для пакетных операций :

     <?php $apikey = 'Your MailChimp Api Key'; $list_id = 'Your list ID'; $servername = 'localhost'; $username = 'Youre DB username'; $password = 'Your DB password'; $dbname = 'Your DB Name'; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die('Connection failed: ' . $conn->connect_error); } $sql = 'SELECT * FROM emails';// your SQL Query goes here $result = $conn->query($sql); $finalData = []; if ($result->num_rows > 0) { // output data of each row while ($row = $result->fetch_assoc()) { $individulData = array( 'apikey' => $apikey, 'email_address' => $row['email'], 'status' => 'subscribed', 'merge_fields' => array( 'FNAME' => 'eastwest', 'LNAME' => 'rehab', ) ); $json_individulData = json_encode($individulData); $finalData['operations'][] = array( "method" => "POST", "path" => "/lists/$list_id/members/", "body" => $json_individulData ); } } $api_response = batchSubscribe($finalData, $apikey); print_r($api_response); $conn->close(); 

    Кроме того, этот код можно найти в моем Github gist. Ссылка GithubGist

    Справочная документация: официальный