WooCommerce调用Mailchimp API查询订阅成员出现404错误求助
问题原因
- 当查询的邮箱不在Mailchimp列表中时,接口返回404状态,底层GuzzleHTTP会直接抛出
GuzzleHttp\Exception\ClientException异常,不会返回响应对象,你代码中的$response->status == 404判断逻辑永远无法执行。 - 你原有代码的catch块仅捕获
MailchimpMarketing\ApiException类型的异常,没有覆盖Guzzle抛出的客户端异常,因此异常未被处理直接触发PHP致命错误。 - 补充说明:请求成功时返回的
$response->status是订阅者的订阅状态(如subscribed/unsubscribed),不是HTTP状态码,原有逻辑中的状态判断完全错误。
修正后的代码
function getMemberInfo($email) { $mailchimp = new \MailchimpMarketing\ApiClient(); $mailchimp->setConfig([ 'apiKey' => $GLOBALS['mailchimpAPI'], 'server' => $GLOBALS['mailchimpServer'] ]); $list_id = $GLOBALS['mailchimpListID']; $subscriberHash = md5(strtolower($email)); try { $response = $mailchimp->lists->getListMember($list_id, $subscriberHash); // 请求成功说明用户存在,直接返回1 return 1; } catch (\MailchimpMarketing\ApiException $e) { echo $e->getMessage(); return 0; } catch (\GuzzleHttp\Exception\ClientException $e) { // 判断是否是404错误,是则说明用户不存在 if ($e->getResponse()->getStatusCode() == 404) { return 0; } // 其他客户端错误正常输出 echo $e->getMessage(); return 0; } }
更优实现方案
你可以直接使用Mailchimp提供的批量写入方法,无需提前查询用户是否存在,接口会自动判断:用户不存在则新增,存在则更新对应信息,减少一次API请求,示例逻辑如下:
function addOrUpdateMember($email,$fname,$lname) { $mailchimp = new \MailchimpMarketing\ApiClient(); $mailchimp->setConfig([ 'apiKey' => $GLOBALS['mailchimpAPI'], 'server' => $GLOBALS['mailchimpServer'] ]); $list_id = $GLOBALS['mailchimpListID']; $subscriberHash = md5(strtolower($email)); try { $response = $mailchimp->lists->setListMember($list_id, $subscriberHash, [ "email_address" => $email, "status_if_new" => "subscribed", "merge_fields" => [ "FNAME" => $fname, "LNAME" => $lname ] ]); } catch (\Exception $e) { echo $e->getMessage(); } }
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

