Files
2026-09-15 10:35:56 +08:00

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);
}
}