work on payments
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'username' => 'hello',
|
||||
'password' => '',
|
||||
'returnUrl' => '',
|
||||
];
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace App\Modules\HalkbankOnlinePayment;
|
||||
|
||||
use App\Modules\Makeable;
|
||||
use App\Modules\ModuleContract;
|
||||
|
||||
class HalkbankOnlinePaymentModule implements ModuleContract
|
||||
{
|
||||
use Makeable;
|
||||
|
||||
/**
|
||||
* Module is enabled
|
||||
*/
|
||||
protected bool $enabled = true;
|
||||
|
||||
/**
|
||||
* Check if is module enabled
|
||||
*/
|
||||
public function isEnabled(): bool
|
||||
{
|
||||
return $this->enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable module
|
||||
*/
|
||||
public function disable(): void
|
||||
{
|
||||
$this->enabled = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable module
|
||||
*/
|
||||
public function enable(): void
|
||||
{
|
||||
$this->enabled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if module has a filament resource
|
||||
*/
|
||||
public function hasFilamentResource(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module composer requirements
|
||||
*/
|
||||
public function getComposerRequirements(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module composer suggestions
|
||||
*/
|
||||
public function getComposerSuggestions(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,224 @@
|
||||
<?php
|
||||
|
||||
namespace App\Modules\HalkbankOnlinePayment\Repositories;
|
||||
|
||||
use App\Modules\Makeable;
|
||||
use Closure;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class HalkbankOnlinePaymentRepository
|
||||
{
|
||||
use Makeable;
|
||||
|
||||
public function __construct(
|
||||
protected string $username = '',
|
||||
protected string $password = '',
|
||||
protected string $amount = '',
|
||||
protected int|string $orderNumber = '',
|
||||
protected string $returnUrl = '',
|
||||
protected string $description = '',
|
||||
protected ?Closure $onRequestError = null,
|
||||
protected ?Closure $onResponseFail = null,
|
||||
protected ?Closure $onResponseSuccess = null,
|
||||
) {
|
||||
$this->username = config()->string('module.halkbank-online-payment.username');
|
||||
$this->password = config()->string('module.halkbank-online-payment.password');
|
||||
$this->returnUrl = config()->string('module.halkbank-online-payment.returnUrl');
|
||||
$this->orderNumber = $this->generateOrderNumber();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send request to gatewat
|
||||
*/
|
||||
public function sendRequest()
|
||||
{
|
||||
try {
|
||||
$paymentResponse = Http::get('https://mpi.gov.tm/payment/rest/register.do', [
|
||||
'orderNumber' => $this->orderNumber,
|
||||
'amount' => $this->formatAmount($this->amount),
|
||||
'currency' => 934,
|
||||
'language' => 'ru',
|
||||
'userName' => $this->username,
|
||||
'password' => $this->password,
|
||||
'returnUrl' => $this->returnUrl,
|
||||
'pageView' => 'DESKTOP',
|
||||
'description' => $this->description,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
Config::set('logging.channels.halkbank_payment_error', [
|
||||
'driver' => 'single',
|
||||
'path' => storage_path('logs/halkbank_payment_error.log'),
|
||||
'level' => 'debug',
|
||||
]);
|
||||
|
||||
Log::channel('halkbank_payment_error')
|
||||
->error('Payment error', [
|
||||
'response' => [
|
||||
'error' => $e->getMessage(),
|
||||
'file_line' => $e->getFile().':'.$e->getLine(),
|
||||
],
|
||||
]);
|
||||
|
||||
return emptyClass([]);
|
||||
}
|
||||
|
||||
return $paymentResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format amount to match requirements
|
||||
*/
|
||||
public function formatAmount(int|float|string $amount): string
|
||||
{
|
||||
return number_format(floatval($amount), 2, '', '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get username
|
||||
*/
|
||||
public function username(): string
|
||||
{
|
||||
return $this->username;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get password
|
||||
*/
|
||||
public function password(): string
|
||||
{
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get amount
|
||||
*/
|
||||
public function amount(): string
|
||||
{
|
||||
return $this->amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order number
|
||||
*/
|
||||
public function orderNumber(): int|string
|
||||
{
|
||||
return $this->orderNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set return url
|
||||
*/
|
||||
public function returnUrl(): string
|
||||
{
|
||||
return $this->returnUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set description
|
||||
*/
|
||||
public function description(): string
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set username
|
||||
*/
|
||||
public function setUsername(string $username): self
|
||||
{
|
||||
$this->username = $username;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set password
|
||||
*/
|
||||
public function setPassword(string $password): self
|
||||
{
|
||||
$this->password = $password;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set amoutn
|
||||
*/
|
||||
public function setAmount(string $amount): self
|
||||
{
|
||||
$this->amount = $amount;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set order number
|
||||
*/
|
||||
public function setOrderNumber(int|string $orderNumber): self
|
||||
{
|
||||
$this->orderNumber = $orderNumber;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set return url
|
||||
*/
|
||||
public function setReturnUrl(string $returnUrl): self
|
||||
{
|
||||
$this->returnUrl = $returnUrl;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set description
|
||||
*/
|
||||
public function setDescription(string $description): self
|
||||
{
|
||||
$this->description = $description;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback on request error
|
||||
*/
|
||||
public function setOnRequestError(Closure $onRequestError): self
|
||||
{
|
||||
$this->onRequestError = $onRequestError;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback on Response Fail
|
||||
*/
|
||||
public function setOnResponseFail(Closure $onResponseFail): self
|
||||
{
|
||||
$this->onResponseFail = $onResponseFail;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback on Response Success
|
||||
*/
|
||||
public function setOnResponseSuccess(Closure $onResponseSuccess): self
|
||||
{
|
||||
$this->onResponseSuccess = $onResponseSuccess;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate order number for payment
|
||||
*/
|
||||
public function generateOrderNumber(): string
|
||||
{
|
||||
return date('dmyHis');
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Modules\OnlinePayment\Repositories;
|
||||
|
||||
use App\Modules\CardOrder\Models\CardOrder;
|
||||
use App\Modules\HalkbankOnlinePayment\Repositories\HalkbankOnlinePaymentRepository;
|
||||
use App\Modules\OnlinePayment\Models\OnlinePayment;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
@@ -24,7 +25,7 @@ class OnlinePaymentRepository
|
||||
*/
|
||||
public const PAID = 'paid';
|
||||
|
||||
/**
|
||||
/**
|
||||
* Status Values
|
||||
*
|
||||
* @return array<null|string, string>
|
||||
@@ -39,14 +40,6 @@ class OnlinePaymentRepository
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Set price
|
||||
*/
|
||||
public function getPrice(int|float|string $price): string
|
||||
{
|
||||
return number_format(floatval($price), 2, '', '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Pay card order
|
||||
*
|
||||
@@ -57,6 +50,18 @@ class OnlinePaymentRepository
|
||||
{
|
||||
$orderNumber = $this->generateOrderNumber();
|
||||
|
||||
$response = HalkbankOnlinePaymentRepository::make()
|
||||
->setUsername()
|
||||
->setPassword()
|
||||
->setAmount()
|
||||
->setOrderNumber()
|
||||
->returnUrl()
|
||||
->description()
|
||||
->onError()
|
||||
->onResponseFail()
|
||||
->onResponseSuccess()
|
||||
->sendRequest();
|
||||
|
||||
// $paymentResponse = Http::get('https://mpi.gov.tm/payment/rest/register.do', [
|
||||
// 'orderNumber' => $orderNumber,
|
||||
// 'amount' => $this->getPrice($resource->priceAmount()),
|
||||
|
||||
@@ -55,33 +55,55 @@ function module_exists(string $moduleName): bool
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an anonymous class that acts as a dynamic object.
|
||||
* Create an anonymous dynamic object with both properties and callable methods.
|
||||
*
|
||||
* @param mixed ...$arguments Key-value pairs passed as an associative array.
|
||||
* @return object Anonymous class instance with dynamic properties.
|
||||
* You can define any mix of:
|
||||
* - scalar or object properties
|
||||
* - closures (which become methods bound to $this)
|
||||
*
|
||||
* Example:
|
||||
* ```php
|
||||
* $user = emptyClass(
|
||||
* name: 'Ali',
|
||||
* greet: fn(): string => "Hello, {$this->name}",
|
||||
* setName: fn(string $n): void => $this->name = $n,
|
||||
* );
|
||||
*
|
||||
* echo $user->greet(); // Hello, Ali
|
||||
* $user->setName('Ahmet');
|
||||
* echo $user->greet(); // Hello, Ahmet
|
||||
* ```
|
||||
*
|
||||
* @template T of object
|
||||
*
|
||||
* @param mixed ...$arguments Key-value pairs (property name => value or Closure)
|
||||
* @return T Anonymous class instance exposing dynamic properties/methods.
|
||||
*/
|
||||
function emptyClass(...$arguments): object
|
||||
function emptyClass(mixed ...$arguments): object
|
||||
{
|
||||
/**
|
||||
* @var array<string, mixed> $arguments
|
||||
*/
|
||||
/** @var T */
|
||||
return new class($arguments)
|
||||
{
|
||||
/**
|
||||
* Internal data storage.
|
||||
* Internal data store.
|
||||
*
|
||||
* @var array<string, mixed>
|
||||
*/
|
||||
private array $data = [];
|
||||
|
||||
/**
|
||||
* Constructor that sets properties.
|
||||
* Constructor that sets up dynamic properties and binds closures.
|
||||
*
|
||||
* @param array<string, mixed> $props
|
||||
*/
|
||||
public function __construct(array $props)
|
||||
{
|
||||
foreach ($props as $key => $value) {
|
||||
if ($value instanceof Closure) {
|
||||
/** @var Closure $value */
|
||||
$value = $value->bindTo($this, self::class);
|
||||
}
|
||||
|
||||
$this->data[$key] = $value;
|
||||
}
|
||||
}
|
||||
@@ -111,5 +133,27 @@ function emptyClass(...$arguments): object
|
||||
{
|
||||
return isset($this->data[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic method caller — invokes stored closures as methods.
|
||||
*
|
||||
* @param array<int, mixed> $args
|
||||
*
|
||||
* @throws BadMethodCallException if the method does not exist or is not callable.
|
||||
*/
|
||||
public function __call(string $method, array $args): mixed
|
||||
{
|
||||
$callable = $this->data[$method] ?? null;
|
||||
|
||||
if ($callable instanceof Closure) {
|
||||
return $callable(...$args);
|
||||
}
|
||||
|
||||
throw new BadMethodCallException(sprintf(
|
||||
'Method %s() does not exist on %s.',
|
||||
$method,
|
||||
self::class
|
||||
));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user