Я пытаюсь добавить пользователей в список, который я создал в 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:
zipcode
в качестве настраиваемого поля в списке ПЕРЕД вызовом 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>
Ключевые вещи:
<form>
уникальный идентификатор и не забудьте атрибут method="post"
чтобы форма работала. #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); ?>
Ключевые вещи:
CURLOPT_USERPWD
обрабатывает ключ API, и Mailchimp на самом деле не показывает вам, как это сделать. CURLOPT_RETURNTRANSFER
дает нам ответ таким образом, что мы можем отправить его обратно на HTML-страницу с помощью .ajax()
. 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); } }); });
Ключевые вещи:
JSON
ОЧЕНЬ обидчивы при передаче. Здесь я помещаю его в массив, и это выглядит легко. Если у вас возникли проблемы, это, скорее всего, связано с тем, как структурированы ваши данные JSON. Проверь это! _POST
. В этом случае это будет _POST['email']
, _POST['firstname']
и т. Д. Но вы можете назвать их, как хотите, – просто помните, как вы называете ключи части data
вашей передачи JSON, – это то, как вы получаете доступ их в PHP. 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
Справочная документация: официальный