Initial commit

This commit is contained in:
2020-10-07 10:37:15 +02:00
commit ce5f440392
28157 changed files with 4429172 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
<?php
/**
* Class ColissimoClient
*/
class ColissimoClient
{
const BASE_URL_PRODUCTION = 'https://ws.colissimo.fr';
const BASE_URL_TEST = 'https://ws.colissimo.fr';
const COLISSIMO_WSDL = 'https://ws.colissimo.fr/sls-ws/SlsServiceWS/2.0?wsdl';
/** @var string $baseUrl */
protected $baseUrl;
/** @var AbstractColissimoRequest $request */
private $request;
/**
* ColissimoClient constructor.
* @param int $mode
* @param array $urls
*/
public function __construct($mode = 0, $urls = array())
{
if (is_array($urls) && isset($urls['test']) && isset($urls['production'])) {
$this->baseUrl = (1 === $mode) ? $urls['production'] : $urls['test'];
} else {
$this->baseUrl = (1 === $mode) ? self::BASE_URL_PRODUCTION : self::BASE_URL_TEST;
}
}
/**
* @return mixed
* @throws Exception
*/
public function request()
{
$wsType = constant(get_class($this->request).'::WS_TYPE');
switch ($wsType) {
case 'SOAP':
$method = constant(get_class($this->request).'::WS_METHOD');
$soapClient = new SoapClient(
self::COLISSIMO_WSDL, array(
'exceptions' => 0,
'wsdl_cache' => 0,
'trace' => 1,
'soap_version' => SOAP_1_1,
'encoding' => 'UTF-8',
)
);
$responseBody = $soapClient->__doRequest(
$this->request->getRequest(),
self::COLISSIMO_WSDL,
$method,
'2.0',
0
);
$responseHeader = $soapClient->__getLastResponseHeaders();
preg_match("/HTTP\/\d\.\d\s*\K[\d]+/", $responseHeader, $matches);
$httpCode = $matches[0];
break;
case 'CURL':
if ($this->request->forceEndpoint) {
$url = $this->request->forceEndpoint;
} else {
$url = $this->baseUrl.constant(get_class($this->request).'::WS_PATH');
}
$contentType = array();
if (defined(get_class($this->request).'::WS_CONTENT_TYPE')) {
$contentType = array('Content-Type: '.constant(get_class($this->request).'::WS_CONTENT_TYPE'));
}
$body = $this->request->getRequest();
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => $url,
CURLOPT_POSTFIELDS => $body,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_HEADER => true,
CURLOPT_VERBOSE => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $contentType,
)
);
$response = curl_exec($curl);
if ($response === false) {
throw new Exception('Empty Response.');
}
$curlInfo = curl_getinfo($curl);
$curlError = curl_errno($curl);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$responseHeader = substr($response, 0, $headerSize);
$responseBody = substr($response, $headerSize);
curl_close($curl);
$httpCode = $curlInfo['http_code'];
if ($curlError) {
throw new Exception('cURL error: '.$curlError);
}
break;
default:
throw new Exception('Wrong WS call.');
break;
}
if (!in_array($httpCode, array(200, 201, 400))) {
throw new Exception('Bad HTTP code: '.$httpCode);
}
return $this->request->buildResponse($responseHeader, $responseBody);
}
/**
* @param AbstractColissimoRequest $request
*/
public function setRequest(AbstractColissimoRequest $request)
{
$this->request = $request;
}
}

View File

@@ -0,0 +1,72 @@
<?php
/**
* Class AbstractColissimoRequest
*/
abstract class AbstractColissimoRequest
{
/** @var array $request */
protected $request;
/** @var string $xmlLocation */
protected $xmlLocation;
/** @var string $forceEndpoint */
public $forceEndpoint;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
*/
abstract public function buildResponse($responseHeader, $responseBody);
/**
* @return mixed
*/
abstract public function buildRequest();
/**
* AbstractColissimoRequest constructor.
* @param array $credentials
* @throws Exception
*/
public function __construct(array $credentials)
{
if (!isset($credentials['contract_number']) || !isset($credentials['password'])) {
throw new Exception('Bad credentials.');
}
$this->setIdentification($credentials);
$this->xmlLocation = dirname(__FILE__).'/../xml/';
}
/**
* @param array $credentials
*/
final private function setIdentification(array $credentials)
{
$this->request = array();
$this->request['contractNumber'] = $credentials['contract_number'];
$this->request['password'] = $credentials['password'];
if (isset($credentials['force_endpoint'])) {
$this->forceEndpoint = $credentials['force_endpoint'];
}
}
/**
* @param bool $obfuscatePassword
* @return array|string
*/
public function getRequest($obfuscatePassword = false)
{
if ($obfuscatePassword) {
$request = $this->request;
$request['password'] = '*****';
$request['contractNumber'] = '*****';
return json_encode($request);
}
return json_encode($this->request);
}
}

View File

@@ -0,0 +1,22 @@
<?php
/**
* Class ColissimoCheckGenerateLabelRequest
*/
class ColissimoCheckGenerateLabelRequest extends ColissimoGenerateLabelRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel?';
const WS_CONTENT_TYPE = 'application/json';
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoCheckGenerateLabelResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* Class ColissimoGenerateBordereauRequest
*/
class ColissimoGenerateBordereauRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'SOAP';
const WS_METHOD = 'generateBordereauByParcelsNumbers';
const WS_CONTENT_TYPE = 'application/xml';
/** @var SimpleXMLElement $xml */
public $xml;
/**
* ColissimoGenerateBordereauRequest constructor.
* @param array $credentials
* @throws Exception
*/
public function __construct(array $credentials)
{
parent::__construct($credentials);
$this->xml = simplexml_load_file($this->xmlLocation.self::WS_METHOD.'.xml');
$this->xml->registerXPathNamespace('sls', 'http://sls.ws.coliposte.fr');
$this->setCredentials();
}
/**
* @param array $numbers
*/
public function setParcelsNumbers(array $numbers)
{
$list = $this->xml->xpath('soapenv:Body/sls:generateBordereauByParcelsNumbers/generateBordereauParcelNumberList');
foreach ($numbers as $number) {
$list[0]->addChild('parcelsNumbers', $number);
}
}
/**
*
*/
public function setCredentials()
{
$parcels = $this->xml->xpath('soapenv:Body/sls:generateBordereauByParcelsNumbers');
$parcels[0]->contractNumber = $this->request['contractNumber'];
$parcels[0]->password = $this->request['password'];
}
/**
* @return mixed|void
*/
public function buildRequest()
{
return;
}
/**
* @param bool $obfuscatePassword
* @return string
*/
public function getRequest($obfuscatePassword = false)
{
if ($obfuscatePassword) {
$requestXml = new SimpleXMLElement($this->xml->asXML());
$requestXml->registerXPathNamespace('sls', 'http://sls.ws.coliposte.fr');
$parcels = $requestXml->xpath('soapenv:Body/sls:generateBordereauByParcelsNumbers');
$parcels[0]->password = '****';
$parcels[0]->contractNumber = '****';
$requestJsonString = json_encode($parcels);
return $requestJsonString;
}
return $this->xml->asXML();
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoGenerateBordereauResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,142 @@
<?php
/**
* Class ColissimoGenerateLabelRequest
*/
class ColissimoGenerateLabelRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/sls-ws/SlsServiceWSRest/2.0/generateLabel?';
const WS_CONTENT_TYPE = 'application/json';
/** @var array $output */
protected $output;
/** @var array $senderAddress */
protected $senderAddress;
/** @var array $addresseeAddress */
protected $addresseeAddress;
/** @var array $shipmentOptions */
protected $shipmentOptions;
/** @var array $shipmentServices */
protected $shipmentServices;
/** @var array $customsOptions */
protected $customsOptions;
/** @var array $fields */
protected $fields;
/**
* @param array $output
* @return ColissimoGenerateLabelRequest
*/
public function setOutput($output)
{
$this->output = $output;
return $this;
}
/**
* @param array $senderAddress
* @return ColissimoGenerateLabelRequest
*/
public function setSenderAddress($senderAddress)
{
$this->senderAddress = $senderAddress;
return $this;
}
/**
* @param array $addresseeAddress
* @return ColissimoGenerateLabelRequest
*/
public function setAddresseeAddress($addresseeAddress)
{
$this->addresseeAddress = $addresseeAddress;
return $this;
}
/**
* @param array $shipmentOptions
* @return ColissimoGenerateLabelRequest
*/
public function setShipmentOptions($shipmentOptions)
{
$this->shipmentOptions = $shipmentOptions;
return $this;
}
/**
* @param array $shipmentServices
* @return ColissimoGenerateLabelRequest
*/
public function setShipmentServices($shipmentServices)
{
$this->shipmentServices = $shipmentServices;
return $this;
}
/**
* @param array $customsOptions
* @return ColissimoGenerateLabelRequest
*/
public function setCustomsOptions($customsOptions)
{
$this->customsOptions = $customsOptions;
return $this;
}
/**
* @param array $customField
* @return ColissimoGenerateLabelRequest
*/
public function addCustomField($customField)
{
foreach ($customField as $key => $field) {
$this->fields['customField'][$key] = array(
'key' => $field['key'],
'value' => $field['value'],
);
}
return $this;
}
/**
* @return mixed|void
*/
public function buildRequest()
{
$this->request['outputFormat'] = $this->output;
$this->request['letter']['service'] = $this->shipmentServices;
$this->request['letter']['parcel'] = $this->shipmentOptions;
if (!empty($this->customsOptions)) {
$this->request['letter']['customsDeclarations'] = $this->customsOptions;
}
$this->request['letter']['sender'] = $this->senderAddress;
$this->request['letter']['addressee'] = $this->addresseeAddress;
$this->request['fields'] = $this->fields;
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoGenerateLabelResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,44 @@
<?php
/**
* Class ColissimoMailboxDetailsRequest
*/
class ColissimoMailboxDetailsRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/sls-ws/SlsServiceWSRest/2.0/getListMailBoxPickingDates?';
const WS_CONTENT_TYPE = 'application/json';
/** @var array $senderAddress */
protected $senderAddress;
/**
* @param mixed $senderAddress
* @return ColissimoMailboxDetailsRequest
*/
public function setSenderAddress($senderAddress)
{
$this->senderAddress = $senderAddress;
return $this;
}
/**
* @return void
*/
public function buildRequest()
{
$this->request['sender'] = $this->senderAddress;
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoMailboxDetailsResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,74 @@
<?php
/**
* Class ColissimoPlanPickupRequest
*/
class ColissimoPlanPickupRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/sls-ws/SlsServiceWSRest/2.0/planPickup?';
const WS_CONTENT_TYPE = 'application/json';
/** @var string $parcelNumber */
protected $parcelNumber;
/** @var string $mailboxPickingDate */
protected $mailboxPickingDate;
/** @var array $senderAddress */
protected $senderAddress;
/**
* @param string $parcelNumber
* @return ColissimoPlanPickupRequest
*/
public function setParcelNumber($parcelNumber)
{
$this->parcelNumber = $parcelNumber;
return $this;
}
/**
* @param string $mailboxPickingDate
* @return ColissimoPlanPickupRequest
*/
public function setMailboxPickingDate($mailboxPickingDate)
{
$this->mailboxPickingDate = $mailboxPickingDate;
return $this;
}
/**
* @param array $senderAddress
* @return ColissimoPlanPickupRequest
*/
public function setSenderAddress($senderAddress)
{
$this->senderAddress = $senderAddress;
return $this;
}
/**
* @return void
*/
public function buildRequest()
{
$this->request['parcelNumber'] = $this->parcelNumber;
$this->request['mailBoxPickingDate'] = $this->mailboxPickingDate;
$this->request['sender'] = $this->senderAddress;
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoPlanPickupResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,92 @@
<?php
/**
* Class ColissimoTrackingEnrichiRequest
*/
class ColissimoTrackingEnrichiRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/tracking-unified-ws/TrackingUnifiedServiceWSRest/tracking/getTrackingMessagePickupAdressAndDeliveryDate?';
const WS_CONTENT_TYPE = 'application/json';
const TRACKING_SUBMISSION_CONTACT = 'TRACKING_PARTNER';
/** @var string $lang */
protected $lang;
/** @var string $ip */
protected $ip;
/** @var string $parcelNumber */
protected $parcelNumber;
/**
* ColissimoTrackingEnrichiRequest constructor.
* @param array $credentials
* @throws Exception
*/
public function __construct(array $credentials)
{
parent::__construct($credentials);
$this->request['login'] = $this->request['contractNumber'];
unset($this->request['contractNumber']);
}
/**
* @param mixed $lang
* @return ColissimoTrackingEnrichiRequest
*/
public function setLang($lang)
{
$this->lang = $lang;
return $this;
}
/**
* @param mixed $ip
* @return ColissimoTrackingEnrichiRequest
*/
public function setIp($ip)
{
$this->ip = $ip;
return $this;
}
/**
* @param mixed $parcelNumber
* @return ColissimoTrackingEnrichiRequest
*/
public function setParcelNumber($parcelNumber)
{
$this->parcelNumber = $parcelNumber;
return $this;
}
/**
* @return void
*/
public function buildRequest()
{
$this->request['parcelNumber'] = $this->parcelNumber;
$this->request['ip'] = $this->ip;
$this->request['lang'] = $this->lang;
$this->request['parcelNumber'] = $this->parcelNumber;
$this->request['profil'] = self::TRACKING_SUBMISSION_CONTACT;
return;
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoTrackingEnrichiResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,82 @@
<?php
/**
* Class ColissimoTrackingSimpleRequest
*/
class ColissimoTrackingSimpleRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/tracking-chargeur-cxf/TrackingServiceWS/track';
const WS_CONTENT_TYPE = 'application/xml;charset=UTF-8';
/** @var SimpleXMLElement $xml */
public $xml;
/**
* ColissimoTrackingSimpleRequest constructor.
* @param array $credentials
* @throws Exception
*/
public function __construct(array $credentials)
{
parent::__construct($credentials);
$this->xml = simplexml_load_file($this->xmlLocation.'track.xml');
$this->xml->registerXPathNamespace('char', 'http://chargeur.tracking.geopost.com');
$this->setCredentials();
}
/**
*
*/
public function setCredentials()
{
$track = $this->xml->xpath('soapenv:Body/char:track');
$track[0]->accountNumber = $this->request['contractNumber'];
$track[0]->password = $this->request['password'];
}
public function setSkybillNumber($skybillNumber)
{
$track = $this->xml->xpath('soapenv:Body/char:track');
$track[0]->skybillNumber = $skybillNumber;
}
/**
* @return mixed|void
*/
public function buildRequest()
{
return;
}
/**
* @param bool $obfuscatePassword
* @return string
*/
public function getRequest($obfuscatePassword = false)
{
if ($obfuscatePassword) {
$requestXml = new SimpleXMLElement($this->xml->asXML());
$requestXml->registerXPathNamespace('char', 'http://chargeur.tracking.geopost.com');
$track = $requestXml->xpath('soapenv:Body/char:track');
$track[0]->password = '****';
$track[0]->accountNumber = '****';
$requestJsonString = json_encode($track);
return $requestJsonString;
}
return $this->xml->asXML();
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoTrackingSimpleResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,44 @@
<?php
/**
* Class ColissimoTrackingTimelineRequest
*/
class ColissimoTrackingTimelineRequest extends ColissimoTrackingEnrichiRequest
{
const WS_PATH = '/tracking-timeline-ws/rest/tracking/timeline';
const TRACKING_PROFILE = 'TRACKING_BNUM';
/** @var string $lang */
protected $lang;
/** @var string $ip */
protected $ip;
/** @var string $parcelNumber */
protected $parcelNumber;
/**
* @return void
*/
public function buildRequest()
{
$this->request['parcelNumber'] = $this->parcelNumber;
$this->request['ip'] = $this->ip;
$this->request['lang'] = $this->lang;
$this->request['parcelNumber'] = $this->parcelNumber;
$this->request['profil'] = self::TRACKING_PROFILE;
return;
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoTrackingTimelineResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,58 @@
<?php
/**
* Class ColissimoWidgetAuthenticationRequest
*/
class ColissimoWidgetAuthenticationRequest extends AbstractColissimoRequest
{
const WS_TYPE = 'CURL';
const WS_PATH = '/widget-point-retrait/rest/authenticate.rest';
const WS_CONTENT_TYPE = 'application/x-www-form-urlencoded';
/**
* ColissimoWidgetAuthenticationRequest constructor.
* @param array $credentials
* @throws Exception
*/
public function __construct(array $credentials)
{
parent::__construct($credentials);
$this->request['login'] = $this->request['contractNumber'];
unset($this->request['contractNumber']);
}
/**
* @return void
*/
public function buildRequest()
{
return;
}
/**
* @param bool $obfuscatePassword
* @return array|string
*/
public function getRequest($obfuscatePassword = false)
{
if ($obfuscatePassword) {
$request = $this->request;
$request['password'] = '****';
return json_encode($request);
}
return http_build_query($this->request);
}
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public function buildResponse($responseHeader, $responseBody)
{
return ColissimoWidgetAuthenticationResponse::buildFromResponse($responseHeader, $responseBody);
}
}

View File

@@ -0,0 +1,35 @@
<?php
/**
* 2007-2020 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,13 @@
<?php
/**
* Class AbstractColissimoResponse
*/
class AbstractColissimoResponse
{
/** @var array $messages */
public $messages;
/** @var array $response */
public $response;
}

View File

@@ -0,0 +1,25 @@
<?php
/**
* Class ColissimoCheckGenerateLabelResponse
*/
class ColissimoCheckGenerateLabelResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$checkGenerateLabelResponse = new self();
$responseArray = json_decode($responseBody, true);
if (!empty($responseArray)) {
$checkGenerateLabelResponse->messages = $responseArray['messages'];
$checkGenerateLabelResponse->response = $responseArray;
}
return $checkGenerateLabelResponse;
}
}

View File

@@ -0,0 +1,54 @@
<?php
/**
* Class ColissimoGenerateBordereauResponse
*/
class ColissimoGenerateBordereauResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/** @var string $bordereau */
public $bordereau;
/** @var array $bordereauHeader */
public $bordereauHeader;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$soapResponseParser = new ColissimoResponseParser();
try {
$parsedResponse = $soapResponseParser->parseBody($responseBody);
$parsedHeaders = $soapResponseParser->parseHeaders($responseHeader);
} catch (Exception $e) {
throw new Exception($e->getMessage());
}
$generateBordereauResponse = new self();
$contentType = $soapResponseParser->parseContentType($parsedHeaders);
if (isset($parsedResponse[$contentType])) {
$xml = new SimpleXMLElement($parsedResponse[$contentType]);
$xml->registerXPathNamespace('ns2', 'http://sls.ws.coliposte.fr');
$xml->registerXPathNamespace('xop', 'http://www.w3.org/2004/08/xop/include');
$bordereau = $xml->xpath('soap:Body/ns2:generateBordereauByParcelsNumbersResponse/return/bordereau/bordereauDataHandler/xop:Include');
if (!empty($bordereau)) {
$cidBordereau = substr($bordereau[0]->attributes()->href->__toString(), 4);
if (isset($parsedResponse['<'.$cidBordereau.'>'])) {
$generateBordereauResponse->bordereau = base64_encode($parsedResponse['<'.$cidBordereau.'>']);
}
}
$bordereauHeader = $xml->xpath('soap:Body/ns2:generateBordereauByParcelsNumbersResponse/return/bordereau/bordereauHeader');
if (!empty($bordereauHeader)) {
$generateBordereauResponse->bordereauHeader = json_decode(json_encode($bordereauHeader[0]), true);
$generateBordereauResponse->response['bordereauHeader'] = $generateBordereauResponse->bordereauHeader;
}
$messages = $xml->xpath('soap:Body/ns2:generateBordereauByParcelsNumbersResponse/return/messages');
$generateBordereauResponse->messages = json_decode(json_encode($messages), true);
$generateBordereauResponse->response['messages'] = $generateBordereauResponse->messages;
}
return $generateBordereauResponse;
}
}

View File

@@ -0,0 +1,48 @@
<?php
/**
* Class ColissimoGenerateLabelResponse
*/
class ColissimoGenerateLabelResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/** @var string $label */
public $label;
/** @var string $cn23 */
public $cn23;
/** @var string $parcelNumber */
public $parcelNumber;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$jsonResponseParser = new ColissimoResponseParser();
try {
$parsedResponse = $jsonResponseParser->parseBody($responseBody);
} catch (Exception $e) {
throw new Exception($e->getMessage());
}
$generateLabelResponse = new self();
if (isset($parsedResponse['<jsonInfos>'])) {
$generateLabelResponse->response = json_decode($parsedResponse['<jsonInfos>'], true);
$generateLabelResponse->messages = $generateLabelResponse->response['messages'];
}
if (isset($generateLabelResponse->response['labelV2Response']['parcelNumber'])) {
$generateLabelResponse->parcelNumber = $generateLabelResponse->response['labelV2Response']['parcelNumber'];
}
if (isset($parsedResponse['<label>'])) {
$generateLabelResponse->label = base64_encode($parsedResponse['<label>']);
}
if (isset($parsedResponse['<cn23>'])) {
$generateLabelResponse->cn23 = base64_encode($parsedResponse['<cn23>']);
}
return $generateLabelResponse;
}
}

View File

@@ -0,0 +1,45 @@
<?php
/**
* Class ColissimoMailboxDetailsResponse
*/
class ColissimoMailboxDetailsResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/** @var string $maxPickingHour */
public $maxPickingHour;
/** @var string $validityTime */
public $validityTime;
/** @var array $pickingDates */
public $pickingDates;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$mailboxDetailsResponse = new self();
$responseArray = json_decode($responseBody, true);
if (!empty($responseArray)) {
$mailboxDetailsResponse->messages = $responseArray['messages'];
$mailboxDetailsResponse->response = $responseArray;
if (isset($responseArray['mailBoxPickingDateMaxHour'])) {
$mailboxDetailsResponse->maxPickingHour = $responseArray['mailBoxPickingDateMaxHour'];
}
if (isset($responseArray['validityTime'])) {
$mailboxDetailsResponse->validityTime = $responseArray['validityTime'];
}
if (isset($responseArray['mailBoxPickingDates'])) {
foreach ($responseArray['mailBoxPickingDates'] as $mailBoxPickingDate) {
$mailboxDetailsResponse->pickingDates[] = $mailBoxPickingDate / 1000;
}
}
}
return $mailboxDetailsResponse;
}
}

View File

@@ -0,0 +1,25 @@
<?php
/**
* Class ColissimoPlanPickupResponse
*/
class ColissimoPlanPickupResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$planPickupResponse = new self();
$responseArray = json_decode($responseBody, true);
if (!empty($responseArray)) {
$planPickupResponse->messages = $responseArray['messages'];
$planPickupResponse->response = $responseArray;
}
return $planPickupResponse;
}
}

View File

@@ -0,0 +1,149 @@
<?php
/**
* Class ColissimoResponseParser
*/
class ColissimoResponseParser
{
/** Regex for separator */
const UUID = '/--uuid:/';
/** New line character in Response */
const NEW_LINE_CHAR = "\r\n";
/** @var string $uuid */
private $uuid;
/**
* @param string $rawHeaders
* @return array
*/
public function parseHeaders($rawHeaders)
{
$headers = array();
$key = '';
foreach (explode("\n", $rawHeaders) as $i => $h) {
$h = explode(':', $h, 2);
if (isset($h[1])) {
if (!isset($headers[$h[0]])) {
$headers[$h[0]] = trim($h[1]);
} elseif (is_array($headers[$h[0]])) {
$headers[$h[0]] = array_merge($headers[$h[0]], array(trim($h[1])));
} else {
$headers[$h[0]] = array_merge(array($headers[$h[0]]), array(trim($h[1])));
}
$key = $h[0];
} else {
if (substr($h[0], 0, 1) == "\t") {
$headers[$key] .= "\r\n\t".trim($h[0]);
} elseif (!$key) {
$headers[0] = trim($h[0]);
}
}
}
return $headers;
}
/**
* @param string $body
* @return array
* @throws Exception
*/
public function parseBody($body)
{
$contents = $this->splitContent($body);
if (!is_array($contents) || empty($contents)) {
throw new Exception('Empty response.');
}
$parsedResponse = array();
foreach ($contents as $content) {
if ($this->uuid == null) {
$uuidStart = strpos($content, self::UUID, 0) + strlen(self::UUID);
$uuidEnd = strpos($content, self::NEW_LINE_CHAR, $uuidStart);
$this->uuid = substr($content, $uuidStart, $uuidEnd - $uuidStart);
}
$headers = $this->extractHeader($content);
if (count($headers) > 0) {
if (isset($headers['Content-ID'])) {
$parsedResponse[$headers['Content-ID']] = trim(substr($content, $headers['offsetEnd']));
}
}
}
if (empty($parsedResponse)) {
throw new Exception('Response cannot be parsed.');
}
return $parsedResponse;
}
/**
* @param array $parsedHeaders
* @return bool|string
*/
public function parseContentType($parsedHeaders)
{
if (!isset($parsedHeaders['Content-Type'])) {
return false;
}
$contentTypes = explode(';', $parsedHeaders['Content-Type']);
foreach ($contentTypes as $contentType) {
if (strpos($contentType, 'start=') !== false) {
return substr($contentType, 8, -1);
}
}
return false;
}
/**
* @param string $response
* @return array
*/
private static function splitContent($response)
{
$contents = array();
$matches = array();
preg_match_all(self::UUID, $response, $matches, PREG_OFFSET_CAPTURE);
for ($i = 0; $i < count($matches[0]) - 1; $i++) {
if ($i + 1 < count($matches[0])) {
$contents[$i] = substr(
$response,
$matches[0][$i][1],
$matches[0][$i + 1][1] - $matches[0][$i][1]
);
} else {
$contents[$i] = substr(
$response,
$matches[0][$i][1],
strlen($response)
);
}
}
return $contents;
}
/**
* @param string $part
* @return array
*/
private function extractHeader($part)
{
$header = array();
$headerLineStart = strpos($part, 'Content-', 0);
$endLine = 0;
while ($headerLineStart !== false) {
$header['offsetStart'] = $headerLineStart;
$endLine = strpos($part, self::NEW_LINE_CHAR, $headerLineStart);
$headerLine = explode(': ', substr($part, $headerLineStart, $endLine - $headerLineStart));
$header[$headerLine[0]] = $headerLine[1];
$headerLineStart = strpos($part, 'Content-', $endLine);
}
$header['offsetEnd'] = $endLine;
return $header;
}
}

View File

@@ -0,0 +1,14 @@
<?php
/**
* Interface ColissimoReturnedResponseInterface
*/
interface ColissimoReturnedResponseInterface
{
/**
* @param string $responseHeader
* @param string $responseBody
* @return mixed
*/
public static function buildFromResponse($responseHeader, $responseBody);
}

View File

@@ -0,0 +1,54 @@
<?php
/**
* Class ColissimoTrackingEnrichiResponse
*/
class ColissimoTrackingEnrichiResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/** @var array $parcel */
public $parcel;
/** @var array $error */
public $error;
/** @var array $message */
public $message;
/** @var string $code */
public $code;
/** @var string $messageCode */
public $messageCode;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$trackingEnrichiResponse = new self();
$responseArray = json_decode($responseBody, true);
if (!empty($responseArray)) {
$trackingEnrichiResponse->response = $responseArray;
if (isset($responseArray['code'])) {
$trackingEnrichiResponse->code = $responseArray['code'];
}
if (isset($responseArray['messageCode'])) {
$trackingEnrichiResponse->messageCode = $responseArray['messageCode'];
}
if (isset($responseArray['message'])) {
$trackingEnrichiResponse->message = $responseArray['message'];
}
if (isset($responseArray['error'])) {
$trackingEnrichiResponse->error = $responseArray['error'];
}
if (isset($responseArray['parcel'])) {
$trackingEnrichiResponse->parcel = $responseArray['parcel'];
}
}
return $trackingEnrichiResponse;
}
}

View File

@@ -0,0 +1,45 @@
<?php
/**
* Class ColissimoTrackingSimpleResponse
*/
class ColissimoTrackingSimpleResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
public $errorMessage;
public $errorCode;
public $eventCode;
public $eventDate;
public $eventLibelle;
public $eventSite;
public $recipientCity;
public $recipientCountryCode;
public $recipientZipCode;
public $skybillNumber;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$trackingSimpleResponse = new self();
$xml = new SimpleXMLElement($responseBody);
$xml->registerXPathNamespace('ns1', 'http://chargeur.tracking.geopost.com/');
$return = $xml->xpath('soap:Body/ns1:trackResponse/return');
$array = json_decode(json_encode($return[0]), true);
$trackingSimpleResponse->errorMessage = isset($array['errorMessage']) ? $array['errorMessage'] : null;
$trackingSimpleResponse->errorCode = isset($array['errorCode']) ? $array['errorCode'] : null;
$trackingSimpleResponse->eventCode = isset($array['eventCode']) ? $array['eventCode'] : null;
$trackingSimpleResponse->eventDate = isset($array['eventDate']) ? $array['eventDate'] : null;
$trackingSimpleResponse->eventLibelle = isset($array['eventLibelle']) ? $array['eventLibelle'] : null;
$trackingSimpleResponse->eventSite = isset($array['eventSite']) ? $array['eventSite'] : null;
$trackingSimpleResponse->recipientCity = isset($array['recipientCity']) ? $array['recipientCity'] : null;
$trackingSimpleResponse->recipientCountryCode = isset($array['recipientCountryCode']) ? $array['recipientCountryCode'] : null;
$trackingSimpleResponse->recipientZipCode = isset($array['recipientZipCode']) ? $array['recipientZipCode'] : null;
$trackingSimpleResponse->skybillNumber = isset($array['skybillNumber']) ? $array['skybillNumber'] : null;
return $trackingSimpleResponse;
}
}

View File

@@ -0,0 +1,56 @@
<?php
/**
* Class ColissimoTrackingTimelineResponse
*/
class ColissimoTrackingTimelineResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/** @var array $status */
public $status;
/** @var array $userMessages */
public $userMessages;
/** @var array $parcelDetails */
public $parcelDetails;
/** @var array $events */
public $events;
/** @var array $timeline */
public $timeline;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$trackingTimelineResponse = new self();
$responseArray = json_decode($responseBody, true);
if (!empty($responseArray)) {
$trackingTimelineResponse->response = $responseArray;
if (isset($responseArray['status'])) {
$trackingTimelineResponse->status = $responseArray['status'];
}
if (isset($responseArray['message'])) {
$trackingTimelineResponse->userMessages = $responseArray['message'];
}
if (isset($responseArray['parcel'])) {
$trackingTimelineResponse->parcelDetails = $responseArray['parcel'];
if (isset($responseArray['parcel']['event'])) {
$trackingTimelineResponse->events = $responseArray['parcel']['event'];
unset($trackingTimelineResponse->parcelDetails['event']);
}
if (isset($responseArray['parcel']['step'])) {
$trackingTimelineResponse->timeline = $responseArray['parcel']['step'];
unset($trackingTimelineResponse->parcelDetails['step']);
}
}
}
return $trackingTimelineResponse;
}
}

View File

@@ -0,0 +1,28 @@
<?php
/**
* Class ColissimoWidgetAuthenticationResponse
*/
class ColissimoWidgetAuthenticationResponse extends AbstractColissimoResponse implements ColissimoReturnedResponseInterface
{
/** @var string $token */
public $token;
/**
* @param mixed $responseHeader
* @param mixed $responseBody
* @return mixed
* @throws Exception
*/
public static function buildFromResponse($responseHeader, $responseBody)
{
$widgetAuthenticationResponse = new self();
$responseArray = json_decode($responseBody, true);
if (!empty($responseArray)) {
$widgetAuthenticationResponse->response = $responseArray;
$widgetAuthenticationResponse->token = $responseArray['token'];
}
return $widgetAuthenticationResponse;
}
}

View File

@@ -0,0 +1,35 @@
<?php
/**
* 2007-2020 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,35 @@
<?php
/**
* 2007-2020 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,25 @@
<?php
require_once(dirname(__FILE__).'/ColissimoClient.php');
require_once(dirname(__FILE__).'/Request/AbstractColissimoRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoGenerateLabelRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoGenerateBordereauRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoWidgetAuthenticationRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoMailboxDetailsRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoTrackingEnrichiRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoTrackingSimpleRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoCheckGenerateLabelRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoPlanPickupRequest.php');
require_once(dirname(__FILE__).'/Request/ColissimoTrackingTimelineRequest.php');
require_once(dirname(__FILE__).'/Response/ColissimoReturnedResponseInterface.php');
require_once(dirname(__FILE__).'/Response/AbstractColissimoResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoResponseParser.php');
require_once(dirname(__FILE__).'/Response/ColissimoGenerateLabelResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoGenerateBordereauResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoWidgetAuthenticationResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoMailboxDetailsResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoTrackingEnrichiResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoTrackingSimpleResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoCheckGenerateLabelResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoPlanPickupResponse.php');
require_once(dirname(__FILE__).'/Response/ColissimoTrackingTimelineResponse.php');

View File

@@ -0,0 +1,13 @@
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sls="http://sls.ws.coliposte.fr">
<soapenv:Header/>
<soapenv:Body>
<sls:generateBordereauByParcelsNumbers>
<contractNumber></contractNumber>
<password></password>
<generateBordereauParcelNumberList>
<!-- 1 or more repetitions: -->
<!-- <parcelsNumbers>xxxxx</parcelsNumbers> -->
</generateBordereauParcelNumberList>
</sls:generateBordereauByParcelsNumbers>
</soapenv:Body>
</soapenv:Envelope>

View File

@@ -0,0 +1,35 @@
<?php
/**
* 2007-2020 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,11 @@
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:char="http://chargeur.tracking.geopost.com/">
<soapenv:Header/>
<soapenv:Body>
<char:track>
<accountNumber></accountNumber>
<password></password>
<skybillNumber></skybillNumber>
</char:track>
</soapenv:Body>
</soapenv:Envelope>