使用cURL更新Mailchimp联系人时{subscriber_hash}获取及400报错问题
问题根源
你请求报错的核心原因是URL路径中的{subscriber_hash}没有替换为实际有效值,你直接把字面量字符串{subscriber_hash}拼接到了请求地址中,导致Mailchimp无法匹配到正确的单成员操作端点,服务端误将请求判定为新增成员操作,检测到邮箱已存在后返回了400错误。
subscriber_hash的获取方式
这个参数不需要提前调用接口查询,按照Mailchimp的约定规则本地即可生成:
- 先将目标联系人的邮箱地址全部转换为小写格式
- 对小写后的邮箱字符串做MD5哈希计算,得到的32位字符串就是需要的subscriber_hash
PHP中可以直接用内置函数生成:$subscriber_hash = md5(strtolower($email));
修正后的完整代码
$list_id = '[LISTID]'; $authToken = '[APIKEY]'; $email = "example@example.com"; // 生成正确的subscriber_hash $subscriber_hash = md5(strtolower($email)); $postData = array( "email_address" => $email, "status" => "subscribed" ); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://us12.api.mailchimp.com/3.0/lists/'.$list_id.'/members/'.$subscriber_hash, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_POSTFIELDS => json_encode($postData), CURLOPT_HTTPHEADER => array( 'Authorization: apikey '.$authToken, "cache-control: no-cache", "content-type: application/json" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; }
注意事项
- 计算哈希前必须把邮箱转为全小写,哪怕原始邮箱包含大写字符,大小写不一致会导致哈希值不匹配,最终触发404成员不存在的错误
- 该哈希生成规则是Mailchimp公开约定的固定规则,不存在版本差异,所有涉及单成员操作的接口(查询、更新、删除)都使用这个值作为路径参数
内容的提问来源于stack exchange,提问作者David Xoma
相关产品推荐
相关产品推荐

