Files
old-experiments/backend/wordpress/wp-content/plugins/woocommerce-services/classes/class-wc-connect-stripe.php
2018-06-29 14:40:28 +02:00

161 lines
4.2 KiB
PHP
Executable File

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WC_Connect_Stripe' ) ) {
class WC_Connect_Stripe {
/**
* @var WC_Connect_API_Client
*/
private $api;
/**
* @var WC_Connect_Options
*/
private $options;
/**
* @var WC_Connect_Logger
*/
private $logger;
const STATE_VAR_NAME = 'stripe_state';
const SETTINGS_OPTION = 'woocommerce_stripe_settings';
public function __construct( WC_Connect_API_Client $client, WC_Connect_Options $options, WC_Connect_Logger $logger ) {
$this->api = $client;
$this->options = $options;
$this->logger = $logger;
}
public function is_stripe_plugin_enabled() {
return class_exists( 'WC_Stripe' );
}
public function get_oauth_url( $return_url ) {
$result = $this->api->get_stripe_oauth_init( $return_url );
if ( is_wp_error( $result ) ) {
return $result;
}
$this->options->update_option( self::STATE_VAR_NAME, $result->state );
return $result->oauthUrl;
}
public function create_account( $email, $country ) {
$response = $this->api->create_stripe_account( $email, $country );
if ( is_wp_error( $response ) ) {
return $response;
}
return $this->save_stripe_keys( $response );
}
public function get_account_details() {
return $this->api->get_stripe_account_details();
}
public function deauthorize_account() {
$response = $this->api->deauthorize_stripe_account();
if ( is_wp_error( $response ) ) {
return $response;
}
$this->clear_stripe_keys();
return $response;
}
public function connect_oauth( $state, $code ) {
if ( $state !== $this->options->get_option( self::STATE_VAR_NAME, false ) ) {
return new WP_Error( 'Invalid stripe state' );
}
$response = $this->api->get_stripe_oauth_keys( $code );
if ( is_wp_error( $response ) ) {
return $response;
}
return $this->save_stripe_keys( $response );
}
private function save_stripe_keys( $result ) {
if ( ! isset( $result->publishableKey, $result->secretKey ) ) {
return new WP_Error( 'Invalid credentials received from server' );
}
$is_test = false !== strpos( $result->publishableKey, '_test_' );
$prefix = $is_test ? 'test_' : '';
$default_options = $this->get_default_stripe_config();
$options = array_merge( $default_options, get_option( self::SETTINGS_OPTION, array() ) );
$options['enabled'] = 'yes';
$options['testmode'] = $is_test ? 'yes' : 'no';
$options[ $prefix . 'publishable_key' ] = $result->publishableKey;
$options[ $prefix . 'secret_key' ] = $result->secretKey;
// While we are at it, let's also clear the account_id and
// test_account_id if present
// Those used to be stored by save_stripe_keys but should not have
// been since they were not used by anyone
unset( $options[ 'account_id' ] );
unset( $options[ 'test_account_id' ] );
update_option( self::SETTINGS_OPTION, $options );
return $result;
}
/**
* Clears keys for test or production (whichever is presently enabled).
* Especially useful after Stripe Connect account deauthorization.
*/
private function clear_stripe_keys() {
$default_options = $this->get_default_stripe_config();
$options = array_merge( $default_options, get_option( self::SETTINGS_OPTION, array() ) );
if ( 'yes' === $options['testmode'] ) {
$options[ 'test_publishable_key' ] = '';
$options[ 'test_secret_key' ] = '';
} else {
$options[ 'publishable_key' ] = '';
$options[ 'secret_key' ] = '';
}
// While we are at it, let's also clear the account_id and
// test_account_id if present
// Those used to be stored by save_stripe_keys but should not have
// been since they were not used by anyone
unset( $options[ 'account_id' ] );
unset( $options[ 'test_account_id' ] );
update_option( self::SETTINGS_OPTION, $options );
}
private function get_default_stripe_config() {
if ( ! class_exists( 'WC_Gateway_Stripe' ) ) {
return array();
}
$result = array();
$gateway = new WC_Gateway_Stripe();
foreach ( $gateway->form_fields as $key => $value ) {
if ( isset( $value['default'] ) ) {
$result[ $key ] = $value['default'];
}
}
return $result;
}
}
}