Добавление подписчиков в список с использованием Mailchimp’s API v3

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

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

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

ОБНОВЛЕНИЕ 1: Я провел дальнейшие исследования на основе TooMuchPete’s ответ что касается ссылки на Управление подписчиками и изменил некоторый код, который я нашел Вот, но это не сработает, потому что функция 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Я теперь прибегаю к использованию curl, и мне удалось получить что-то почти работающее. Данные отправляются в 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');

51

Решение

На основе Список участников Instance docs, самый простой способ — это использовать PUT запрос, который в соответствии с документами либо «добавляет нового участника списка или обновляет участника, если электронная почта уже существует в списке».

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

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

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

$data = [
'email'     => '[email protected]',
'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;
}
103

Другие решения

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

$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');
23

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

В Mailchimp:

  1. Приобрети свой Ключ API а также ID списка
  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="[email protected]">
<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() success обработчик.
  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;)
5

ЗАГРУЗКА ГРУЗА — Итак, после удаления моего предыдущего ответа за использование ссылок я обновил код, который мне удалось получить. Спасибо всем, кто упростил / исправил / уточнил / вставил функцию и т. Д., Так как я все еще изучаю этот материал, но у меня есть список участников пакета, добавивший работу 🙂

$apikey = "whatever-us99";
$list_id = "12ab34dc56";

$email1 = "[email protected]";
$fname1 = "Jack";
$lname1 = "Black";

$email2 = "[email protected]";
$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");
2

Если хочешь бежать Пакетная подписка на список с использованием Mailchimp API . Тогда вы можете использовать функцию ниже.

    /**
* 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 Ссылка

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

0

Если это кому-нибудь поможет, вот что я получил в Python, используя Python Запросы библиотека вместо CURL.

Как объясняет @staypuftman выше, вам понадобится ваш ключ API и идентификатор списка из MailChimp и убедитесь, что ваш суффикс API Key и префикс URL (то есть us5) совпадают.

Python:

#########################################################################################
# To add a single contact to MailChimp (using MailChimp v3.0 API), requires:
#   + MailChimp API Key
#   + MailChimp List Id for specific list
#   + MailChimp API URL for adding a single new contact
#
# Note: the API URL has a 3/4 character 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/4 characters of your API key. The API URL location subdomain must match API Key
# suffix e.g. us5, us13, us19 etc. but in this example, us5.
# (suggest you put the following 3 values in 'settings' or 'secrets' file)
#########################################################################################
MAILCHIMP_API_KEY = 'your-api-key-here-us5'
MAILCHIMP_LIST_ID = 'your-list-id-here'
MAILCHIMP_ADD_CONTACT_TO_LIST_URL = 'https://us5.api.mailchimp.com/3.0/lists/' + MAILCHIMP_LIST_ID + '/members/'

# Create new contact data and convert into JSON as this is what MailChimp expects in the API
# I've hardcoded some test data but use what you get from your form as appropriate
new_contact_data_dict = {
"email_address": "[email protected]",              # 'email_address' is a mandatory field
"status": "subscribed",                           # 'status' is a mandatory field
"merge_fields": {                                 # 'merge_fields' are optional:
"FNAME": "John",
"LNAME": "Smith"}
}
new_contact_data_json = json.dumps(new_contact_data_dict)

# Create the new contact using MailChimp API using Python 'Requests' library
req = requests.post(
MAILCHIMP_ADD_CONTACT_TO_LIST_URL,
data=new_contact_data_json,
auth=('user', MAILCHIMP_API_KEY),
headers={"content-type": "application/json"}
)

# debug info if required - .text and .json also list the 'merge_fields' names for use in contact JSON above
# print req.status_code
# print req.text
# print req.json()

if req.status_code == 200:
# success - do anything you need to do
else:
# fail - do anything you need to do - but here is a useful debug message
mailchimp_fail = 'MailChimp call failed calling this URL: {0}\n' \
'Returned this HTTP status code: {1}\n' \
'Returned this response text: {2}' \
.format(req.url, str(req.status_code), req.text)
0
По вопросам рекламы [email protected]