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; } } }