gruene-seele/dev/dhl-for-woocommerce/includes/pr-dhl-api/abstract-pr-dhl-api-rest.php
Kevin Adametz 0f641ef33a Housekeeping: offene Dev-Dateien eingecheckt + Sidebar „Bestellungen"→„Versand"
- Sidebar-Menü „Bestellungen" in „Versand" umbenannt (layout-sidenav), sonst nur
  Blade-Formatierung.
- Entwicklungspläne in ISO-Datumsformat umbenannt (entwicklungsplan-aktualisiert-*).
- dev/dhl-for-woocommerce/ (DHL-Plugin) + dev/partnercenter-api.zip + PastedGraphic
  hinzugefügt.
- .claude/ bewusst NICHT eingecheckt (lokale Claude-Code-Konfiguration).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-28 12:04:41 +00:00

380 lines
11 KiB
PHP

<?php
if (! defined('ABSPATH')) {
exit;
} // Exit if accessed directly
abstract class PR_DHL_API_REST
{
const WP_POST_TIMEOUT = 30;
/**
* The request endpoint
*
* @var string
*/
protected $endpoint = '';
/**
* The query string
*
* @var string
*/
private $query = [];
/**
* The request response
*
* @var array
*/
protected $response = null;
/**
* @var PR_DHL_API_Auth_REST
*/
protected $dhl_rest_auth;
/**
* @var Integrater
*/
protected $id = '';
/**
* @var string
*/
protected $token_bearer = '';
/**
* @var array
*/
protected $remote_header = [];
/**
* @var string
*/
protected $query_string = '';
/**
* @var array
*/
protected $body_request = [];
/**
* DHL_Api constructor.
*
* @param string $api_key, $api_secret
*/
public function __construct()
{
try {
$this->dhl_rest_auth = PR_DHL_API_Auth_REST::get_instance();
} catch (Exception $e) {
throw $e;
}
}
/**
* Method to set id
*/
public function set_id($id)
{
$this->id = $id;
}
/**
* Get the id
*
* @return $id
*/
public function get_id()
{
return $this->id;
}
/**
* Method to set endpoint
*/
protected function set_endpoint($endpoint)
{
$this->endpoint = $endpoint;
}
/**
* Get the endpoint
*
* @return string
*/
protected function get_endpoint()
{
return $this->endpoint;
}
/**
* @return string
*/
protected function get_query()
{
return $this->query;
}
/**
* @param string $query
*/
protected function set_query($query)
{
$this->query = $query;
}
/**
* Get response
*
* @return array
*/
public function get_response()
{
return $this->response;
}
/**
* Clear the response
*
* @return bool
*/
private function clear_response()
{
$this->response = null;
return true;
}
public function get_access_token($client_id, $client_secret)
{
$this->token_bearer = $this->dhl_rest_auth->get_access_token($client_id, $client_secret);
return $this->token_bearer;
}
public function delete_access_token()
{
$this->dhl_rest_auth->delete_access_token();
}
public function post_request($client_id, $client_secret)
{
$this->set_header($this->get_access_token($client_id, $client_secret));
$wp_request_url = PR_DHL()->get_api_url().$this->get_endpoint().'?'.$this->get_query_string();
$wp_request_headers = $this->get_header();
$this->set_message();
$wp_request_body = $this->get_message();
PR_DHL()->log_msg('POST URL: '.$wp_request_url);
// PR_DHL()->log_msg( 'POST Header: ' . print_r( $wp_request_headers, true ) );
PR_DHL()->log_msg('POST Body: '.$wp_request_body);
$wp_dhl_rest_response = wp_remote_post(
$wp_request_url,
[
'headers' => $wp_request_headers,
'body' => $wp_request_body,
'timeout' => self::WP_POST_TIMEOUT,
]
);
$response_code = wp_remote_retrieve_response_code($wp_dhl_rest_response);
$response_body = json_decode(wp_remote_retrieve_body($wp_dhl_rest_response));
$session_id = wp_remote_retrieve_header($wp_dhl_rest_response, 'x-correlationid');
PR_DHL()->log_msg('POST Response Header Session ID: '.$session_id);
PR_DHL()->log_msg('POST Response Code: '.$response_code);
PR_DHL()->log_msg('POST Response Body: '.print_r($response_body, true));
switch ($response_code) {
case '201':
break;
case '400':
$error_message = str_replace('/', ' / ', $response_body->message);
if (isset($response_body->backendError->message)) {
$error_message .= ' '.$response_body->backendError->message;
}
throw new Exception(esc_html__('400 - ', 'dhl-for-woocommerce').esc_html($error_message));
break;
case '401':
throw new Exception(esc_html__('401 - Unauthorized Access - Invalid token or Authentication Header parameter', 'dhl-for-woocommerce'));
break;
case '408':
throw new Exception(esc_html__('408 - Request Timeout', 'dhl-for-woocommerce'));
break;
case '429':
throw new Exception(esc_html__('429 - Too many requests in given amount of time', 'dhl-for-woocommerce'));
break;
case '503':
throw new Exception(esc_html__('503 - Service Unavailable', 'dhl-for-woocommerce'));
break;
default:
if (empty($response_body->message)) {
$error_message = esc_html__('POST error or timeout occured. Please try again later.', 'dhl-for-woocommerce');
} else {
$error_message = str_replace('/', ' / ', $response_body->message);
}
PR_DHL()->log_msg('POST Error: '.$response_code.' - '.$error_message);
throw new Exception(esc_html($response_code).' - '.esc_html($error_message));
break;
}
return $response_body;
}
public function get_request()
{
$rest_auth = '';
$api_url = PR_DHL()->get_api_url();
if (is_array($api_url)) {
$rest_auth = $this->get_basic_auth_encode($api_url['user'], $api_url['password']);
$api_url = $api_url['auth_url'];
}
$this->set_header($rest_auth);
$wp_request_url = $api_url.$this->get_endpoint().'?'.$this->get_query_string();
$wp_request_headers = $this->get_header();
PR_DHL()->log_msg('GET URL: '.$wp_request_url);
$wp_dhl_rest_response = wp_remote_get(
$wp_request_url,
[
'headers' => $wp_request_headers,
'timeout' => self::WP_POST_TIMEOUT,
]
);
$response_code = wp_remote_retrieve_response_code($wp_dhl_rest_response);
$response_body = json_decode(wp_remote_retrieve_body($wp_dhl_rest_response));
PR_DHL()->log_msg('GET Response Code: '.$response_code);
PR_DHL()->log_msg('GET Response Body: '.print_r($response_body, true));
switch ($response_code) {
case '200':
case '201':
break;
case '400':
$error_message = ! empty($response_body->message) ? str_replace('/', ' / ', $response_body->message) : esc_html__('Unknown Error!', 'dhl-for-woocommerce');
throw new Exception(esc_html__('400 - ', 'dhl-for-woocommerce').esc_html($error_message));
break;
case '401':
throw new Exception(esc_html__('401 - Unauthorized Access - Invalid token or Authentication Header parameter', 'dhl-for-woocommerce'));
break;
case '408':
throw new Exception(esc_html__('408 - Request Timeout', 'dhl-for-woocommerce'));
break;
case '429':
throw new Exception(esc_html__('429 - Too many requests in given amount of time', 'dhl-for-woocommerce'));
break;
case '503':
throw new Exception(esc_html__('503 - Service Unavailable', 'dhl-for-woocommerce'));
break;
default:
if (empty($response_body->message)) {
$error_message = esc_html__('GET error or timeout occured. Please try again later.', 'dhl-for-woocommerce');
} else {
$error_message = str_replace('/', ' / ', $response_body->message);
}
PR_DHL()->log_msg('GET Error: '.$response_code.' - '.$error_message);
throw new Exception(esc_html($response_code).' - '.esc_html($error_message));
break;
}
return $response_body;
}
protected function get_basic_auth_encode($user, $pass)
{
return 'Basic '.base64_encode($user.':'.$pass);
}
protected function set_header($authorization = '')
{
$wp_version = get_bloginfo('version');
$dhl_header['Content-Type'] = 'application/json';
$dhl_header['Accept'] = 'application/json';
$dhl_header['Authorization'] = 'Bearer '.$authorization;
$dhl_header['User-Agent'] = 'WooCommerce/'.WC_VERSION.' (WordPress/'.$wp_version.') DHL-plug-in/'.PR_DHL_VERSION;
$this->remote_header = array_merge($this->remote_header, $dhl_header);
}
protected function get_header()
{
return $this->remote_header;
}
abstract protected function set_query_string();
protected function get_query_string()
{
return $this->query_string;
}
protected function set_message() {}
protected function get_message()
{
return $this->body_request;
}
protected function validate_field($key, $value)
{
try {
switch ($key) {
case 'pickup':
$this->validate($value, 'string', 5, 10);
break;
case 'distribution':
$this->validate($value, 'string', 6, 6);
break;
}
} catch (Exception $e) {
throw $e;
}
}
protected function validate($value, $type = 'int', $min_len = 0, $max_len = 0)
{
switch ($type) {
case 'string':
if ((strlen($value) < $min_len) || (strlen($value) > $max_len)) {
if ($min_len == $max_len) {
/* translators: %s is the required number of characters */
throw new Exception(sprintf(esc_html__('The value must be %s characters.', 'dhl-for-woocommerce'), esc_attr($min_len)));
} else {
/* translators: %1$s is the minimum number of characters, %2$s is the maximum number of characters */
throw new Exception(sprintf(esc_html__('The value must be between %1$s and %2$s characters.', 'dhl-for-woocommerce'), esc_attr($min_len), esc_attr($max_len)));
}
}
break;
case 'int':
if (! is_numeric($value)) {
throw new Exception(esc_html__('The value must be a number', 'dhl-for-woocommerce'));
}
break;
}
}
// abstract protected function parse_response( );
}