diff --git a/app/config/providers.php b/app/config/providers.php index c6bc9b2037..863d880d69 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -127,6 +127,12 @@ return [ 'enabled' => false, 'mock' => false ], + 'paypal' => [ + 'developers' => 'https://developer.paypal.com/docs/api/overview/', + 'icon' => 'icon-paypal', + 'enabled' => true, + 'mock' => false + ], // Keep Last 'mock' => [ 'developers' => 'https://appwrite.io', diff --git a/public/images/oauth/paypal.png b/public/images/oauth/paypal.png new file mode 100644 index 0000000000..8c14828cfd Binary files /dev/null and b/public/images/oauth/paypal.png differ diff --git a/src/Auth/OAuth/Paypal.php b/src/Auth/OAuth/Paypal.php new file mode 100644 index 0000000000..bff273b24d --- /dev/null +++ b/src/Auth/OAuth/Paypal.php @@ -0,0 +1,164 @@ + 'https://www.sandbox.paypal.com/', + 'live' => 'https://www.paypal.com/', + ]; + + private $resourceEndpoint = [ + 'sandbox' => 'https://api.sandbox.paypal.com/v1/', + 'live' => 'https://api.paypal.com/v1/', + ]; + + private $environment = 'live'; + + /** + * @var array + */ + protected $user = []; + + + protected $scopes = [ + 'openid', + 'profile', + 'email' + ]; + + /** + * @return string + */ + public function getName(): string + { + return 'paypal'; + } + + /** + * @return string + */ + public function getLoginURL(): string + { + $url = $this->endpoint[$this->environment] . 'connect/?'. + http_build_query([ + 'flowEntry' => 'static', + 'response_type' => 'code', + 'client_id' => $this->appID, + 'scope' => implode(' ', $this->getScopes()), + // paypal is not accepting localhost string into return uri + 'redirect_uri' => str_replace("localhost", "127.0.0.1", $this->callback), + 'state' => json_encode($this->state), + ]); + + return $url; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $accessToken = $this->request( + 'POST', + $this->resourceEndpoint[$this->environment] . 'oauth2/token', + ['Authorization: Basic ' . base64_encode($this->appID . ':' . $this->appSecret)], + http_build_query([ + 'code' => $code, + 'grant_type' => 'authorization_code', + ]) + ); + + + $accessToken = json_decode($accessToken, true); + + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['payer_id'])) { + return $user['payer_id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['emails'])) { + return $user['emails'][0]['value']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + $header = [ + 'Content-Type: application/json', + 'Authorization: Bearer '.urlencode($accessToken), + ]; + if (empty($this->user)) { + $user = $this->request( + 'GET', + $this->resourceEndpoint[$this->environment] . 'identity/oauth2/userinfo?schema=paypalv1.1', + $header + ); + $this->user = json_decode($user, true); + } + + return $this->user; + } +}