112 lines
3.3 KiB
PHP
112 lines
3.3 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Esun\Oceanpayment\Model;
|
|
|
|
class Signature
|
|
{
|
|
private const CALLBACK_FIELDS = [
|
|
'account',
|
|
'terminal',
|
|
'order_number',
|
|
'order_currency',
|
|
'order_amount',
|
|
'order_notes',
|
|
'card_number',
|
|
'payment_id',
|
|
'payment_authType',
|
|
'payment_status',
|
|
'payment_details',
|
|
'payment_risk',
|
|
];
|
|
|
|
private const CREATE_RESPONSE_FIELDS = [
|
|
'account',
|
|
'terminal',
|
|
'order_number',
|
|
'order_currency',
|
|
'order_amount',
|
|
'order_notes',
|
|
'payment_id',
|
|
'pay_url',
|
|
'pay_results',
|
|
'pay_details',
|
|
];
|
|
|
|
public function sanitize(string $value): string
|
|
{
|
|
return str_replace(['<', '>', "'", '"'], ' ', trim($value));
|
|
}
|
|
|
|
public function createRequest(array $data, string $secureCode): string
|
|
{
|
|
$plain = (string)($data['account'] ?? '')
|
|
. (string)($data['terminal'] ?? '')
|
|
. (string)($data['backUrl'] ?? '')
|
|
. (string)($data['order_number'] ?? '')
|
|
. (string)($data['order_currency'] ?? '')
|
|
. (string)($data['order_amount'] ?? '')
|
|
. (string)($data['billing_firstName'] ?? '')
|
|
. (string)($data['billing_lastName'] ?? '')
|
|
. (string)($data['billing_email'] ?? '')
|
|
. $secureCode;
|
|
|
|
return hash('sha256', $plain);
|
|
}
|
|
|
|
public function createEmbeddedRequest(array $data, string $secureCode): string
|
|
{
|
|
$plain = (string)($data['account'] ?? '')
|
|
. (string)($data['terminal'] ?? '')
|
|
. (string)($data['order_number'] ?? '')
|
|
. (string)($data['order_currency'] ?? '')
|
|
. (string)($data['order_amount'] ?? '')
|
|
. (string)($data['billing_firstName'] ?? '')
|
|
. (string)($data['billing_lastName'] ?? '')
|
|
. (string)($data['billing_email'] ?? '')
|
|
. $secureCode;
|
|
|
|
return hash('sha256', $plain);
|
|
}
|
|
|
|
public function verifyCreateResponse(array $data, string $secureCode): bool
|
|
{
|
|
return $this->verifyFields($data, self::CREATE_RESPONSE_FIELDS, $secureCode);
|
|
}
|
|
|
|
public function verifyCallback(array $data, string $secureCode): bool
|
|
{
|
|
$provided = strtolower(trim((string)($data['signValue'] ?? '')));
|
|
if (!preg_match('/^[a-f0-9]{64}$/', $provided)) {
|
|
return false;
|
|
}
|
|
|
|
return hash_equals($this->createCallback($data, $secureCode), $provided);
|
|
}
|
|
|
|
public function createCallback(array $data, string $secureCode): string
|
|
{
|
|
return $this->createFields($data, self::CALLBACK_FIELDS, $secureCode);
|
|
}
|
|
|
|
private function verifyFields(array $data, array $fields, string $secureCode): bool
|
|
{
|
|
$provided = strtolower(trim((string)($data['signValue'] ?? '')));
|
|
if (!preg_match('/^[a-f0-9]{64}$/', $provided)) {
|
|
return false;
|
|
}
|
|
|
|
return hash_equals($this->createFields($data, $fields, $secureCode), $provided);
|
|
}
|
|
|
|
private function createFields(array $data, array $fields, string $secureCode): string
|
|
{
|
|
$plain = '';
|
|
foreach ($fields as $field) {
|
|
$plain .= (string)($data[$field] ?? '');
|
|
}
|
|
|
|
return hash('sha256', $plain . $secureCode);
|
|
}
|
|
}
|