Skip to content
This repository was archived by the owner on May 16, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 130 additions & 14 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,41 @@

namespace BlueMedia;

use BlueMedia\Common\Builder\ServiceDtoBuilder;
use BlueMedia\Common\Enum\ClientEnum;
use BlueMedia\Common\Parser\ServiceResponseParser;
use BlueMedia\Common\Util\EnvironmentRequirements;
use BlueMedia\Confirmation\Builder\ConfirmationVOBuilder;
use BlueMedia\HttpClient\HttpClientInterface;
use BlueMedia\Hash\HashChecker;
use BlueMedia\HttpClient\HttpClient;
use BlueMedia\HttpClient\HttpClientInterface;
use BlueMedia\HttpClient\ValueObject\Request;
use BlueMedia\HttpClient\ValueObject\Response;
use BlueMedia\Itn\Builder\ItnDtoBuilder;
use BlueMedia\Itn\Builder\ItnResponseBuilder;
use BlueMedia\Itn\Builder\ItnVOBuilder;
use BlueMedia\Itn\Decoder\ItnDecoder;
use BlueMedia\Serializer\SerializableInterface;
use BlueMedia\Transaction\View;
use BlueMedia\Itn\ValueObject\Itn;
use BlueMedia\HttpClient\HttpClient;
use BlueMedia\Common\Enum\ClientEnum;
use BlueMedia\Itn\Builder\ItnDtoBuilder;
use BlueMedia\PaywayList\Dto\PaywayListDto;
use BlueMedia\Itn\Builder\ItnResponseBuilder;
use BlueMedia\HttpClient\ValueObject\Request;
use BlueMedia\HttpClient\ValueObject\Response;
use BlueMedia\Common\Builder\ServiceDtoBuilder;
use BlueMedia\Common\Parser\ServiceResponseParser;
use BlueMedia\Common\Util\EnvironmentRequirements;
use BlueMedia\PaywayList\ValueObject\PaywayListResponse\PaywayListResponse;
use BlueMedia\Recurring\Builder\RecurringDtoBuilder;
use BlueMedia\Recurring\Parser\RecurringResponseParser;
use BlueMedia\RegulationList\Dto\RegulationListDto;
use BlueMedia\RegulationList\ValueObject\RegulationListResponse\RegulationListResponse;
use BlueMedia\Rpan\Builder\RpanBuilder;
use BlueMedia\Rpan\Builder\RpanDtoBuilder;
use BlueMedia\Rpan\Builder\RpanVOBuilder;
use BlueMedia\Rpan\Decoder\RpanDecoder;
use BlueMedia\Rpan\ValueObject\Rpan;
use BlueMedia\Rpdn\Builder\RpdnBuilder;
use BlueMedia\Rpdn\Builder\RpdnDtoBuilder;
use BlueMedia\Rpdn\Builder\RpdnVOBuilder;
use BlueMedia\Rpdn\Decoder\RpdnDecoder;
use BlueMedia\Rpdn\ValueObject\Rpdn;
use BlueMedia\Serializer\SerializableInterface;
use BlueMedia\Transaction\Builder\TransactionDtoBuilder;
use BlueMedia\Transaction\Parser\TransactionResponseParser;
use BlueMedia\PaywayList\ValueObject\PaywayListResponse\PaywayListResponse;
use BlueMedia\RegulationList\ValueObject\RegulationListResponse\RegulationListResponse;
use BlueMedia\Transaction\View;

final class Client
{
Expand Down Expand Up @@ -117,6 +129,30 @@ public function doTransactionInit(array $transactionData): Response
return $parser->parse(true);
}

/**
* Initialize deactivation recurring.
* Returns recurring information.
*
* @param array $transactionData
*
* @return Response
* @api
*/
public function doRecurringDeactivationInit(array $recurringData): Response
{
$recurringData['recurringDeactivation']['messageID'] = bin2hex(random_bytes(ClientEnum::MESSAGE_ID_LENGTH));
$recurringDeactivationDto = RecurringDtoBuilder::build($recurringData, $this->configuration);

$recurringDeactivationDto->setRequest(new Request(
$recurringDeactivationDto->getGatewayUrl() . ClientEnum::DEACTIVATE_RECURRING_ROUTE,
[self::HEADER => self::CONTINUE_HEADER]
));

$parser = new RecurringResponseParser($this->httpClient->post($recurringDeactivationDto), $this->configuration);

return $parser->parse();
}

/**
* Process ITN requests.
*
Expand All @@ -131,6 +167,34 @@ public function doItnIn(string $itn): Response
return new Response($itnDto->getItn());
}

/**
* Process RPAN requests.
*
* @param string $rpan encoded with base64
* @return Response
* @api
*/
public function doRpanIn(string $rpan): Response
{
$rpanDto = RpanDtoBuilder::build(RpanDecoder::decode($rpan));

return new Response($rpanDto->getRpan());
}

/**
* Process RPDN requests.
*
* @param string $rpdn encoded with base64
* @return Response
* @api
*/
public function doRpdnIn(string $rpdn): Response
{
$rpdnDto = RpdnDtoBuilder::build(RpdnDecoder::decode($rpdn));

return new Response($rpdnDto->getRpdn());
}

/**
* Returns response for ITN IN request.
*
Expand All @@ -146,6 +210,36 @@ public function doItnInResponse(Itn $itn, bool $transactionConfirmed = true)
return new Response(ItnResponseBuilder::build($itn, $transactionConfirmed, $this->configuration));
}

/**
* Returns response for RPAN IN request.
*
* @param Rpan $rpan
* @param bool $transactionConfirmed
*
* @return Response
* @api
*
*/
public function doRpanInResponse(Rpan $rpan, bool $transactionConfirmed = true)
{
return new Response(RpanBuilder::build($rpan, $transactionConfirmed, $this->configuration));
}

/**
* Returns response for RPDN IN request.
*
* @param Rpdn $rpdn
* @param bool $transactionConfirmed
*
* @return Response
* @api
*
*/
public function doRpdnInResponse(Rpdn $rpdn, bool $transactionConfirmed = true)
{
return new Response(RpdnBuilder::build($rpdn, $transactionConfirmed, $this->configuration));
}

/**
* Returns payway list.
*
Expand Down Expand Up @@ -240,4 +334,26 @@ public static function getItnObject(string $itn): Itn
{
return ItnVOBuilder::build(ItnDecoder::decode($itn));
}

/**
* Method allows to get Rpan object from base64
*
* @param string $rpan
* @return Rpan
*/
public static function getRpanObject(string $rpan): Rpan
{
return RpanVOBuilder::build(RpanDecoder::decode($rpan));
}

/**
* Method allows to get Rpdn object from base64
*
* @param string $rpdn
* @return Rpdn
*/
public static function getRpdnObject(string $rpdn): Rpdn
{
return RpdnVOBuilder::build(RpdnDecoder::decode($rpdn));
}
}
4 changes: 3 additions & 1 deletion src/Common/Enum/ClientEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ abstract class ClientEnum
public const PAYMENT_ROUTE = '/payment';
public const PAYWAY_LIST_ROUTE = '/paywayList';
public const GET_REGULATIONS_ROUTE = '/webapi/regulationsGet';
public const DEACTIVATE_RECURRING_ROUTE = '/deactivate_recurring';

public const STATUS_CONFIRMED = 'CONFIRMED';
public const STATUS_NOT_CONFIRMED = 'NOTCONFIRMED';
Expand All @@ -31,5 +32,6 @@ abstract class ClientEnum
public const PATTERN_XML_ERROR = '@<error>(.*)</error>@Usi';
public const PATTERN_GENERAL_ERROR = '/error(.*)/si';

public const MESSAGE_ID_LENGTH = 32;
// byte = 2 hex characters so 16 bytes = 32 char
public const MESSAGE_ID_LENGTH = 16;
}
16 changes: 15 additions & 1 deletion src/Hash/HashGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,29 @@ public static function generateHash(array $data, Configuration $configuration):
}

if (is_array($value)) {
$value = self::arrayValuesRecursive($value);
$value = array_filter($value, 'mb_strlen');
$value = implode($configuration->getHashSeparator(), $value);
}

$result .= $value.$configuration->getHashSeparator();
$result .= $value . $configuration->getHashSeparator();
}

$result .= $configuration->getSharedKey();

return hash($configuration->getHashAlgo(), $result);
}

private static function arrayValuesRecursive($value)
{
$flat = [];
foreach ($value as $item) {
if (is_array($item)) {
$flat = array_merge($flat, self::arrayValuesRecursive($item));
} else {
$flat[] = $item;
}
}
return $flat;
}
}
166 changes: 166 additions & 0 deletions src/Itn/ValueObject/CustomerData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
<?php
declare(strict_types=1);

namespace BlueMedia\Itn\ValueObject;

use BlueMedia\Serializer\SerializableInterface;
use JMS\Serializer\Annotation\AccessorOrder;
use JMS\Serializer\Annotation\Type;

/**
* @AccessorOrder("custom",
* custom = {
* "fName",
* "lName",
* "streetName",
* "streetHouseNo",
* "streetStaircaseNo",
* "streetPremiseNo",
* "postalCode",
* "city",
* "nrb",
* "senderData"
* })
*/
final class CustomerData implements SerializableInterface
{
/**
* @var string
* @Type("string")
*/
protected $fName;

/**
* @var string
* @Type("string")
*/
protected $lName;

/**
* @var string
* @Type("string")
*/
protected $streetName;

/**
* @var string
* @Type("string")
*/
protected $streetHouseNo;

/**
* @var string
* @Type("string")
*/
protected $streetStaircaseNo;

/**
* @var string
* @Type("string")
*/
protected $streetPremiseNo;

/**
* @var string
* @Type("string")
*/
protected $postalCode;

/**
* @var string
* @Type("string")
*/
protected $city;

/**
* @var string
* @Type("string")
*/
protected $nrb;

/**
* @var string
* @Type("string")
*/
protected $senderData;

/**
* @return string
*/
public function getFName(): string
{
return $this->fName;
}

/**
* @return string
*/
public function getLName(): string
{
return $this->lName;
}

/**
* @return string
*/
public function getStreetName(): string
{
return $this->streetName;
}

/**
* @return string
*/
public function getStreetHouseNo(): string
{
return $this->streetHouseNo;
}

/**
* @return string
*/
public function getStreetStaircaseNo(): string
{
return $this->streetStaircaseNo;
}

/**
* @return string
*/
public function getStreetPremiseNo(): string
{
return $this->streetPremiseNo;
}

/**
* @return string
*/
public function getPostalCode(): string
{
return $this->postalCode;
}

/**
* @return string
*/
public function getCity(): string
{
return $this->city;
}

/**
* @return string
*/
public function getNrb(): string
{
return $this->nrb;
}

/**
* @return string
*/
public function getSenderData(): string
{
return $this->senderData;
}
}
Loading