setApiKey($api_key); } } /** * @param $key * @return $this */ public function setApiKey($key) { $parts = str_getcsv($key, '-'); if (count($parts) == 2) { $this->data_center = $parts[1]; } $this->api_key = $parts[0]; return $this; } /** * @param $dc * @return $this */ public function setDataCenter($dc) { $this->data_center = $dc; return $this; } /** * @param $version * @return $this */ public function setVersion($version) { $this->version = $version; return $this; } /** * @param bool $return_profile * @return array|bool */ public function ping($return_profile = false) { try { $profile = $this->get('/'); return $return_profile ? $profile : true; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @return array */ public function getProfile() { return $this->get('/'); } /** * @return array|bool */ public function getAuthorizedApps() { return $this->get('authorized-apps'); } /** * @return array|bool */ public function getAuthorizedAppDetails($id) { return $this->get("authorized-apps/$id"); } /** * Returns an array of ['access_token' => '', 'viewer_token' => ''] * * @param $client_id * @param $client_secret * @return array|bool */ public function linkAuthorizedApp($client_id, $client_secret) { return $this->post('authorized-apps', array('client_id' => $client_id, 'client_secret' => $client_secret)); } /** * @param $list_id * @param $email * @return array|bool */ public function member($list_id, $email) { $hash = md5(strtolower(trim($email))); return $this->get("lists/$list_id/members/$hash", array()); } /** * @param $list_id * @return array|bool */ public function members($list_id) { return $this->get("lists/$list_id/members"); } /** * @param $list_id * @param $email * @return array|bool */ public function deleteMember($list_id, $email) { $hash = md5(strtolower(trim($email))); return $this->delete("lists/$list_id/members/$hash", array()); } /** * @param $list_id * @param $email * @param bool $subscribed * @param array $merge_fields * @param array $list_interests * @return array|bool */ public function subscribe($list_id, $email, $subscribed = true, $merge_fields = array(), $list_interests = array()) { $data = array( 'email_type' => 'html', 'email_address' => $email, 'status' => ($subscribed === true ? 'subscribed' : 'pending'), 'merge_fields' => $merge_fields, 'interests' => $list_interests, ); if (empty($data['merge_fields'])) { unset($data['merge_fields']); } if (empty($data['interests'])) { unset($data['interests']); } return $this->post("lists/$list_id/members", $data); } /** * @param $list_id * @param $email * @param bool $subscribed * @param array $merge_fields * @param array $list_interests * @return array|bool */ public function update($list_id, $email, $subscribed = true, $merge_fields = array(), $list_interests = array()) { $hash = md5(strtolower(trim($email))); $data = array( 'email_address' => $email, 'status' => ($subscribed === null ? 'cleaned' : ($subscribed === true ? 'subscribed' : 'unsubscribed')), 'merge_fields' => $merge_fields, 'interests' => $list_interests, ); if (empty($data['merge_fields'])) { unset($data['merge_fields']); } if (empty($data['interests'])) { unset($data['interests']); } return $this->patch("lists/$list_id/members/$hash", $data); } /** * @param $list_id * @param $email * @param bool $subscribed * @param array $merge_fields * @param array $list_interests * @return array|bool */ public function updateOrCreate($list_id, $email, $subscribed = true, $merge_fields = array(), $list_interests = array()) { $hash = md5(strtolower(trim($email))); $data = array( 'email_address' => $email, 'status' => ($subscribed === null ? 'cleaned' : ($subscribed === true ? 'subscribed' : 'unsubscribed')), 'status_if_new' => ($subscribed === true ? 'subscribed' : 'pending'), 'merge_fields' => $merge_fields, 'interests' => $list_interests, ); if (empty($data['merge_fields'])) { unset($data['merge_fields']); } if (empty($data['interests'])) { unset($data['interests']); } return $this->put("lists/$list_id/members/$hash", $data); } /** * @param MailChimp_WooCommerce_CreateListSubmission $submission * @return array|bool */ public function createList(MailChimp_WooCommerce_CreateListSubmission $submission) { return $this->post('lists', $submission->getSubmission()); } /** * @param bool $as_list * @param int $count * @return array|mixed */ public function getLists($as_list = false, $count = 100) { $result = $this->get('lists', array('count' => $count)); if ($as_list) { $lists = array(); if ($result) { $result = (object)$result; if (isset($result->lists) && is_array($result->lists)) { foreach ($result->lists as $list) { $list = (object)$list; $lists[$list->id] = $list->name; } } } return $lists; } return $result; } /** * @param $id * @return bool */ public function hasList($id) { try { return (bool) $this->getList($id); } catch (\Exception $e) { return false; } } /** * @param $id * @return mixed */ public function getList($id) { return $this->get('lists/' . $id); } /** * @param $id * @return array|bool */ public function deleteList($id) { return $this->delete('lists/'.$id); } /** * @return array|mixed */ public function getListsWithMergeFields() { $lists = $this->getLists(true); foreach ($lists as $id => $name) { $lists[$id] = $this->mergeFields($id, 100); } return $lists; } /** * @param $list_id * @param int $count * @return array|bool */ public function mergeFields($list_id, $count = 10) { $result = $this->get("lists/$list_id/merge-fields", array('count' => $count,)); return $result; } /** * @param $list_id * @return array|bool */ public function getInterestGroups($list_id) { if (empty($list_id)) { return array(); } $result = $this->get("lists/$list_id/interest-categories"); return $result; } /** * @param $list_id * @param $group_id * @return array|bool */ public function getInterestGroupOptions($list_id, $group_id) { if (empty($list_id) || empty($group_id)) { return array(); } $result = $this->get("lists/$list_id/interest-categories/$group_id/interests"); return $result; } /** * @param $store_id * @param int $page * @param int $count * @param DateTime|null $since * @param null $campaign_id * @return array|bool */ public function orders($store_id, $page = 1, $count = 10, \DateTime $since = null, $campaign_id = null) { $result = $this->get('ecommerce/stores/'.$store_id.'/orders', array( 'start' => $page, 'count' => $count, 'offset' => ($page * $count), 'since' => ($since ? $since->format('Y-m-d H:i:s') : null), 'cid' => $campaign_id, )); return $result; } /** * @param $store_id * @return MailChimp_WooCommerce_Store|bool */ public function getStore($store_id) { try { $data = $this->get("ecommerce/stores/$store_id"); if (!isset($data['id']) || !isset($data['name'])) { return false; } $store = new MailChimp_WooCommerce_Store(); return $store->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @return array|bool */ public function checkConnectedSite($store_id) { try { return $this->get("connected-sites/{$store_id}"); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @return array|bool */ public function connectSite($store_id) { try { return $this->post("connected-sites/{$store_id}/actions/verify-script-installation", array()); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @return array|bool */ public function stores() { try { $data = $this->get("ecommerce/stores", array('count' => 50)); if (!isset($data['stores']) || empty($data['stores'])) { return array(); } $response = array(); foreach ($data['stores'] as $store_data) { $store = new MailChimp_WooCommerce_Store(); $response[] = $store->fromArray($store_data); } return $response; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param $is_syncing * @return array|bool|mixed|null|object */ public function flagStoreSync($store_id, $is_syncing) { try { // pull the store to make sure we have one. if (!($store = $this->getStore($store_id))) { return false; } // flag it as ^^^ is_syncing ^^^ $store->flagSyncing($is_syncing); // patch the store data return $this->patch("ecommerce/stores/{$store_id}", $store->toArray()); } catch (\Exception $e) { mailchimp_log('flag.store_sync', $e->getMessage(). ' :: in '.$e->getFile().' :: on '.$e->getLine()); } return false; } /** * @param MailChimp_WooCommerce_Store $store * @param bool $silent * @return bool|MailChimp_WooCommerce_Store * @throws Exception */ public function addStore(MailChimp_WooCommerce_Store $store, $silent = true) { try { $this->validateStoreSubmission($store); $data = $this->post("ecommerce/stores", $store->toArray()); $store = new MailChimp_WooCommerce_Store(); return $store->fromArray($data); } catch (\Exception $e) { if (!$silent) throw $e; return false; } } /** * @param MailChimp_WooCommerce_Store $store * @param bool $silent * @return bool|MailChimp_WooCommerce_Store * @throws Exception */ public function updateStore(MailChimp_WooCommerce_Store $store, $silent = true) { try { $this->validateStoreSubmission($store); $data = $this->patch("ecommerce/stores/{$store->getId()}", $store->toArray()); $store = new MailChimp_WooCommerce_Store(); return $store->fromArray($data); } catch (\Exception $e) { if (!$silent) throw $e; return false; } } /** * @param $store_id * @return bool */ public function deleteStore($store_id) { try { $this->delete("ecommerce/stores/$store_id"); return true; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param string $customer_id * @return MailChimp_WooCommerce_Customer|bool */ public function getCustomer($store_id, $customer_id) { try { $data = $this->get("ecommerce/stores/$store_id/customers/$customer_id"); $customer = new MailChimp_WooCommerce_Customer(); return $customer->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param MailChimp_WooCommerce_Customer $store * @return MailChimp_WooCommerce_Customer * @throws MailChimp_WooCommerce_Error */ public function addCustomer(MailChimp_WooCommerce_Customer $store) { $this->validateStoreSubmission($store); $data = $this->post("ecommerce/stores", $store->toArray()); $customer = new MailChimp_WooCommerce_Customer(); return $customer->fromArray($data); } /** * @param $store_id * @param int $page * @param int $count * @return array|bool */ public function carts($store_id, $page = 1, $count = 10) { $result = $this->get('ecommerce/stores/'.$store_id.'/carts', array( 'start' => $page, 'count' => $count, 'offset' => ($page * $count), )); return $result; } /** * @param $store_id * @param MailChimp_WooCommerce_Cart $cart * @param bool $silent * @return bool|MailChimp_WooCommerce_Cart * @throws MailChimp_WooCommerce_Error */ public function addCart($store_id, MailChimp_WooCommerce_Cart $cart, $silent = true) { try { $data = $this->post("ecommerce/stores/$store_id/carts", $cart->toArray()); $cart = new MailChimp_WooCommerce_Cart(); return $cart->setStoreID($store_id)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if (!$silent) throw $e; mailchimp_log('api.addCart', $e->getMessage()); return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_Cart $cart * @param bool $silent * @return bool|MailChimp_WooCommerce_Cart * @throws MailChimp_WooCommerce_Error */ public function updateCart($store_id, MailChimp_WooCommerce_Cart $cart, $silent = true) { try { $data = $this->patch("ecommerce/stores/$store_id/carts/{$cart->getId()}", $cart->toArrayForUpdate()); $cart = new MailChimp_WooCommerce_Cart(); return $cart->setStoreID($store_id)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if (!$silent) throw $e; mailchimp_log('api.updateCart', $e->getMessage()); return false; } } /** * @param $store_id * @param $id * @return bool|MailChimp_WooCommerce_Cart */ public function getCart($store_id, $id) { try { $data = $this->get("ecommerce/stores/$store_id/carts/$id"); $cart = new MailChimp_WooCommerce_Cart(); return $cart->setStoreID($store_id)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param $id * @return bool */ public function deleteCartByID($store_id, $id) { try { $this->delete("ecommerce/stores/$store_id/carts/$id"); return true; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_Customer $customer * @param bool $silent * @return bool|MailChimp_WooCommerce_Customer * @throws MailChimp_WooCommerce_Error */ public function updateCustomer($store_id, MailChimp_WooCommerce_Customer $customer, $silent = true) { try { $this->validateStoreSubmission($customer); $data = $this->patch("ecommerce/stores/$store_id/customers/{$customer->getId()}", $customer->toArray()); $customer = new MailChimp_WooCommerce_Customer(); return $customer->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if (!$silent) throw $e; return false; } } /** * @param $store_id * @param $customer_id * @return bool */ public function deleteCustomer($store_id, $customer_id) { try { $this->delete("ecommerce/stores/$store_id/customers/$customer_id"); return true; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_Order $order * @param bool $silent * @return bool|MailChimp_WooCommerce_Order * @throws Exception */ public function addStoreOrder($store_id, MailChimp_WooCommerce_Order $order, $silent = true) { try { if (!$this->validateStoreSubmission($order)) { return false; } // submit the first one $data = $this->post("ecommerce/stores/$store_id/orders", $order->toArray()); // if the order is in pending status, we need to submit the order again with a paid status. if ($order->shouldConfirmAndPay() && $order->getFinancialStatus() !== 'paid') { $order->setFinancialStatus('paid'); $data = $this->patch("ecommerce/stores/{$store_id}/orders/{$order->getId()}", $order->toArray()); } update_option('mailchimp-woocommerce-resource-last-updated', time()); $order = new MailChimp_WooCommerce_Order(); return $order->fromArray($data); } catch (\Exception $e) { if (!$silent) throw $e; mailchimp_log('api.add_order.error', $e->getMessage(), array('submission' => $order->toArray())); return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_Order $order * @param bool $silent * @return bool|MailChimp_WooCommerce_Order * @throws Exception */ public function updateStoreOrder($store_id, MailChimp_WooCommerce_Order $order, $silent = true) { try { if (!$this->validateStoreSubmission($order)) { return false; } $id = $order->getId(); $data = $this->patch("ecommerce/stores/{$store_id}/orders/{$id}", $order->toArray()); // if the order is in pending status, we need to submit the order again with a paid status. if ($order->shouldConfirmAndPay() && $order->getFinancialStatus() !== 'paid') { $order->setFinancialStatus('paid'); $data = $this->patch("ecommerce/stores/{$store_id}/orders/{$id}", $order->toArray()); } $order = new MailChimp_WooCommerce_Order(); return $order->fromArray($data); } catch (\Exception $e) { if (!$silent) throw $e; mailchimp_log('api.update_order.error', $e->getMessage(), array('submission' => $order->toArray())); return false; } } /** * @param $store_id * @param $order_id * @return MailChimp_WooCommerce_Order|bool */ public function getStoreOrder($store_id, $order_id) { try { $data = $this->get("ecommerce/stores/$store_id/orders/$order_id"); $order = new MailChimp_WooCommerce_Order(); return $order->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param $order_id * @return bool */ public function deleteStoreOrder($store_id, $order_id) { try { $this->delete("ecommerce/stores/$store_id/orders/$order_id"); return true; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param $product_id * @return MailChimp_WooCommerce_Product|bool */ public function getStoreProduct($store_id, $product_id) { try { $data = $this->get("ecommerce/stores/$store_id/products/$product_id"); $product = new MailChimp_WooCommerce_Product(); return $product->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param int $page * @param int $count * @return array|bool */ public function products($store_id, $page = 1, $count = 10) { $result = $this->get('ecommerce/stores/'.$store_id.'/products', array( 'start' => $page, 'count' => $count, 'offset' => ($page * $count), )); return $result; } /** * @param $store_id * @param MailChimp_WooCommerce_Product $product * @param bool $silent * @return bool|MailChimp_WooCommerce_Product * @throws Exception */ public function addStoreProduct($store_id, MailChimp_WooCommerce_Product $product, $silent = true) { try { $this->validateStoreSubmission($product); $data = $this->post("ecommerce/stores/$store_id/products", $product->toArray()); update_option('mailchimp-woocommerce-resource-last-updated', time()); $product = new MailChimp_WooCommerce_Product(); return $product->fromArray($data); } catch (\Exception $e) { if (!$silent) throw $e; mailchimp_log('api.add_product.error', $e->getMessage(), array('submission' => $product->toArray())); return false; } } /** * @param $store_id * @param $product_id * @return bool */ public function deleteStoreProduct($store_id, $product_id) { try { $this->delete("ecommerce/stores/$store_id/products/$product_id"); return true; } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_PromoRule $rule * @param bool $throw * @return MailChimp_WooCommerce_PromoRule|bool * @throws MailChimp_WooCommerce_Error */ public function addPromoRule($store_id, MailChimp_WooCommerce_PromoRule $rule, $throw = true) { try { if (($response = $this->updatePromoRule($store_id, $rule, false))) { return $response; } $data = $this->post("ecommerce/stores/{$store_id}/promo-rules", $rule->toArray()); return (new MailChimp_WooCommerce_PromoRule)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if ($throw) throw $e; return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_PromoRule $rule * @param bool $throw * @return MailChimp_WooCommerce_PromoRule|bool * @throws MailChimp_WooCommerce_Error */ public function updatePromoRule($store_id, MailChimp_WooCommerce_PromoRule $rule, $throw = true) { try { $data = $this->patch("ecommerce/stores/{$store_id}/promo-rules/{$rule->getId()}", $rule->toArray()); return (new MailChimp_WooCommerce_PromoRule)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if ($throw) throw $e; return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_PromoRule|int $rule * @return bool */ public function deletePromoRule($store_id, $rule) { try { $id = $rule instanceof MailChimp_WooCommerce_PromoRule ? $rule->getId() : $rule; //print_r(array('id' => $id, 'store' => $store_id));die(); return (bool) $this->delete("ecommerce/stores/{$store_id}/promo-rules/{$id}"); } catch (MailChimp_WooCommerce_Error $e) { //\Log::error("MC::deletePromoRule :: {$rule->getId()} :: {$e->getMessage()} on {$e->getLine()} in {$e->getFile()}"); return false; } } /** * @param $store_id * @param int $page * @param int $count * @return array */ public function getPromoRuleIds($store_id, $page = 1, $count = 10) { $result = $this->get("ecommerce/stores/{$store_id}/promo-rules", [ 'start' => $page, 'count' => $count, 'offset' => $page > 1 ? (($page-1) * $count) : 0, 'include' => 'id', ]); $ids = array(); foreach ($result['promo_rules'] as $rule) { $id = (string) $rule['id']; $ids[$id] = $id; } return $ids; } /** * @param $store_id * @param int $page * @param int $count * @param bool $return_original * @return array */ public function getPromoRules($store_id, $page = 1, $count = 10, $return_original = false) { $result = $this->get("ecommerce/stores/{$store_id}/promo-rules", [ 'start' => $page, 'count' => $count, 'offset' => $page > 1 ? (($page-1) * $count) : 0, ]); if ($return_original) { return $result; } $rules = array(); foreach ($result['promo_rules'] as $rule_data) { $rule = new MailChimp_WooCommerce_PromoRule(); $rule->fromArray($rule_data); $rules[] = $rule; } return $rules; } /** * @param $store_id * @param $rule_id * @param int $page * @param int $count * @param bool $return_original * @return array */ public function getPromoCodesForRule($store_id, $rule_id, $page = 1, $count = 10, $return_original = false) { $result = $this->get("ecommerce/stores/{$store_id}/promo-rules/{$rule_id}/promo_codes", [ 'start' => $page, 'count' => $count, 'offset' => $page > 1 ? (($page-1) * $count) : 0, ]); if ($return_original) { return $result; } $rules = array(); foreach ($result as $rule_data) { $rule = new MailChimp_WooCommerce_PromoCode(); $rule->fromArray($rule_data); $rules[] = $rule; } return $rules; } /** * @param $store_id * @param $rule_id * @param $code_id * * @return MailChimp_WooCommerce_PromoCode|bool */ public function getPromoCodeForRule($store_id, $rule_id, $code_id) { try { $data = $this->get("ecommerce/stores/{$store_id}/promo-rules/{$rule_id}/promo-codes/{$code_id}"); return (new MailChimp_WooCommerce_PromoCode)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_PromoRule $rule * @param MailChimp_WooCommerce_PromoCode $code * @param bool $throw * @return MailChimp_WooCommerce_PromoCode|bool * @throws MailChimp_WooCommerce_Error */ public function addPromoCodeForRule($store_id, MailChimp_WooCommerce_PromoRule $rule, MailChimp_WooCommerce_PromoCode $code, $throw = true) { try { if (($result = $this->updatePromoCodeForRule($store_id, $rule, $code, false))) { return $result; } $data = $this->post("ecommerce/stores/{$store_id}/promo-rules/{$rule->getId()}/promo-codes", $code->toArray()); return (new MailChimp_WooCommerce_PromoCode)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if ($throw) throw $e; return false; } } /** * @param $store_id * @param MailChimp_WooCommerce_PromoRule $rule * @param MailChimp_WooCommerce_PromoCode $code * @param bool $throw * @return MailChimp_WooCommerce_PromoCode|bool * @throws MailChimp_WooCommerce_Error */ public function updatePromoCodeForRule($store_id, MailChimp_WooCommerce_PromoRule $rule, MailChimp_WooCommerce_PromoCode $code, $throw = true) { try { $data = $this->patch("ecommerce/stores/{$store_id}/promo-rules/{$rule->getId()}/promo-codes/{$code->getId()}", $code->toArray()); return (new MailChimp_WooCommerce_PromoCode)->fromArray($data); } catch (MailChimp_WooCommerce_Error $e) { if ($throw) throw $e; return false; } } /** * @param $store_id * @param $rule_id * @param $code_id * @return bool */ public function deletePromoCodeForRule($store_id, $rule_id, $code_id) { try { return (bool) $this->delete("ecommerce/stores/{$store_id}/promo-rules/{$rule_id}/promo-codes/{$code_id}"); } catch (MailChimp_WooCommerce_Error $e) { return false; } } /** * @param MailChimp_WooCommerce_Store|MailChimp_WooCommerce_Order|MailChimp_WooCommerce_Product|MailChimp_WooCommerce_Customer $target * @return bool * @throws MailChimp_WooCommerce_Error */ protected function validateStoreSubmission($target) { if ($target instanceof MailChimp_WooCommerce_Order) { return $this->validateStoreOrder($target); } return true; } /** * @param MailChimp_WooCommerce_Order $order * @return bool */ protected function validateStoreOrder(MailChimp_WooCommerce_Order $order) { if (mailchimp_string_contains($order->getCustomer()->getEmailAddress(), array('marketplace.amazon.com'))) { mailchimp_log('validation.amazon', "Order #{$order->getId()} was placed through Amazon. Skipping!"); return false; } return true; } /** * @param $url * @param null $params * @return array|bool * @throws MailChimp_WooCommerce_Error */ protected function delete($url, $params = null) { $curl = curl_init(); $options = $this->applyCurlOptions('DELETE', $url, $params); curl_setopt_array($curl, $options); return $this->processCurlResponse($curl); } /** * @param $url * @param null $params * @return array|bool * @throws MailChimp_WooCommerce_Error */ protected function get($url, $params = null) { $curl = curl_init(); $options = $this->applyCurlOptions('GET', $url, $params); curl_setopt_array($curl, $options); return $this->processCurlResponse($curl); } /** * @param $url * @param $body * @return array|mixed|null|object * @throws Exception * @throws MailChimp_WooCommerce_Error */ protected function patch($url, $body) { // process the patch request the normal way $curl = curl_init(); $json = json_encode($body); $options = $this->applyCurlOptions('PATCH', $url, array(), array( 'Expect:', 'Content-Length: '.strlen($json), )); $options[CURLOPT_POSTFIELDS] = $json; curl_setopt_array($curl, $options); return $this->processCurlResponse($curl); } /** * @param $url * @param $body * @return array|bool * @throws MailChimp_WooCommerce_Error */ protected function post($url, $body) { $curl = curl_init(); $json = json_encode($body); $options = $this->applyCurlOptions('POST', $url, array(), array( 'Expect:', 'Content-Length: '.strlen($json), )); $options[CURLOPT_POSTFIELDS] = $json; curl_setopt_array($curl, $options); return $this->processCurlResponse($curl); } /** * @param $url * @param $body * @return array|bool * @throws MailChimp_WooCommerce_Error */ protected function put($url, $body) { $curl = curl_init(); $json = json_encode($body); $options = $this->applyCurlOptions('PUT', $url, array(), array( 'Expect:', 'Content-Length: '.strlen($json), )); $options[CURLOPT_POSTFIELDS] = $json; curl_setopt_array($curl, $options); return $this->processCurlResponse($curl); } /** * @param string $extra * @param null|array $params * @return string */ protected function url($extra = '', $params = null) { $url = "https://{$this->data_center}.api.mailchimp.com/{$this->version}/"; if (!empty($extra)) { $url .= $extra; } if (!empty($params)) { $url .= '?'.(is_array($params) ? http_build_query($params) : $params); } return $url; } /** * @param $method * @param $url * @param $body * @return array|WP_Error */ protected function sendWithHttpClient($method, $url, $body) { return _wp_http_get_object()->request($this->url($url), array( 'method' => strtoupper($method), 'headers' => array( 'Authorization' => 'Basic ' . base64_encode('mailchimp:'.$this->api_key), 'Content-Type' => 'application/json', ), 'body' => json_encode($body), )); } /** * @param $method * @param $url * @param array $params * @param array $headers * @return array */ protected function applyCurlOptions($method, $url, $params = array(), $headers = array()) { $env = mailchimp_environment_variables(); return array( CURLOPT_USERPWD => "mailchimp:{$this->api_key}", CURLOPT_CUSTOMREQUEST => strtoupper($method), CURLOPT_URL => $this->url($url, $params), CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLINFO_HEADER_OUT => true, CURLOPT_HTTPHEADER => array_merge(array( 'content-type: application/json', "user-agent: MailChimp for WooCommerce/{$env->version}; PHP/{$env->php_version}; WordPress/{$env->wp_version}; Woo/{$env->wc_version};", ), $headers) ); } /** * @param $curl * @return array|mixed|null|object * @throws Exception * @throws MailChimp_WooCommerce_Error * @throws MailChimp_WooCommerce_ServerError */ protected function processCurlResponse($curl) { $response = curl_exec($curl); $err = curl_error($curl); $info = curl_getinfo($curl); curl_close($curl); if ($err) { throw new MailChimp_WooCommerce_Error('CURL error :: '.$err, '500'); } $data = json_decode($response, true); if (empty($info) || ($info['http_code'] >= 200 && $info['http_code'] <= 400)) { if (is_array($data)) { try { $this->checkForErrors($data); } catch (\Exception $e) { throw $e; } } return $data; } if ($info['http_code'] >= 400 && $info['http_code'] <= 500) { throw new MailChimp_WooCommerce_Error($data['title'] .' :: '.$data['detail'], $data['status']); } if ($info['http_code'] >= 500) { throw new MailChimp_WooCommerce_ServerError($data['detail'], $data['status']); } return null; } /** * @param array $data * @return bool * @throws MailChimp_WooCommerce_Error */ protected function checkForErrors(array $data) { // if we have an array of error data push it into a message if (isset($data['errors'])) { $message = ''; foreach ($data['errors'] as $error) { $message .= '

'.$error['field'].': '.$error['message'].'

'; } throw new MailChimp_WooCommerce_Error($message, $data['status']); } // make sure the response is correct from the data in the response array if (isset($data['status']) && $data['status'] >= 400) { throw new MailChimp_WooCommerce_Error($data['detail'], $data['status']); } return false; } }