使用 cURL 和 Mailchimp API v3 更新列表中的订阅者

Posted

技术标签:

【中文标题】使用 cURL 和 Mailchimp API v3 更新列表中的订阅者【英文标题】:Updating subscribers in a list using cURL and Mailchimp API v3 【发布时间】:2015-08-12 10:49:38 【问题描述】:

下面的代码可以将用户添加到 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 更新用户详细信息?我不确定在哪里指定它。

【问题讨论】:

【参考方案1】:

我知道我哪里出错了。当用户最初被添加到列表中时,响应会提供一个 ID。我需要将 ID 与这些人的详细信息一起存储在我的数据库中,并在我想在 Mailchimp 列表中更新用户详细信息时引用我正在调用的 URL 中的 ID。

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

【讨论】:

请注意,“订阅者 ID”实际上只是他们电子邮件地址的 MD5 哈希值。 很高兴知道。谢谢。 对于其他正在寻找如何更新现有订阅者电子邮件的人 - 您不能这样做(您需要删除旧电子邮件,然后将新电子邮件添加为新订阅者)。您无法在此处更改架构中标记为“只读”的信息:us9.api.mailchimp.com/schema/3.0/Lists/Members/Instance.json 另请注意,订阅者 ID 是使用 MD5 散列的 小写 电子邮件地址。在 PHP 中,这意味着您必须执行 md5(strtolower($email))。这是MailChimp documentation link。【参考方案2】:

您正在寻找the CURLOPT_CUSTOMREQUEST option in cURL。

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

但是,由于这是您在这么多天来询问如何使用内置 cURL 库的第二个问题,因此可能值得使用更好的东西。如果您使用的是 PHP 5.4 或更高版本,我推荐 Guzzle。不过,PHP Requests 也非常好,并且适用于 PHP 5.3。

【讨论】:

这似乎不起作用。我收到以下错误:“type”:“kb.mailchimp.com/api/error-docs/405-method-not-allowed”,“title”:“Method Not Allowed”,“status”:405,“detail”:“请求的方法和资源不兼容。请参阅 Allow 标头对于此资源的可用方法。”提供的 url 页面上的链接会导致 403 页面,这对我没有多大帮助。 另外,感谢您的建议。我会在未来的项目中记住它们。这个网站的框架已经很老了,我想我会花更多的时间来弄清楚如何集成 Guzzle。 评论失败,我原来评论的url是kb.mailchimp.com/api/error-docs/405-method-not-allowed【参考方案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;

【讨论】:

你有没有注意到你设置了PUT然后在执行之前被PATCH覆盖了?复制粘贴不好? 您是否需要在决定回复之前查看我的linkedin?

以上是关于使用 cURL 和 Mailchimp API v3 更新列表中的订阅者的主要内容,如果未能解决你的问题,请参考以下文章

使用 curl 从 mailchimp 获取数据我在哪里将 api 密钥放在 curl 调用中

仅限于通过 R 和 cURL 使用 Mailchimp API v3 提取详细信息(如电子邮件活动)?

Mailchimp v3.0 API,使用 Perl Curl

通过 Curl (Mailchimp API) 发布 PHP 会话

如何使用Curl将这个mailchimp API请求转换为使用PHP的Guzzle?

MailChimp API 在 V3.0 PHP Curl 中响应 404