2015-05-29 12 views
5

Mam poniższy kod, który dodaje użytkownika do wcześniej istniejącej listy w Mailchimp.Aktualizowanie subskrybentów na liście przy użyciu cURL i Mailchimp API v3

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

Ten kod dodaje tylko użytkownikom z listy i gdy próbuję dodać szczegóły tego samego użytkownika dwukrotnie rzuca następujący błąd przy drugiej próbie:

[email protected] is already a list member. Use PATCH to update existing members.

Jak mogę iść o używaniu PATCH, aby zaktualizować dane użytkownika? Nie jestem pewien, gdzie to określić.

Odpowiedz

5

Wyobraziłem sobie, gdzie idę źle. Gdy użytkownik jest początkowo dodany do listy, odpowiedź dostarcza identyfikator. Potrzebuję przechowywać ID w mojej bazie danych z danymi tej osoby i odnosić się do identyfikatora w adresie URL, do którego dzwonię, kiedy chcę zaktualizować dane użytkownika na liście Mailchimp.

https://us2.api.mailchimp.com/3.0/lists/<list_id_goes_here>/members/<members_id_goes_here> 

Dzięki @TooMuchPete za prawidłowe polecenie zwijania.

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH"); 
+4

Należy zauważyć, że "identyfikator subskrybenta" jest tak naprawdę hash MD5 ich adres e-mail. – TooMuchPete

+0

Dobrze wiedzieć. Dzięki. – VenomRush

+1

Dla każdego, kto szuka sposobu aktualizacji wiadomości e-mail istniejącego subskrybenta - nie możesz tego zrobić (musisz usunąć stary e-mail, a następnie dodać nowy jako nowego subskrybenta). Nie można zmienić informacji oznaczonych jako "tylko do odczytu" w schemacie tutaj: https://us9.api.mailchimp.com/schema/3.0/Lists/Members/Instance.json –

3

Szukasz the CURLOPT_CUSTOMREQUEST option in cURL.

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH"); 

Ale ponieważ teraz jest to twoje drugie pytanie w tak wielu dni pytaniem, jak używać wbudowanej biblioteki curl, być może warto pomocą czegoś trochę lepszego. Jeśli używasz PHP w wersji 5.4 lub wyższej, polecam Guzzle. PHP Requests jest również bardzo dobry i działa z PHP 5.3.

+0

To nie działa. Pojawia się następujący błąd: "type": "http://kb.mailchimp.com/api/error-docs/405-method-not-allowed", "title": "Method Not Allowed", "status" : 405, "detail": "Żądana metoda i zasób nie są kompatybilne. Zobacz nagłówek Zezwalaj dla dostępnych metod tego zasobu." Link na stronie podanego adresu URL prowadzi do strony 403, która niewiele mi pomaga. – VenomRush

+0

Dzięki za te sugestie. Będę o nich pamiętać w przyszłych projektach. Ramy, w których powstała ta witryna, są dość stare i myślę, że spędziłbym więcej czasu na zastanawianiu się, jak zintegrować Guzzle, niż jest to warte. – VenomRush

+0

Komentarz nie powiódł się, adres URL w moim oryginalnym komentarzu to http://kb.mailchimp.com/api/error-docs/405-method-not-allowed – VenomRush

0

Wypróbuj tę. To działa dla mnie. Używam tej funkcji. Mam nadzieję, że powinien rozwiązać twój problem.

<?php 
/** 
* Created by PhpStorm. 
* User: Faisal 
* Website: www.faisal-ibrahim.info 
* Date: 2/12/2016 
* Time: 10:07 AM 
*/ 
if (isset($_POST['email'])) { 
    $email = $_POST['email']; 
} else { 
    $email = '[email protected]'; 
} 

$data    = [ 
    'email'  => $email, 
    'status' => 'subscribed', 
    'firstname' => 'Faisal', 
    'lastname' => 'Ibrahim' 
]; 
$api_response_code = listSubscribe($data); 
echo $api_response_code; 

/** 
* Mailchimp API- List Subscribe added function.In this method we'll look how to add a single member to a list using the lists/subscribe method.Also, We will cover the different parameters for submitting a new member as well as passing in generic merge field information. 
* 
* @param array $data Subscribe information Passed. 
* 
* @return mixed 
*/ 
function listSubscribe(array $data) 
{ 
    $apiKey = "cf8a1fd222a500f27f9e042449867c7c-us15";//your API key goes here 
    $listId = "e8f3f5f880";// your trageted 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_CUSTOMREQUEST, "PATCH"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json); 

    $result = curl_exec($ch); 
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 

    return $httpCode; 
} 
Powiązane problemy