skingman
skingman

Reputation: 48

MailChimp API v3 - Unable to PATCH/ Update?

I am trying to simply add/ remove (well subscribe/ unsubscribe rather than delete) email addresses upon sign up of my website to a MailChimp list using the API. When the user is approved on my site, the email address is added via API successfully if the correct checkbox is ticked. However I can not for the life of me get unsubscribe to work. I think I'm having issues with the PATCH method. The code doesn't error, however the user status in the list does not change to unsubscribed and if I echo out the API call I simply get the following:

{"id":"EMAIL_HASH","email_address":"EMAIL_UNHASHED","unique_email_id":"3dae8dd13a","email_type":"html","status":"subscribed","merge_fields":{"FNAME":"","LNAME":"","MMERGE3":"","MMERGE4":"","MMERGE5":"","MMERGE6":"","MMERGE7":"","MMERGE8":"","MMERGE9":"","MMERGE10":""},"interests":{"edf7fefb79":false},"stats":{"avg_open_rate":0,"avg_click_rate":0},"ip_signup":"","timestamp_signup":"","ip_opt":"77.68.14.17","timestamp_opt":"2018-11-23T14:02:27+00:00","member_rating":2,"last_changed":"2018-11-23T14:02:27+00:00","language":"","vip":false,"email_client":"","location":{"latitude":0,"longitude":0,"gmtoff":0,"dstoff":0,"country_code":"","timezone":""},"tags_count":0,"tags":[],"list_id":"LIST_ID","_links":[{"rel":"self","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH","method":"GET","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/Response.json"},{"rel":"parent","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members","method":"GET","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/CollectionResponse.json","schema":"https://us6.api.mailchimp.com/schema/3.0/CollectionLinks/Lists/Members.json"},{"rel":"update","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH","method":"PATCH","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/Response.json","schema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/PATCH.json"},{"rel":"upsert","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH","method":"PUT","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/Response.json","schema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/PUT.json"},{"rel":"delete","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH","method":"DELETE"},{"rel":"activity","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH/activity","method":"GET","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/Activity/Response.json"},{"rel":"goals","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH/goals","method":"GET","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/Goals/Response.json"},{"rel":"notes","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH/notes","method":"GET","targetSchema":"https://us6.api.mailchimp.com/schema/3.0/Definitions/Lists/Members/Notes/CollectionResponse.json"},{"rel":"delete_permanent","href":"https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/EMAIL_HASH/actions/delete-permanent","method":"POST"}]}

which seems more like a dump of possible actions, rather than a response to my call. Needless to say LIST_ID and EMAIL_HASH are accurate and not in the final code.

curl options are as follows, am I possibly missing something require to patch but not POST?

$curl = curl_init();

switch ($method)
{
    case "POST":
        curl_setopt($curl, CURLOPT_POST, 1);

        if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        break;
    case "PUT":
        curl_setopt($curl, CURLOPT_PUT, 1);
        break;
    case "PATCH":
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH");
        break;
    default:
        if ($data)
            $url = sprintf("%s?%s", $url, http_build_query($data));
}
curl_setopt($curl, CURLOPT_USERPWD, "user:API_KEY");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);

Any help would be appreciated as extensive googling has not returned this problem, predominantly it's people trying to re-add deleted subscribers which this obviously isn't.

$url = 'https://us6.api.mailchimp.com/3.0/lists/LIST_ID/members/'.md5(strtolower($email));

$api_data = array(
    'status'        =>  'unsubscribed'
);

$api_data = json_encode($api_data);

$test_call = CallAPI("PATCH","$url",$api_data);

The PHP using the custom function to call the API. I think I've included the relevant curl info from inside the function but if not please just let me know.

Upvotes: 1

Views: 1766

Answers (1)

Eaten by a Grue
Eaten by a Grue

Reputation: 22931

Your function doesn't set any data for a PATCH request. You need to set CURLOPT_POSTFIELDS same as with a POST request:

case "PATCH":
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH");
    if ($data){
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    break;

Incidentally, the same should be done for a PUT request or any other request type where you need to pass data parameters. You may also want to take a look at my answer here for a function that can both create and update list members.

Upvotes: 1

Related Questions