У меня есть этот код ниже, который добавляет пользователя в уже существующий список в Mailchimp.
$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');
Этот код только добавляет пользователей в список, и когда я пытаюсь добавить данные одного и того же пользователя дважды, он вызывает следующую ошибку при второй попытке:
test@user.com уже является членом списка. Используйте PATCH для обновления существующих участников.
Как я могу использовать PATCH для обновления данных пользователя? Я не знаю, где его указать.
Я понял, где я ошибаюсь. Когда пользователь изначально добавляется в список, ответ предоставляет идентификатор. Мне нужно сохранить идентификатор в моей базе данных с данными этого человека и указать идентификатор в URL-адресе, на который я звоню, когда я хочу обновить данные пользователя в списке Mailchimp.
https://us2.api.mailchimp.com/3.0/lists/<list_id_goes_here>/members/<members_id_goes_here>
Спасибо @TooMuchPete за правильную команду curl.
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
Вы ищете параметр CURLOPT_CUSTOMREQUEST
в cURL .
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
Но, так как это ваш второй вопрос в течение многих дней, когда вы спрашиваете, как использовать встроенную библиотеку cURL, возможно, стоит немного что-то улучшить. Если вы на PHP 5.4 или выше, я рекомендую Guzzle . PHP-запросы также очень хороши и работают с PHP 5.3.
Попробуй это. Это работает для меня. Я использую эту функцию. Надеюсь, он должен решить вашу проблему.
<?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 = 'faisal.im048@gmail.com'; } $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; }