401 ]); } // Add External Authorization header $headers['x-external-authorization'] = "Bearer " . $token; } // Build request $args = [ 'body' => $body, 'headers' => $headers, "timeout" => defined("BZ_CONTACT_BUTTON_API_TIMEOUT") ? BZ_CONTACT_BUTTON_API_TIMEOUT : 20 ]; // Execute $response = wp_remote_post(BZ_CONTACT_BUTTON_API_URI . ($withAuthorization ? '/external' : '') . $path, $args); // Get status $status = wp_remote_retrieve_response_code($response); // Get body $body = wp_remote_retrieve_body($response); // Request failed if ($status < 200 || $status >= 300) { $errorStatus = "buttonizer_api_request_failed"; $errorMessage = "Could not fetch data, site was deleted, or the sites authorization token was invalidated. Please contact us if the error persists."; // Our API failed. Tell this if ($status === 500) { $errorStatus = "buttonizer_api_server_error"; $errorMessage = "Sorry, there was an internal server issue on our Buttonizer API. This is an bug on our side, please try again later or contact us if the error persists."; } // Token was expired if ($status === 401) { $errorStatus = "buttonizer_token_expired"; $errorMessage = "Your sites authorization token has expired and was not automatically renewed, please reconnect your site."; } // Request failed or API is down :( if ($status === "" && $body === "") { $errorStatus = "buttonizer_api_not_reachable"; $errorMessage = "The request has failed because the Buttonizer API wasn't reachable. Maybe your provider has blocked outgoing requests to our API or the Buttonizer API is down for maintenance. Please try again later or contact us if the error persists."; $status = 400; } return new \WP_Error($errorStatus, $errorMessage, [ 'status' => $status, 'message' => $body ]); } // Parse result $result = json_decode($body); // Make sure expected data is available if (json_last_error() !== JSON_ERROR_NONE) { return new \WP_Error('buttonizer_parse_error', 'Unable parsing received data (JSON error: ' . json_last_error() . ')', [ 'status' => 500 ]); } // Make sure to always return an object if (is_array($result)) { return new \stdClass; } // Return object return $result; } /** * Only refresh token if required */ public static function refreshToken() { $tokenExpiration = Settings::getSetting('token_expiration'); // Token will not expire anytime soon if (new \DateTime('+3 month') <= $tokenExpiration) { return null; } // Generate a refresh token $result = self::post("/session_refresh", [], [], true, false); // Handle errors if (is_a($result, 'WP_Error')) { return $result; } // Update token self::saveApiToken($result->token); return true; } }