如何在 MailChimp API 3 中更新现有订阅者的段和组
Posted
技术标签:
【中文标题】如何在 MailChimp API 3 中更新现有订阅者的段和组【英文标题】:How to update segments and groups of an existing subscriber in MailChimp API 3 【发布时间】:2017-06-22 04:19:03 【问题描述】:我写了一个方法让用户订阅 MailChimp。它的“特别”之处在于,它会根据用户的购物车项目、愿望清单项目以及他订阅的项目和/或类别自动为用户订阅列表中的组和列表中的细分。
与 MailChimp 的集成非常简单 - 我获取数据 > 发送 curl > 获取响应 > 处理响应。
我正在寻找一种方法来根据用户在我的商店中的操作不断更新用户的组和细分。
现在,MailChimp 可以获取的唯一可接受的状态是“订阅”、“待定”和“干净”。他们都没有更新,只是插入新的订阅者。如果电子邮件已被订阅,则不会更新任何内容,甚至不会更新与订阅者在我的 MailChimp 列表中的个人资料中的数据不同的数据。
这是我的参考代码:
protected static function subscribeToMailchimp($email, $fullname)
$params = EkerbaseJoomla::getPluginParams('system', 'ekerbaseusers');
$interests = self::getUserInterestsObject();
$apikey = $params->mailChimpApiKey;
$listId = $params->mailChimpListId;
$interestCategoryId = $params->mailChimpInterestCategoryId;
$auth = base64_encode( 'user:' . $apikey );
$apiUrl = 'https://'.substr($params->mailChimpApiKey, -3).'.api.mailchimp.com/3.0/lists/'.$listId;
$possibleGroups = json_decode(file_get_contents($apiUrl . '/interest-categories/' . $interestCategoryId . '/interests?apikey=' . $apikey))->interests;
$segments = json_decode(file_get_contents($apiUrl . '/segments?apikey=' . $apikey))->segments;
$data = [
'apikey' => $apikey,
'email_address' => $email,
'status' => 'subscribed',
'merge_fields' =>
[
'FNAME' => $fullname
]
];
if( ! empty($interests->categories) )
$data['interests'] = [];
foreach( $possibleGroups as $group )
if( in_array($group->name, $interests->categories) )
$data['interests'][$group->id] = true;
if( ! empty($interests->items) )
$data['segments'] = [];
foreach( $segments as $segment )
if( in_array($segment->name, $interests->items) )
$data['segments'][$segment->id] = true;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl . '/members/');
curl_setopt($ch, CURLOPT_HTTPHEADER,
[
'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_encode($data));
$result = curl_exec($ch);
$response = json_decode($result);
switch( $response->status )
case 'subscribed':
$responseMessage = JText::_('EKERBASE_SUCCESS_NEWSLETTER');
$responseStatus = 'success';
$responseResult = 'mailchimp subscribing succeeded';
break;
default:
$responseStatus = 'error';
$responseMessage = $response->title;
$responseResult = 'mailchimp subscribing failed';
if( $response->title === 'Member Exists' )
$responseMessage = JText::_('EKERBASE_NEWSLETTER_ALREADY_SUBSCRIBER');
break;
return EkerbaseAjax::buildJsonResponse($responseMessage, $responseStatus, $responseResult);
【问题讨论】:
【参考方案1】:如果您的集成按预期添加了全新的订阅者,并且该问题似乎与方法正在更新现有订阅者记录的情况无关,则该问题可能与 HTTP 方法和/或 api 端点有关。
由于 MailChimp 的 API 的 v3 只允许在使用 POST 方法时初始化订阅者(看起来它可能在这里被硬编码到 cURL 中),这可能是为什么会毫无问题地添加全新的订阅者。
这就是说,当想要使用 PUT 添加或更新新订阅者时,建议使用 PUT,并在他们的文档中指定。
Add or update a list member more on http methods and their API此外,除了使用这种替代方法外,为确保现有订阅者得到更新,您还需要将其电子邮件的小写版本的 MD5 哈希附加到端点。 这只需要对现有的订阅者进行。
例如/members/lowercase_email_MD5_hash
如果您首先使用 MailChimp 检查订阅者是否存在,如果您想回收它,则应在响应中提供。
【讨论】:
很棒的伙伴,它完全按照你的解释工作。感谢您的帮助:) 很高兴听到这个@ShirEkerling :-) 很高兴。我该怎么做? :] 大声笑,其实我也不知道:/以上是关于如何在 MailChimp API 3 中更新现有订阅者的段和组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用他们的 api 3.0 创建/更新大量电子邮件到 Mailchimp 列表?
如何使用 Gibbon gem 编辑 mailchimp 列表中现有成员的电子邮件地址
Mailchimp 如何在 javascript 中调用 mailchimp 3.0 API