2015-05-29 14 views
5

Tôi có mã này bên dưới để thêm người dùng vào danh sách có sẵn trong Mailchimp.Cập nhật người đăng ký trong danh sách bằng cách sử dụng cURL và API Mailchimp 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'); 

Mã này chỉ bổ sung thêm người dùng vào danh sách và khi tôi cố gắng thêm các chi tiết của cùng một người dùng hai lần nó ném các lỗi sau trên nỗ lực thứ hai:

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

Làm thế nào để đi về việc sử dụng PATCH để cập nhật chi tiết người dùng? Tôi không chắc phải xác định nó ở đâu.

Trả lời

5

Tôi đã tìm ra nơi tôi sẽ sai. Khi người dùng ban đầu được thêm vào danh sách, phản hồi sẽ cung cấp một ID. Tôi cần lưu trữ ID trong cơ sở dữ liệu của tôi với các chi tiết của người đó và tham chiếu ID trong url tôi đang thực hiện cuộc gọi đến khi tôi muốn cập nhật chi tiết của người dùng trong Danh sách Mailchimp.

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

Cảm ơn @TooMuchPete cho lệnh curl chính xác.

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

Lưu ý rằng "ID người đăng ký" thực sự chỉ là băm MD5 của địa chỉ email của họ. – TooMuchPete

+0

Điều cần biết. Cảm ơn. – VenomRush

+1

Đối với bất kỳ ai khác xem cách cập nhật email của người đăng ký hiện tại - bạn không thể thực hiện điều đó (bạn cần XÓA email cũ và sau đó thêm email mới làm người đăng ký mới). Bạn không thể thay đổi thông tin được đánh dấu là "chỉ đọc" trong lược đồ tại đây: https://us9.api.mailchimp.com/schema/3.0/Lists/Members/Instance.json –

3

Bạn đang tìm kiếm the CURLOPT_CUSTOMREQUEST option in cURL.

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

Tuy nhiên, vì đây là câu hỏi thứ hai của bạn trong nhiều ngày hỏi cách sử dụng thư viện cURL tích hợp, có thể đáng để sử dụng một chút tốt hơn. Nếu bạn đang sử dụng PHP 5.4 trở lên, tôi khuyên bạn nên Guzzle. Tuy nhiên, PHP Requests cũng rất tốt và hoạt động với PHP 5.3.

+0

Điều này dường như không hoạt động. Tôi nhận được lỗi sau: "loại": "http://kb.mailchimp.com/api/error-docs/405-method-not-allowed", "title": "Phương thức không được phép", "trạng thái" : 405, "detail": "Phương thức và tài nguyên được yêu cầu không tương thích. Hãy xem tiêu đề Allow cho các phương thức có sẵn của tài nguyên này." Liên kết trên trang của url được cung cấp dẫn đến trang 403 không giúp ích nhiều cho tôi. – VenomRush

+0

Ngoài ra, cảm ơn những gợi ý đó. Tôi sẽ ghi nhớ chúng cho các dự án trong tương lai. Khuôn khổ trang web này được phát triển khá cũ và tôi nghĩ rằng tôi sẽ dành nhiều thời gian hơn để tìm cách tích hợp Guzzle hơn là giá trị của nó. – VenomRush

+0

Nhận xét không thành công, url trong nhận xét ban đầu của tôi là http://kb.mailchimp.com/api/error-docs/405-method-not-allowed – VenomRush

0

Hãy thử cái này. Nó làm việc cho tôi. Tôi đang sử dụng chức năng này. Hy vọng nó sẽ được giải quyết vấn đề của bạn.

<?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; 
} 
Các vấn đề liên quan