api_url = parse_url($this->api_endpoint); $this->auth_tokens = array(); if(is_array($tokens)){ if(array_key_exists('access_code', $tokens)){ $this->auth_tokens = $this->oauth_handshake( $tokens ); }else{ $this->auth_tokens = $tokens; } }else{ $this->auth_tokens['app_key'] = $tokens; if( $password ){ $this->auth_tokens['user'] = $user; $this->auth_tokens['password'] = $password; } else { $this->auth_tokens['user_key'] = $user; } } } function oauth_handshake( $tokens ){ $params = array( 'grant_type'=>'authorization_code', 'client_id'=> $tokens['app_key'], 'client_secret'=> $tokens['client_secret'], 'code'=> $tokens['access_code'] ); $request_url = $this->api_url['scheme'] . "://" . $this->api_url['host'] . '/oauth/token'; // TODO: Replace the cURL code with something a bit more modern - //$context = stream_context_create(array('http' => array( // 'method' => 'POST', // 'header' => "Content-type: application/x-www-form-urlencoded\r\n", // 'content' => http_build_query($params)))); //$json_data = file_get_contents( $request_url, false, $context ); // CURL-POST implementation - // WARNING: This code may require you to install the php5-curl package $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_URL, $request_url); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $json_data = curl_exec($ch); $resp_info = curl_getinfo($ch); curl_close($ch); $response = get_object_vars(json_decode($json_data)); if( !array_key_exists('access_token', $response) || array_key_exists('error', $response) ){ throw new Exception( $response['error_description'] ); } return array_merge($tokens, $response); } // For information about available API methods, see: http://developer.eventbrite.com/doc/ function __call( $method, $args ) { // Unpack our arguments if( is_array( $args ) && array_key_exists( 0, $args ) && is_array( $args[0]) ){ $params = $args[0]; }else{ $params = array(); } // Add authentication tokens to querystring if(!isset($this->auth_tokens['access_token'])){ $params = array_merge($params, $this->auth_tokens); } // Build our request url, urlencode querystring params $request_url = $this->api_url['scheme']."://".$this->api_url['host'].$this->api_url['path'].$method.'?'.http_build_query( $params,'','&'); // Call the API if(!isset($this->auth_tokens['access_token'])){ $resp = file_get_contents( $request_url ); }else{ $options = array( 'http'=>array( 'method'=> 'GET', 'header'=> "Authorization: Bearer " . $this->auth_tokens['access_token']) ); $resp = file_get_contents( $request_url, false, stream_context_create($options)); } // parse our response if($resp){ $resp = json_decode( $resp ); if( isset( $resp->error ) && isset($resp->error->error_message) ){ throw new Exception( $resp->error->error_message ); } } return $resp; } /* * Helpers: */ public static function OAuthLogin($auth_tokens, $get_token='getAccessToken', $save_token='saveAccessToken', $delete_token='deleteAccessToken'){ $user = false; $response = array(); # Attempt to authenticate this user using an access_token, if available if(!isset($auth_tokens['access_token'])){ if(is_callable($get_token)){ $auth_tokens['access_token'] = $get_token(); }elseif(is_callable(array('self',$get_token))){ $auth_tokens['access_token'] = self::$get_token(); } } if( isset($auth_tokens['access_token']) ){ try{ // Example using an access_token to initialize the API client: $eb = new Eventbrite(array('access_token' => $auth_tokens['access_token'])); $user = $eb->user_get()->user; }catch(Exception $e){ $user = false; // This token may no longer be valid // refresh it, or clear it $response['login_error'] = $e->getMessage(); if(is_callable($delete_token)){ $delete_token( $auth_tokens['access_token'] ); }elseif(is_callable(array('self',$delete_token))){ self::$delete_token( $auth_tokens['access_token'] ); } } } # We do not have a valid access token for this user so far if( $user == false ){ # This user is not yet authenticated - # it is their first visit, # or they are returning with an access_code that we will exchange for an access_token, # or they were redirected here after logout if( isset($auth_tokens['access_code']) ){ # This user has just authenticated, get their access token and store it try{ $eb = new Eventbrite($auth_tokens ); $response['access_token'] = $eb->auth_tokens['access_token']; // save this access_token for future use! if(is_callable($save_token)){ $save_token( $response['access_token'] ); }elseif(is_callable(array('self',$save_token))){ self::$save_token( $response['access_token'] ); } header('Location: ' . $_SERVER['PHP_SELF'] ); exit; }catch (Exception $e){ $response['login_error'] = $e->getMessage(); } }else if( isset($auth_tokens['error_message'] )){ if($auth_tokens['error_message'] == 'access_denied'){ $response['login_error'] = "Account access denied."; }else{ $response['login_error'] = $auth_tokens['error_message']; } } }else if(is_object($user)){ $response['user_email'] = $user->email; $response['user_name'] = $user->first_name . ' ' . $user->last_name; } return $response; } public static function widgetHTML( $params ){ // Replace this example with something that works with your Application's templating engine $html = "

Eventbrite Account Access

"; if( isset($params['user_name']) && isset($params['user_email']) && isset($params['logout_link']) ){ $html .= "

Welcome Back!

"; $html .= "

You are logged in as:
{$params['user_name']}
({$params['user_email']})

"; $html .= "

Logout

"; }elseif( isset($params['oauth_link']) ){ if(isset($params['login_error'])){ $html .= "

{$params['login_error']}

"; } $html .= "

Login with Eventbrite

"; }else{ $html .= "

Eventbrite widgetHTML template example fail :(

"; } $html .= ""; return $html; } public static function oauthNextStep( $key ) { return 'https://www.eventbrite.com/oauth/authorize?response_type=code&client_id='.$key; } public static function eventList($evnts= array(), $callback='eventListRow', $options=false) { $html='
'; if( isset($evnts->events)){ foreach( $evnts->events as $evnt ){ if( isset($evnt->event ) ){ if(is_callable($callback)){ if($options){ $html .= $callback($evnt->event, $options); }else{ $html .= $callback($evnt->event); } }else if(is_callable( array('self', $callback))){ if($options){ $html .= self::$callback($evnt->event, $options); }else{ $html .= self::$callback($evnt->event); } } } } }else{ $html .= "No events were found at this time."; } return $html . "
"; } public static function getAccessToken( ) { if(isset($_SESSION['EB_OAUTH_ACCESS_TOKEN'])){ return $_SESSION['EB_OAUTH_ACCESS_TOKEN']; }else{ return null; } } public static function saveAccessToken( $access_token ) { // this function should save the existing user's access_token. $_SESSION['EB_OAUTH_ACCESS_TOKEN'] = $access_token; } public static function deleteAccessToken( ) { // this function should remove the existing user's access_token. unset($_SESSION['EB_OAUTH_ACCESS_TOKEN']); } public static function eventListRow( $evnt ) { $time = strtotime($evnt->start_date); $venue_name = 'online'; if( isset($evnt->venue) && isset( $evnt->venue->name )){ $venue_name = $evnt->venue->name; } return "
" . strftime('%a, %B %e', $time) . "" . strftime('%l:%M %P', $time) . "" ."".$evnt->title."" . $venue_name . "
\n"; } /* * Widgets: */ public static function loginWidget( $options, $get_token='getAccessToken', $save_token='saveAccessToken', $delete_token='deleteAccessToken', $render_login_box='widgetHTML' ){ if( ( isset($options['logout_link']) && $options['logout_link'] == $_SERVER['REQUEST_URI'] ) // TODO: add a way to disable this default: || ( isset($_GET['eb_logout']) && $_GET['eb_logout']=="true" )) { // clear this user's access_token - Eventbrite::deleteAccessToken(); // remove our "logout=true" trigger from the querystring- header("Location: " . $_SERVER['PHP_SELF']); exit; } // automatically pull the access_code from the querysting? // TODO: add a way to disable this: if(!isset($options['access_code'] )){ $options['access_code'] = isset($_REQUEST['code']) ? $_REQUEST['code'] : null; } // automatically grab errors from the querystring? // TODO: add a way to disable this: if(!isset($options['error_message'])){ $options['error_message'] = isset($_REQUEST['error']) ? $_REQUEST['error'] : null; } // Check to see if we have a valid user account // and Proccess any data-related work: $response = Eventbrite::OAuthLogin($options, $get_token, $save_token, $delete_token); // package up the data for our view / template: $login_params = array(); if( is_array($response)){ if( isset( $response['user_email']) ){ $login_params = array('user_name' => $response['user_name'], 'user_email' => $response['user_email']); } $login_params['oauth_link'] = Eventbrite::oauthNextStep($options['app_key']); if(isset( $response['login_error'])){ $login_params['login_error'] = $response['login_error']; } if(isset( $options['logout_link'])){ $login_params['logout_link'] = $options['logout_link']; }else{ $login_params['logout_link'] = $_SERVER['PHP_SELF'] . '?eb_logout=true'; } } // view related work: // render your "template" if(is_callable($render_login_box)){ return $render_login_box( $login_params ); }elseif(is_callable(array('self',$render_login_box))){ return self::$render_login_box( $login_params ); }else{ //the templating callback was not valid, //return the raw data for use with an external template return $login_params; } } public static function ticketWidget( $evnt, $height='650px', $width='100%' ) { return '
Online Ticketing for ' . $evnt->title . ' powered by Eventbrite
'; } public static function registrationWidget( $evnt ) { return '
Online Ticketing for ' . $evnt->title . ' powered by Eventbrite
'; } public static function calendarWidget( $evnt ) { return '
Online event registration powered by Eventbrite
'; } public static function countdownWidget( $evnt ) { return '
Online event registration for ' . $evnt->title . '
'; } public static function buttonWidget( $evnt ) { return 'Register for ' . $evnt->title . ' on Eventbrite'; } public static function linkWidget( $evnt, $text=null, $color=null ) { return '' . ( $text ? $text : $evnt->title ) . ''; } }; ?>