gruene-seele/dev/dhl-for-woocommerce/includes/pr-dhl-api/class-pr-dhl-api-auth-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

191 lines
4.7 KiB
PHP

<?php
if (! defined('ABSPATH')) {
exit;
} // Exit if accessed directly
// Singleton API connection class
class PR_DHL_API_Auth_REST
{
/**
* define Auth API endpoint
*/
const PR_DHL_REST_AUTH_END_POINT = '/account/v1/auth/accesstoken';
/**
* @var string
*/
protected $access_token;
/**
* @var time
*/
protected $token_expires = 0;
/**
* @var string
*/
protected $token_type;
/**
* @var string
*/
protected $token_scope;
/**
* @var string
*/
private $client_id;
/**
* @var string
*/
private $client_secret;
/**
* @var PR_DHL_API_Auth_REST
*/
private static $_instance; // The single instance
/**
* constructor.
*/
private function __construct() {}
// Magic method clone is empty to prevent duplication of connection
private function __clone() {}
// Stopping unserialize of object
public function __wakeup() {}
public static function get_instance()
{
if ((! self::$_instance)) {
self::$_instance = new self;
}
return self::$_instance;
}
/**
* @return string
*/
public function get_access_token($client_id, $client_secret)
{
// Load transient token
$this->get_saved_token($client_id, $client_secret);
if ($this->is_access_token_empty()) {
try {
$this->request_access_token($client_id, $client_secret);
} catch (Exception $e) {
throw $e;
}
}
return $this->access_token;
}
public function delete_access_token()
{
PR_DHL()->log_msg('Delete Transient - Access Token');
delete_transient('_dhl_auth_token_rest');
}
/**
* @param string $access_token
*/
protected function set_access_token($access_token, $expires_in = 0, $token_type = '', $token_scope = '')
{
if (! empty($expires_in)) {
// $token_expires = time() + $expires_in;
set_transient('_dhl_auth_token_rest', $access_token, $expires_in);
PR_DHL()->log_msg('Set Transient - Access Token');
}
$this->access_token = $access_token;
$this->token_type = $token_type;
$this->token_scope = $token_scope;
}
private function get_saved_token($client_id, $client_secret)
{
// if( $this->is_key_match($client_id, $client_secret) ) {
// TRANSIENT MIGHT BE BEING USED IF KEY AND SECRET ARE NEW, EDGE CASE SO MIGHT BE OK!
$transient_token = get_transient('_dhl_auth_token_rest');
PR_DHL()->log_msg('Get Transient - Access Token');
$this->set_access_token($transient_token);
// }
}
/**
* @return bool
*/
protected function is_access_token_empty()
{
return empty($this->access_token);
}
/**
* Get the signed URL.
* The signed URL is fetched by doing an OAuth request.
*
*
* @return string
*
* @throws Exception
*/
protected function request_access_token($client_id, $client_secret)
{
$this->client_id = $client_id;
$this->client_secret = $client_secret;
if (empty($this->client_id) || empty($this->client_secret)) {
throw new Exception(esc_html__('The "Cliend Id" or "Client Secret" is empty.', 'dhl-for-woocommerce'));
}
$wp_request_headers = [
'Authorization' => 'Basic '.base64_encode($this->client_id.':'.$this->client_secret),
];
$wp_request_url = PR_DHL()->get_api_url().self::PR_DHL_REST_AUTH_END_POINT;
PR_DHL()->log_msg('Authorization URL: '.$wp_request_url);
$wp_auth_response = wp_remote_get(
$wp_request_url,
['headers' => $wp_request_headers]
);
$response_code = wp_remote_retrieve_response_code($wp_auth_response);
$response_body = json_decode(wp_remote_retrieve_body($wp_auth_response));
PR_DHL()->log_msg('Authorization Response: '.$response_code);
switch ($response_code) {
case '200':
$this->set_access_token($response_body->access_token, $response_body->expires_in, $response_body->token_type, $response_body->scope);
break;
case '401':
default:
throw new Exception(esc_html__('Authentication failed: Please, check client ID and secret in the DHL shipping settings', 'dhl-for-woocommerce'));
break;
}
}
public function is_key_match($client_id, $client_secret)
{
if (($this->client_id == $client_id) && ($this->client_secret == $client_secret)) {
return true;
} else {
return false;
}
}
}