Мой вопрос касается использования API Mailchimp 3.0 и PHP для добавления подписчика непосредственно в мой список рассылки.
Код, который я использую (см. Ниже), работает должным образом и добавляет подписчика. Однако подписчику отправляется электронное письмо с подтверждением.
Код отсюда: http://www.johnkieken.com/mailchimp-form-using-api-v3-0-and-jquery-ajax/
Желаемое поведение - добавить подписчика непосредственно в список без подтверждения по электронной почте, а также предоставить сообщение на сайте, на который он был успешно подписан.
На моем сервере работает PHP 5.3.16.
У меня есть HTML-файл, оболочка API Mailchimp (mailchimp.php) и subscribe.php, которые находятся в одном каталоге для целей тестирования.
Я плохо разбираюсь в коде, поэтому надеюсь, что кто-то может помочь.
HTML
<!DOCTYPE html>
<html>
<head>
<script type = "text/javascript" src = "http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>
<body>
<form id = "signup" action = "index.html" method = "get">
First Name: <input type = "text" name = "fname" id = "fname" />
Last Name: <input type = "text" name = "lname" id = "lname" />
email Address (required): <input type = "email" name = "email" id = "email" />
<input type = "submit" id = "SendButton" name = "submit" value = "Submit" />
</form>
<div id = "message"></div>
<script src = "jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#signup').submit(function() {
$("#message").html("Adding your email address...");
$.ajax({
url: 'subscribe.php', // proper url to your "store-address.php" file
type: 'POST', // <- IMPORTANT
data: $('#signup').serialize() + '&ajax=true',
success: function(msg) {
var message = $.parseJSON(msg),
result = '';
if (message.status === 'pending') { // success
result = 'Success! Please click the confirmation link that will be emailed to you shortly.';
} else { // error
result = 'Error: ' + message.detail;
}
$('#message').html(result); // display the message
}
});
return false;
});
});
</script>
</body>
</html>
subscribe.php
<?php // for MailChimp API v3.0
include('MailChimp.php'); // path to API wrapper downloaded from GitHub
use \DrewM\MailChimp\MailChimp;
function storeAddress() {
$key = "mymailchimpAPIkey-us17";
$list_id = "mymailchimplistid";
$merge_vars = array(
'FNAME' => $_POST['fname'],
'LNAME' => $_POST['lname']
);
$mc = new MailChimp($key);
// add the email to your list
$result = $mc->post('/lists/'.$list_id.'/members', array(
'email_address' => $_POST['email'],
'merge_fields' => $merge_vars,
'status' => 'pending' // double opt-in
// 'status' => 'subscribed' // single opt-in
)
);
return json_encode($result);
}
// If being called via ajax, run the function, else fail
if ($_POST['ajax']) {
echo storeAddress(); // send the response back through Ajax
} else {
echo 'Method not allowed - please ensure JavaScript is enabled in this browser';
}
Если я отредактирую subscribe.php на:
// add the email to your list
$result = $mc->post('/lists/'.$list_id.'/members', array(
'email_address' => $_POST['email'],
'merge_fields' => $merge_vars,
//'status' => 'pending' // double opt-in
'status' => 'subscribed' // single opt-in
)
);
Я получаю следующее сообщение:
«Ошибка: [email protected] уже является членом списка. Используйте PUT, чтобы вставить или обновить членов списка».






Похоже, что подписчик, которого вы пытаетесь использовать для POST, уже является членом списка (вероятно, в состоянии в ожидании). Возможно, из более раннего POST, где 'status' => 'pending'. В этих случаях вам нужно будет сделать запрос PUT или PATCH, чтобы обновить контакт, который уже находится в MailChimp. Это связано с тем, что запросы POST предназначены только для добавления новой записи. Документацию по запросу PUT к конечной точке списка участников можно найти здесь:
Похоже, вы используете drewm/mailchimp-api. Я не очень хорошо знаком с этой библиотекой, но похоже, что вы можете просто вызвать $mc->patch(...) или $mc->put(...).
Если вы сделаете запросы PUT, MailChimp обновит запись для адреса электронной почты, если он уже существует, и создаст его, если это не так. Похоже, вам следует просто придерживаться запросов PUT для желаемого поведения, которое вы описали выше.