Spaces:
No application file
No application file
namespace MauticPlugin\MauticSocialBundle\Integration; | |
use MauticPlugin\MauticSocialBundle\Form\Type\FacebookType; | |
class FacebookIntegration extends SocialIntegration | |
{ | |
public function getName(): string | |
{ | |
return 'Facebook'; | |
} | |
/** | |
* @return string[] | |
*/ | |
public function getIdentifierFields(): array | |
{ | |
return [ | |
'facebook', | |
]; | |
} | |
public function getSupportedFeatures(): array | |
{ | |
return [ | |
'share_button', | |
'login_button', | |
'public_profile', | |
]; | |
} | |
public function getAuthenticationUrl(): string | |
{ | |
return 'https://www.facebook.com/dialog/oauth'; | |
} | |
public function getAccessTokenUrl(): string | |
{ | |
return 'https://graph.facebook.com/oauth/access_token'; | |
} | |
public function getAuthScope(): string | |
{ | |
return 'email'; | |
} | |
/** | |
* @param string $data | |
* @param bool $postAuthorization | |
* | |
* @return mixed | |
*/ | |
public function parseCallbackResponse($data, $postAuthorization = false) | |
{ | |
// Facebook is inconsistent in that it returns errors as json and data as parameter list | |
$values = parent::parseCallbackResponse($data, $postAuthorization); | |
if (null === $values) { | |
parse_str($data, $values); | |
$this->session->set($this->getName().'_tokenResponse', $values); | |
} | |
return $values; | |
} | |
public function getApiUrl($endpoint): string | |
{ | |
return "https://graph.facebook.com/$endpoint"; | |
} | |
/** | |
* Get public data. | |
* | |
* @return array | |
*/ | |
public function getUserData($identifier, &$socialCache) | |
{ | |
$this->persistNewLead = false; | |
$accessToken = $this->getContactAccessToken($socialCache); | |
if (!isset($accessToken['access_token'])) { | |
return; | |
} | |
$url = $this->getApiUrl('v2.8/me'); | |
$fields = array_keys($this->getAvailableLeadFields()); | |
$parameters = [ | |
'access_token' => $accessToken['access_token'], | |
'fields' => implode(',', $fields), | |
]; | |
$data = $this->makeRequest($url, $parameters, 'GET', ['auth_type' => 'rest']); | |
if (is_object($data) && isset($data->id)) { | |
$info = $this->matchUpData($data); | |
if (isset($data->username)) { | |
$info['profileHandle'] = $data->username; | |
} elseif (isset($data->link)) { | |
if (preg_match("/www.facebook.com\/(app_scoped_user_id\/)?(.*?)($|\/)/", $data->link, $matches)) { | |
$info['profileHandle'] = $matches[2]; | |
} | |
} else { | |
$info['profileHandle'] = $data->id; | |
} | |
$info['profileImage'] = "https://graph.facebook.com/{$data->id}/picture?type=large"; | |
$socialCache['id'] = $data->id; | |
$socialCache['profile'] = $info; | |
$socialCache['lastRefresh'] = new \DateTime(); | |
$socialCache['accessToken'] = $this->encryptApiKeys($accessToken); | |
$this->getMauticLead($info, $this->persistNewLead, $socialCache, $identifier); | |
return $data; | |
} | |
return null; | |
} | |
public function getAvailableLeadFields($settings = []): array | |
{ | |
return [ | |
'about' => ['type' => 'string'], | |
'birthday' => ['type' => 'string'], | |
'email' => ['type' => 'string'], | |
'first_name' => ['type' => 'string'], | |
'gender' => ['type' => 'string'], | |
'last_name' => ['type' => 'string'], | |
'link' => ['type' => 'string'], | |
'locale' => ['type' => 'string'], | |
'middle_name' => ['type' => 'string'], | |
'name' => ['type' => 'string'], | |
'political' => ['type' => 'string'], | |
'quotes' => ['type' => 'string'], | |
'religion' => ['type' => 'string'], | |
'timezone' => ['type' => 'string'], | |
'website' => ['type' => 'string'], | |
]; | |
} | |
public function getFormType(): string | |
{ | |
return FacebookType::class; | |
} | |
} | |