194 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * PayPal Merchant Account Details
 | 
						|
 *
 | 
						|
 * Contains information about the connected PayPal account.
 | 
						|
 *
 | 
						|
 * @package   easy-digital-downloads
 | 
						|
 * @copyright Copyright (c) 2021, Sandhills Development, LLC
 | 
						|
 * @license   GPL2+
 | 
						|
 * @since     2.11
 | 
						|
 */
 | 
						|
 | 
						|
namespace EDD\Gateways\PayPal;
 | 
						|
 | 
						|
use EDD\Gateways\PayPal\Exceptions\InvalidMerchantDetails;
 | 
						|
use EDD\Gateways\PayPal\Exceptions\MissingMerchantDetails;
 | 
						|
 | 
						|
class MerchantAccount {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Merchant ID of the seller's PayPal account.
 | 
						|
	 */
 | 
						|
	public $merchant_id;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var bool Indicates whether the seller account can receive payments.
 | 
						|
	 */
 | 
						|
	public $payments_receivable;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var bool Indicates whether the primary email of the seller has been confirmed.
 | 
						|
	 */
 | 
						|
	public $primary_email_confirmed;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var array An array of all products that are integrated with the partner for the seller.
 | 
						|
	 */
 | 
						|
	public $products;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var \WP_Error
 | 
						|
	 */
 | 
						|
	private $wp_error;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * MerchantAccount constructor.
 | 
						|
	 *
 | 
						|
	 * @param array $details
 | 
						|
	 */
 | 
						|
	public function __construct( $details ) {
 | 
						|
		foreach ( $details as $key => $value ) {
 | 
						|
			$this->{$key} = $value;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->wp_error = new \WP_Error();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Builds a new MerchantAccount object from a JSON object.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 *
 | 
						|
	 * @param string $json
 | 
						|
	 *
 | 
						|
	 * @return MerchantAccount
 | 
						|
	 */
 | 
						|
	public static function from_json( $json ) {
 | 
						|
		$merchant_details = json_decode( $json, true );
 | 
						|
		if ( empty( $merchant_details ) || ! is_array( $merchant_details ) ) {
 | 
						|
			$merchant_details = array();
 | 
						|
		}
 | 
						|
 | 
						|
		return new MerchantAccount( $merchant_details );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Converts the account details to JSON.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 *
 | 
						|
	 * @return string|false
 | 
						|
	 */
 | 
						|
	public function to_json() {
 | 
						|
		return json_encode( get_object_vars( $this ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Determines whether or not the details are valid.
 | 
						|
	 * Note: This does NOT determine actual "ready to accept payments" status, it just
 | 
						|
	 * verifies that we have all the information we need to determine that.
 | 
						|
	 *
 | 
						|
	 * @throws MissingMerchantDetails
 | 
						|
	 * @throws InvalidMerchantDetails
 | 
						|
	 */
 | 
						|
	public function validate() {
 | 
						|
		if ( empty( $this->merchant_id ) ) {
 | 
						|
			throw new MissingMerchantDetails();
 | 
						|
		}
 | 
						|
 | 
						|
		$required_properties = array(
 | 
						|
			'merchant_id',
 | 
						|
			'payments_receivable',
 | 
						|
			'primary_email_confirmed',
 | 
						|
			'products',
 | 
						|
		);
 | 
						|
 | 
						|
		$valid_properties = array();
 | 
						|
		foreach( $required_properties as $property ) {
 | 
						|
			if ( property_exists( $this, $property ) && ! is_null( $this->{$property} ) ) {
 | 
						|
				$valid_properties[] = $property;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		$difference = array_diff( $required_properties, $valid_properties );
 | 
						|
 | 
						|
		if ( $difference ) {
 | 
						|
			throw new InvalidMerchantDetails(
 | 
						|
				'Please click "Re-Check Payment Status" below to confirm your payment status.'
 | 
						|
			);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Determines whether or not the account is ready to accept payments.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 *
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	public function is_account_ready() {
 | 
						|
		if ( ! $this->payments_receivable ) {
 | 
						|
			$this->wp_error->add( 'payments_receivable', __( 'Your account is unable to receive payments. Please contact PayPal customer support.', 'easy-digital-downloads' ) );
 | 
						|
		}
 | 
						|
 | 
						|
		if ( ! $this->primary_email_confirmed ) {
 | 
						|
			$this->wp_error->add(
 | 
						|
				'primary_email_confirmed',
 | 
						|
				__( 'Your PayPal email address needs to be confirmed.', 'easy-digital-downloads' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		return empty( $this->wp_error->errors );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves errors preventing the account from being "ready".
 | 
						|
	 *
 | 
						|
	 * @see   MerchantAccount::is_account_ready()
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 *
 | 
						|
	 * @return \WP_Error
 | 
						|
	 */
 | 
						|
	public function get_errors() {
 | 
						|
		return $this->wp_error;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Returns the option name for the current mode.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 *
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private static function get_option_name() {
 | 
						|
		return sprintf(
 | 
						|
			'edd_paypal_%s_merchant_details',
 | 
						|
			edd_is_test_mode() ? API::MODE_SANDBOX : API::MODE_LIVE
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Saves the merchant details.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 */
 | 
						|
	public function save() {
 | 
						|
		update_option( self::get_option_name(), $this->to_json() );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves the saved merchant details.
 | 
						|
	 *
 | 
						|
	 * @since 2.11
 | 
						|
	 *
 | 
						|
	 * @return MerchantAccount
 | 
						|
	 * @throws \InvalidArgumentException
 | 
						|
	 */
 | 
						|
	public static function retrieve() {
 | 
						|
		return self::from_json( get_option( self::get_option_name(), '' ) );
 | 
						|
	}
 | 
						|
 | 
						|
}
 |