core = $core; } /** * Bind events. * * @return void */ public function bind_events() { add_action( 'rest_api_init', array( $this, 'on_rest_api_init' ) ); } /** * Generate temporary config. * * @param array $params Array of params. * @return P24_Config_Accessor */ private function generate_temporary_config( $params ) { $holder = new P24_Config_Holder(); $accessor = new P24_Config_Accessor( 'PLN', $holder ); $accessor ->set_p24_operation_mode( $params['mode'] ?? 'sandbox' ) ->set_merchant_id( $params['merchant_id'] ?? '0' ) ->set_shop_id( $params['shop_id'] ?? '0' ) ->set_salt( $params[ 'crc_key' ?? '0' ] ) ->set_p24_api( $params['api_key'] ?? '0' ) ->access_mode_to_strict(); return $accessor; } /** * Generate fake payload. * * @param P24_Config_Accessor $config Temporary config to use. * @return array * @throws Exception Not expected, the provided data should be valid. */ private function generate_fake_payload( P24_Config_Accessor $config ) { return array( 'sessionId' => 'fake_session_' . bin2hex( random_bytes( 10 ) ), 'posId' => (int) $config->get_shop_id(), 'merchantId' => (int) $config->get_merchant_id(), 'amount' => 100, 'currency' => $config->get_currency(), 'email' => 'p24@example.com', 'urlReturn' => 'http://example.com', 'description' => 'Config Test', 'country' => 'Polska', ); } /** * Extract error. * * @param string $error_text Error text. * @return int */ private function extract_error( $error_text ) { switch ( $error_text ) { case self::ERROR_AUTH_TXT: return self::ERROR_AUTH_ID; case self::ERROR_REGISTRATION_TXT: return self::ERROR_REGISTRATION_ID; default: return self::ERROR_X_ID; } } /** * Do a standard check. * * @param P24_Config_Accessor $config Temporary config. * @return int */ private function do_request_check( P24_Config_Accessor $config ) { $rest = new P24_Rest_Common( $config ); $res = $rest->test_access(); $res_error = $res['error'] ?? ''; if ( $res_error ) { return $this->extract_error( $res_error ); } else { return self::ERROR_NONE_ID; } } /** * Check if registration is possible. * * @param P24_Config_Accessor $config Temporary config. * @param string $token Reference to pass token. * @return int * @throws Exception Not expected for provided data. */ private function do_request_register( P24_Config_Accessor $config, &$token ) { $rest = new P24_Rest_Transaction( $config ); $payload = $this->generate_fake_payload( $config ); $res = $rest->register( $payload ); $res_error = $res['error'] ?? ''; if ( $res_error ) { return $this->extract_error( $res_error ); } $token = $res['data']['token'] ?? ''; if ( ! $token ) { return self::ERROR_X_ID; } else { return self::ERROR_NONE_ID; } } /** * Check if getting token is possible. * * @param P24_Config_Accessor $config Temporary config. * @param string $token Provided token. * @return int */ private function do_request_token( P24_Config_Accessor $config, $token ) { $test_mode = $config->is_p24_operation_mode( 'sandbox' ); $url = Przelewy24Class::get_trn_request_url_static( $token, $test_mode ); $params = array( 'method' => 'POST', 'redirection' => 0, ); $response = wp_remote_request( $url, $params ); if ( ! is_array( $response ) ) { return self::ERROR_X_ID; } /* This is an array like object. */ $location = $response['headers']['location']; if ( $location ) { $query = (string) wp_parse_url( $location, PHP_URL_QUERY ); parse_str( $query, $params ); $message = (string) ( $params['errorMessage'] ?? '' ); if ( preg_match( '/^unfinished_registration/', $message ) ) { return self::ERROR_REGISTRATION_ID; } $error = $params['error'] ?? null; if ( $error ) { return self::ERROR_X_ID; } } return self::ERROR_NONE_ID; } /** * Extract most important error. * * @param int $error Error mask. * @return int */ private function extract_most_important_error( int $error ) { if ( self::ERROR_NONE_ID === $error ) { return $error; } $errors_hierarchy = array( self::ERROR_AUTH_ID, self::ERROR_REGISTRATION_ID, self::ERROR_X_ID, ); foreach ( $errors_hierarchy as $one ) { if ( $one & $error ) { return $one; } } /* Not expected. */ return $error; } /** * Support API request. * * @param WP_REST_Request $request Incoming request. * @return WP_REST_Response */ public function route_check_config( WP_REST_Request $request ) { $body = $request->get_body(); parse_str( $body, $params ); $config = $this->generate_temporary_config( $params ); $error_check = $this->do_request_check( $config ); $error_register = $this->do_request_register( $config, $token ); $error_url = self::ERROR_NONE_ID; if ( $token ) { $error_url = $this->do_request_token( $config, $token ); } $error_combined = $error_check | $error_register | $error_url; $error_to_report = $this->extract_most_important_error( $error_combined ); return new WP_REST_Response( $error_to_report, 200 ); } /** * Register API route. * * @return void */ public function on_rest_api_init() { register_rest_route( 'p24', 'check-config', array( 'callback' => array( $this, 'route_check_config' ), 'methods' => array( 'POST', 'GET' ), 'permission_callback' => '__return_true', ) ); } }