'pl', 'laundry_locker' => 'll', 'avizo_locker' => 'al', 'pop' => 'pop', 'pok' => 'pok', 'air_on_airport' => 'aa', 'air_outside_airport' => 'aoa', 'parcel_locker_only' => 'plo', ]; /** * WPDesk_Paczkomaty_ShipX constructor. * * @param string $token . * @param string $test_token . * @param bool $test_mode . */ public function __construct( $token, $test_token = '', $test_mode = false ) { $this->token = $token; $this->test_token = $test_token; $this->test_mode = $test_mode; } /** * @param int $organization_id . */ public function set_organization_id( $organization_id ) { $this->organization_id = $organization_id; } /** * @param string $token . */ public function set_token( $token ) { $this->token = $token; } /** * @param string $test_token . */ public function set_test_token( $test_token ) { $this->test_token = $test_token; } /** * @param bool $test_mode . */ public function set_test_mode( $test_mode ) { $this->test_mode = $test_mode; } /** * @return bool */ public function get_test_mode() { return $this->test_mode; } /** * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function ping() { return $this->get_organizations(); } /** * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_services() { $params = []; return $this->get( 'services', $params ); } /** * Retrieves status list with translation. * * @param string $target_locale . * * @return array|mixed|object * @throws WPDesk_Paczkomaty_ShipX_Exception . * @see https://docs.inpost24.com/display/PL/%5B1.2.0%5D+Statusy */ public function get_statuses( $target_locale ) { $params = [ 'lang' => $target_locale ]; return $this->get( 'statuses', $params ); } /** * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_sending_methods() { $params = []; return $this->get( 'sending_methods', $params ); } /** * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_organizations() { $params = $this->add_per_page_parameter( [] ); return $this->get( 'organizations', $params ); } /** * @param string $organization_id . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_organization( $organization_id ) { return $this->get( 'organizations/' . $organization_id ); } /** * @param array $params . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_points( $params ) { return $this->get( 'points', $params, true ); } /** * @param string $point_name . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_point( $point_name ) { return $this->get( 'points/' . $point_name, [], true ); } /** * @param array $params . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_dispatch_points( $params ) { return $this->get( 'organizations/' . $this->organization_id . '/dispatch_points', $params ); } /** * @param string $point_id . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_dispatch_point( $point_id ) { return $this->get( 'dispatch_points/' . $point_id, [] ); } /** * @param array $shipment_data . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function create_shipment( $shipment_data ) { return $this->post( 'organizations/' . $this->organization_id . '/shipments', [], $shipment_data ); } /** * @param string $shipment_id . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_shipment( $shipment_id ) { return $this->get( 'shipments/' . $shipment_id, [] ); } /** * @param string $shipment_id . * * @return array|bool|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function delete_shipment( $shipment_id ) { return $this->delete( 'shipments/' . $shipment_id, [] ); } /** * @param array|string $shipment_ids . * @param string $format . * @param string $type . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_shipments_labels( $shipment_ids, $format = 'Pdf', $type = 'normal' ) { if ( ! is_array( $shipment_ids ) ) { $shipment_ids = [ $shipment_ids ]; } $post_data = new stdClass(); $post_data->shipment_ids = $shipment_ids; $post_data->format = $format; $post_data->type = $type; return $this->get_labels( 'organizations/' . $this->organization_id . '/shipments/labels', [], $post_data ); } /** * @param array $dispatch_order_data . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function create_dispatch_order( $dispatch_order_data ) { return $this->post( 'organizations/' . $this->organization_id . '/dispatch_orders', [], $dispatch_order_data ); } /** * @param string $dispatch_order_id . * * @return array|bool|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function delete_dispatch_order( $dispatch_order_id ) { return $this->delete( 'dispatch_orders/' . $dispatch_order_id, [] ); } /** * @param string $dispatch_order_id . * @param string $format . * * @return array|bool|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_dispatch_order_printout( $dispatch_order_id, $format = 'Pdf' ) { $api_method = 'dispatch_orders/' . $dispatch_order_id . '/printout?format=Pdf'; $url = $this->build_url( $api_method ); $url = $this->add_params_to_url( $url, [] ); $args = $this->prepare_args( 'GET' ); $response = wp_remote_get( $url, $args ); $this->check_response( $response ); if ( (int) wp_remote_retrieve_response_code( $response ) === 200 ) { return $response['body']; } return $this->parse_response( $response ); } /** * @param string $api_method . * @param array $params . * @param bool $no_auth . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get( $api_method, $params = [], $no_auth = false ) { $url = $this->build_url( $api_method ); $url = $this->add_params_to_url( $url, $params ); $args = $this->prepare_args( 'GET' ); if ( true === $no_auth ) { unset( $args['headers']['Authorization'] ); } $response = wp_remote_get( $url, $args ); $this->check_response( $response ); return $this->parse_response( $response ); } /** * @param string $api_method . * @param array $params . * @param array $data . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function post( $api_method, $params = [], $data = [] ) { $url = $this->build_url( $api_method ); $url = $this->add_params_to_url( $url, $params ); $args = $this->prepare_args( 'POST' ); $args['body'] = json_encode( $data, JSON_PRETTY_PRINT ); $this->log( 'ShipX API POST args:', $args ); $response = wp_remote_post( $url, $args ); $this->log( 'ShipX API response:', $response ); $this->check_response( $response ); return $this->parse_response( $response ); } /** * @param string $api_method . * @param array $params . * @param array $data . * * @return array|bool|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function delete( $api_method, $params = [], $data = [] ) { $url = $this->build_url( $api_method ); $url = $this->add_params_to_url( $url, $params ); $args = $this->prepare_args( 'POST' ); $args['body'] = json_encode( $data ); $args['method'] = 'DELETE'; $response = wp_remote_post( $url, $args ); $this->check_response( $response ); if ( 204 === intval( $response['response']['code'] ) ) { return true; } return $this->parse_response( $response ); } /** * @param string $api_method . * @param array $params . * @param array $data . * * @return array|mixed|object * @throws Exception . * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function get_labels( $api_method, $params = [], $data = [] ) { $url = $this->build_url( $api_method ); $url = $this->add_params_to_url( $url, $params ); $args = $this->prepare_args( 'POST' ); $args['body'] = json_encode( $data ); $response = wp_remote_post( $url, $args ); $this->check_response( $response ); if ( (int) wp_remote_retrieve_response_code( $response ) === 200 ) { return $response['body']; } return $this->parse_response( $response ); } /** * @param string $method . * * @return array */ public function prepare_args( $method ) { $args = $this->create_args( $method ); $headers = []; $headers = $this->add_headers( $headers ); $args['headers'] = $headers; return $args; } /** * @param array $headers . * * @return array */ private function add_headers( array $headers ) { $headers = $this->add_header_token( $headers ); $headers = $this->add_header_request_id( $headers ); $headers = $this->add_header_user_agent( $headers ); $headers = $this->add_header_user_agent_version( $headers ); $headers = $this->add_header_content_type( $headers ); return $headers; } /** * @param array $headers . * * @return array */ private function add_header_token( array $headers ) { $headers['Authorization'] = $this->test_mode ? 'Bearer ' . $this->test_token : 'Bearer ' . $this->token; return $headers; } /** * @param array $headers . * * @return array */ private function add_header_request_id( array $headers ) { if ( null !== $this->request_id ) { $headers['X-Request-ID'] = $this->request_id; } return $headers; } /** * @param array $headers . * * @return array */ private function add_header_user_agent( array $headers ) { $headers['X-User-Agent'] = $this->user_agent; return $headers; } /** * @param array $headers . * * @return array */ private function add_header_user_agent_version( array $headers ) { $headers['X-User-Agent-Version'] = $this->user_agent_version; return $headers; } /** * @param array $headers . * * @return array */ private function add_header_content_type( array $headers ) { $headers['Content-Type'] = 'application/json'; return $headers; } /** * @param int $request_id . */ public function set_request_id( $request_id ) { $this->request_id = $request_id; } /** * @param string $api_method . * * @return string */ private function build_url( $api_method ) { if ( $this->test_mode ) { $url = $this->test_api_url . $api_method; } else { $url = $this->api_url . $api_method; } return $url; } /** * @param string $url . * @param array $params . * * @return string */ private function add_params_to_url( $url, $params ) { if ( is_array( $params ) ) { foreach ( $params as $key => $value ) { $url = add_query_arg( $key, $value, $url ); } } return $url; } /** * Add per page parameter. * * @param array $params . * * @return array */ public function add_per_page_parameter( array $params ) { $params['per_page'] = self::API_PER_PAGE; return $params; } /** * @param string $method . * * @return array */ private function create_args( $method = 'GET' ) { $args = [ 'method' => $method, 'timeout' => 30, 'redirection' => 10, 'httpversion' => '1.0', 'blocking' => true, 'cookies' => [], 'body' => null, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false, 'filename' => null, ]; return $args; } /** * @param array $response . * * @throws Exception . */ private function check_response( $response ) { if ( is_wp_error( $response ) ) { throw new Exception( $response->get_error_message() ); } } /** * Parse response. * * @param array $response Response . * * @return array|mixed|object * @throws WPDesk_Paczkomaty_ShipX_Exception . */ public function parse_response( $response ) { $api_response_object = json_decode( $response['body'] ); if ( is_array( $api_response_object ) ) { return $api_response_object; } if ( ! is_object( $api_response_object ) ) { throw new WPDesk_Paczkomaty_ShipX_Exception( sprintf( // Translators: response. __( 'Błędna odpowiedź API shipX - spodziewany obiekt! Otrzymana odpowiedż serwera: %1$s', 'woocommerce-paczkomaty-inpost' ), esc_html( $response['body'] ) ), $response ); } if ( isset( $api_response_object->error ) ) { throw new WPDesk_Paczkomaty_ShipX_Exception( $this->parse_error_message( $api_response_object ), $response ); } return $api_response_object; } /** * @param stdClass $api_response_object . * * @return string */ private function parse_error_message( $api_response_object ) { if ( isset( $api_response_object->message ) ) { if ( isset( $api_response_object->details ) ) { if ( ! is_array( $api_response_object->details ) ) { $api_response_object->details = [ $api_response_object->details ]; } $message = ''; foreach ( $api_response_object->details as $key => $detail ) { if ( '' !== $message ) { $message .= ', '; } $error_detail = $this->parse_error_detail( $detail, $message ); if ( $error_detail ) { $message .= ( $key + 1 ) . ': ' . $error_detail; } } if ( $message ) { $message = $api_response_object->message . '

' . __( 'Szczegóły:', 'woocommerce-paczkomaty-inpost' ) . ' ' . $message; } else { $message = $api_response_object->message; } } else { $message = $api_response_object->message; } return $message; } return $api_response_object->error; } /** * @param mixed $error_detail . * @param string $message . * * @return string * Example error_detail value: * stdClass Object * ( * [receiver] => Array * ( * [0] => stdClass Object * ( * [address] => Array * ( * [0] => stdClass Object * ( * [building_number] => Array * ( * [0] => required * ) * ) * ) * ) * ) * ) */ private function parse_error_detail( $error_detail, $message = '' ) { if ( is_object( $error_detail ) ) { foreach ( $error_detail as $key => $detail ) { $message .= ' ' . $key . ': ' . $this->parse_error_detail( $detail ); } return $message; } if ( is_array( $error_detail ) ) { foreach ( $error_detail as $key => $detail ) { $message .= $this->parse_error_detail( $detail ); } return $message; } return $error_detail . ';'; } /** * @param string $message . * @param mixed $data . */ public function log( $message, $data = null ) { if ( isset( $data ) ) { $message .= ' '; $message .= print_r( $data, true ); } do_action( 'paczkomaty_shipping_method_log', $message ); } }