token = $token; $this->addon = $addon; } /** * Make API request. * * @since 1.0 * * @param string $path Request path. * @param string $mode ga or gtm for Google Analytics or Tag Manager. * @param array $body Body arguments. * @param string $method Request method. Defaults to GET. * @param string $return_key Array key from response to return. Defaults to null (return full response). * * @return array|WP_Error */ private function make_request( $path = '', $mode = 'ga', $body = array(), $method = 'GET', $return_key = null ) { // Log API call succeed. gf_google_analytics()->log_debug( __METHOD__ . '(): Making request to: ' . $path ); // Get API Key. $token = $this->token; // Get mode. $api_url = ''; switch ( $mode ) { case 'ga4': $api_url = $this->ga_admin_api_url; break; case 'ga': $api_url = $this->ga_api_url; break; case 'gtm': $api_url = $this->gtm_api_url; break; default: return new WP_Error( 'google_analytics_invalid_mode', esc_html__( 'The API mode supplied is not supported by the Google Analytics API.', 'gravityformsgoogleanalytics' ), array() ); } // Build request URL. $request_url = $api_url . $path; $args = array( 'method' => $method, /** * Filters if SSL verification should occur. * * @param bool false If the SSL certificate should be verified. Defaults to false. * @param string $request_url The request URL. * * @return bool */ 'sslverify' => apply_filters( 'https_local_ssl_verify', false, $request_url ), /** * Sets the HTTP timeout, in seconds, for the request. * * @param int 30 The timeout limit, in seconds. Defaults to 30. * @param string $request_url The request URL. * * @return int */ 'timeout' => apply_filters( 'http_request_timeout', 30, $request_url ), ); if ( 'GET' === $method || 'POST' === $method || 'PUT' === $method ) { $args['body'] = empty( $body ) ? '' : $body; $args['headers'] = array( 'Authorization' => 'Bearer ' . $token, 'Accept' => 'application/json;ver=1.0', 'Content-Type' => 'application/json; charset=UTF-8', ); } if ( 'POST' === $method ) { $args['body'] = wp_json_encode( $body ); } // Execute request. $response = wp_remote_request( $request_url, $args ); if ( is_wp_error( $response ) ) { return $response; } $response_body = gf_google_analytics()->maybe_decode_json( wp_remote_retrieve_body( $response ) ); $retrieved_response_code = $response['response']['code']; if ( 200 !== $retrieved_response_code ) { $error_message = rgars( $response_body, 'error/message', "Expected response code: 200. Returned response code: {$retrieved_response_code}." ); $error_code = rgars( $response_body, 'error/errors/reason', 'google_analytics_api_error' ); gf_google_analytics()->log_error( __METHOD__ . '(): Unable to validate with the Google Analytics API: ' . $error_message ); return new WP_Error( $error_code, $error_message, $retrieved_response_code ); } return $response_body; } /** * Retrieve a refresh token when the original expires. * * @since 1.0.0 * * @param string $refresh_token Refresh token to re-authorize. * * @return array|WP_Error */ public function refresh_token( $refresh_token ) { // Connect to Gravity Form's API. $response = wp_remote_post( $this->addon->get_gravity_api_url( '/auth/googleanalytics/refresh' ), array( 'body' => array( 'refresh_token' => rawurlencode( $refresh_token ), ), ) ); if ( is_wp_error( $response ) ) { return $response; } $response_body = gf_google_analytics()->maybe_decode_json( wp_remote_retrieve_body( $response ) ); $retrieved_response_code = $response['response']['code']; if ( 200 !== absint( $retrieved_response_code ) || ! rgars( $response_body, 'token/access_token' ) ) { $error_message = "Expected response code: 200. Returned response code: {$retrieved_response_code}."; gf_google_analytics()->log_error( __METHOD__ . '(): Unable to Reauthorize refresh token: ' . $error_message ); gf_google_analytics()->log_error( __METHOD__ . '(): Response body: ' . var_export( $response_body, true ) ); return new WP_Error( 'google_analytics_api_error', $error_message, $retrieved_response_code ); } return $response_body; } /** * Get a list of Google Analytics accounts. * * @since 2.0.0 * * @return array|WP_Error */ public function get_ga4_accounts() { return $this->make_request( 'accountSummaries', 'ga4', array() ); } /** * Get a list of GA4 data streams. * * @since 2.0.0 * * @param array $property GA4 property associated with the data streams. In the format "property/XXXX". * * @return array|WP_Error Returns an array of data streams. */ public function get_data_streams( $property ) { return $this->make_request( "{$property}/dataStreams", 'ga4', array() ); } /** * Creates a new Measurement Protocol API Secret. * * @since 2.0.0 * * @param array $path The path to the data stream for which we're creating a secret. * * @return array|WP_Error Returns an array of measurement protocol secrets. */ public function create_api_secret( $path ) { return $this->make_request( $path . '/measurementProtocolSecrets', 'ga4', array( 'displayName' => 'GravityFormsSecret', ), 'POST' ); } /** * List Measurement Protocol API Secrets. * * @since 2.0.0 * * @param array $path The path to the data stream for which we're retrieving secrets. * * @return array|WP_Error Returns an array of measurement protocol secrets. */ public function get_api_secrets( $path ) { return $this->make_request( $path . '/measurementProtocolSecrets', 'ga4', array(), 'GET' ); } /** * Get a list of tag manager accounts. * * @since 1.0.0 * * @param array $body Body information. * * @return array|WP_Error */ public function get_tag_manager_account( $body ) { return $this->make_request( 'accounts', 'gtm', $body ); } /** * Get a list of tag manager containers. * * @since 1.0.0 * * @param array $body Body information. * @param string $account_id Account to retrieve containers for. * * @return array|WP_Error */ public function get_tag_manager_containers( $body, $account_id ) { return $this->make_request( sprintf( 'accounts/%s/containers', $account_id ), 'gtm', $body ); } /** * Get a list of tag manager workspaces. * * @since 1.0.0 * * @param array $body Body information. * @param string $path Account path to request. * * @return array|WP_Error */ public function get_tag_manager_workspaces( $body, $path ) { return $this->make_request( sprintf( '%s/workspaces', $path ), 'gtm', $body ); } /** * Get a list of tag manager triggers. * * @since 2.0.0 * * @param array $body Body information. * @param string $path Account path to request. * @param string $workspace The workspace to retrieve variables for. * * @return array|WP_Error */ public function get_tag_manager_triggers( $body, $path, $workspace ) { return $this->make_request( sprintf( '%s/workspaces/%s/triggers', $path, $workspace ), 'gtm', $body ); } /** * Get a list of tag manager variables. * * @since 1.0.0 * * @param array $body Body information. * @param string $path Account path to request. * @param string $workspace The workspace to retrieve variables for. * * @return array|WP_Error */ public function get_tag_manager_variables( $body, $path, $workspace ) { return $this->make_request( sprintf( '%s/workspaces/%s/variables', $path, $workspace ), 'gtm', $body ); } }