2015-05-27 4 views
43

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

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

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

UPDATE 1: Я сделал некоторые дополнительные исследования, основанные на TooMuchPete-х answer касаемо ссылку на Управление подписчиков и отредактированные некоторый код, который я нашел here, но это не будет работать, так как функция 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'); 

UPDATE 2: Я теперь прибегают к использованию локон и мне удалось получить что-то почти работает. Данные отправляются Mailchimp, но я получаю сообщение об ошибке «В ваш запрос не включен ключ API». Я предполагаю, что мне нужно пройти аутентификацию, как упомянуто here. Я попытался добавить его в заголовок 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'); 
+0

v2.0 все еще определенно работает. v1.3 тоже, на самом деле, но если вы ищете примеры API v3.0, я бы проверил это [GitHub repo] (https://github.com/mailchimp/APIv3-examples). Сейчас он имеет только Python, но этого может быть достаточно, чтобы вы указали в правильном направлении на своем языке. Также есть страница в документах по [управляющим абонентам] (http://kb.mailchimp.com/api/article/how-to-manage-subscribers), что является шагом от фактических примеров кода, но может все еще быть полезно. – TooMuchPete

+0

Спасибо @TooMuchPete. Я обновил свой вопрос с помощью образца кода. Я думаю, что медленно добираюсь туда. – VenomRush

+0

Я ищу примеры API v3.0 в python, которые являются не только базовыми запросами на получение. Примеры в том, что репо GitHub хромает, извините. –

ответ

84

Основываясь на List Members Instance docs, самый простой способ заключается в использовании PUT запроса, который в соответствии с Документами либо «добавляет новый элемент списка или обновляет элемент если почта уже существует в списке «.

Кроме того, apikey определенно не является частью json schema, и нет смысла включать его в ваш запрос 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; 
} 
+1

Спасибо за это @billynoah. Я просто принял свой собственный ответ, потому что это то, что мне удалось получить, и никто другой не представил рабочий пример. – VenomRush

+2

Ну, вы все равно можете использовать 'POST', но на другой конечной точке (без ID). В документах API: «Создайте новую запись либо с запросом POST в/lists/{list_id}/members, либо с запросом PUT в/lists/{list_id}/members/{id}.Удалите запись с запросом DELETE в/lists/{list_id}/members/{id} .' – Aborted

+0

Спасибо @Aborted, не заметил этого бита. Похоже, что они должны включать 'POST' в разделе« Доступные HTTP-глаголы »в начале этой страницы. Я попытался отправить сообщение с включенным идентификатором и получил сообщение об ошибке - теперь я знаю, почему. – billynoah

20

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

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

Прохладный! Вы также можете сделать auth следующим образом: 'url_setopt ($ ch, CURLOPT_USERPWD," user: ". $ Apikey);' – TooMuchPete

+0

Делает ли это base64_encode? Mailchimp требует, чтобы он был закодирован. – VenomRush

+0

MailChimp API v3.0 использует HTTP Basic Authentication, что и делает этот параметр cURLl. Base64 Кодирование - это всего лишь часть базовой аутентификации. – TooMuchPete

2

ПАРТИЯ НАГРУЗКА - КИ, так что после того, как мой предыдущий ответ делеции только с помощью ссылки я обновил с кодом мне удалось получить работу.Цените никому упрощать/исправить/уточнить/положить в функции и т.д., как я все еще учусь этот материал, но я получил список членов партии добавить работает :)

$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"); 
0

Если вы хотите запустить Batch Подписаться на Список с использованием 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 сути. GithubGist Link

Справочная документация: Official

4

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

В Mailchimp:

  1. Приобретать ваш API Key и List ID
  2. Убедитесь, что вы настроить ваш список и какие пользовательские поля, которые вы хотите использовать с ним. В этом случае я установил zipcode в качестве настраиваемого поля в списке ПЕРЕД вызовом API.
  3. Отметьте API docs о добавлении членов в списки. Мы используем метод 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-страницу с помощью обработчика .
  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'] и т. Д. Но вы можете назвать их, как хотите, - просто помните, что вы называете ключами части вашего JSON-передачи, как вы обращаетесь к ним на PHP.
  3. Это явно требует jQuery;)
+0

Здравствуйте, Mate, я последовал вашим примерам кода, и я не мог заставить его работать для моего проекта. Не возражаете, если мы свяжемся, чтобы получить помощь от вас? благодаря! –

+0

сделать сущность, и я проверю это. – staypuftman

Смежные вопросы