113 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * PayPal REST API Token
 | 
						|
 *
 | 
						|
 * @package    easy-digital-downloads
 | 
						|
 * @subpackage Gateways\PayPal
 | 
						|
 * @copyright  Copyright (c) 2021, Sandhills Development, LLC
 | 
						|
 * @license    GPL2+
 | 
						|
 */
 | 
						|
 | 
						|
namespace EDD\Gateways\PayPal;
 | 
						|
 | 
						|
class Token {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Token object
 | 
						|
	 *
 | 
						|
	 * @var object
 | 
						|
	 */
 | 
						|
	private $token_object;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Token constructor.
 | 
						|
	 *
 | 
						|
	 * @param $token_object
 | 
						|
	 *
 | 
						|
	 * @throws \RuntimeException
 | 
						|
	 */
 | 
						|
	public function __construct( $token_object ) {
 | 
						|
		if ( is_object( $token_object ) && ! isset( $token_object->created ) ) {
 | 
						|
			$token_object->created = time();
 | 
						|
		}
 | 
						|
 | 
						|
		if ( ! $this->is_valid( $token_object ) ) {
 | 
						|
			throw new \RuntimeException( __( 'Invalid token.', 'easy-digital-downloads' ) );
 | 
						|
		}
 | 
						|
 | 
						|
		$this->token_object = $token_object;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Creates a new token from a JSON string.
 | 
						|
	 *
 | 
						|
	 * @param string $json
 | 
						|
	 *
 | 
						|
	 * @return Token
 | 
						|
	 * @throws \Exception
 | 
						|
	 */
 | 
						|
	public static function from_json( $json ) {
 | 
						|
		return new Token( json_decode( $json ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the token object as a JSON string.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 * @return string|false
 | 
						|
	 */
 | 
						|
	public function to_json() {
 | 
						|
		return json_encode( $this->token_object );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Determines whether or not the token has expired.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	public function is_expired() {
 | 
						|
		// Regenerate tokens 10 minutes early, just in case.
 | 
						|
		$expires_in = $this->token_object->expires_in - ( 10 * MINUTE_IN_SECONDS );
 | 
						|
 | 
						|
		return time() > $this->token_object->created + $expires_in;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the access token.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function token() {
 | 
						|
		return $this->token_object->access_token;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Determines whether or not we have a valid token object.
 | 
						|
	 * Note: This does not check the _expiration_ of the token, just validates that the expected
 | 
						|
	 * data is _present_.
 | 
						|
	 *
 | 
						|
	 * @param object $token_object
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	private function is_valid( $token_object ) {
 | 
						|
		$required_properties = array(
 | 
						|
			'created',
 | 
						|
			'access_token',
 | 
						|
			'expires_in'
 | 
						|
		);
 | 
						|
 | 
						|
		foreach ( $required_properties as $property ) {
 | 
						|
			if ( ! isset( $token_object->{$property} ) ) {
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
}
 |