1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace App\Containers\Payment\Gateway; |
4
|
|
|
|
5
|
|
|
use App\Containers\Payment\Contracts\ChargeableInterface; |
6
|
|
|
use App\Containers\Payment\Contracts\PaymentChargerInterface; |
7
|
|
|
use App\Containers\Payment\Exceptions\ChargerTaskDoesNotImplementInterfaceException; |
8
|
|
|
use App\Containers\Payment\Exceptions\NoChargeTaskForPaymentGatewayDefinedException; |
9
|
|
|
use App\Containers\Payment\Models\PaymentAccount; |
10
|
|
|
use App\Containers\Payment\Models\PaymentTransaction; |
11
|
|
|
use App\Containers\Payment\Tasks\CheckIfPaymentAccountBelongsToUserTask; |
12
|
|
|
use Illuminate\Support\Facades\App; |
13
|
|
|
use Illuminate\Support\Facades\Config; |
14
|
|
|
|
15
|
|
|
/** |
16
|
|
|
* Class PaymentsGateway |
17
|
|
|
* |
18
|
|
|
* @author Johannes Schobel <[email protected]> |
19
|
|
|
* @author Mahmoud Zalt <[email protected]> |
20
|
|
|
*/ |
21
|
|
|
class PaymentsGateway |
22
|
|
|
{ |
23
|
|
|
|
24
|
|
|
/** |
25
|
|
|
* @param ChargeableInterface $chargeable |
26
|
|
|
* @param PaymentAccount $account |
27
|
|
|
* @param $amount |
28
|
|
|
* @param string|null $currency |
29
|
|
|
* |
30
|
|
|
* @return PaymentTransaction |
31
|
|
|
* @throws ChargerTaskDoesNotImplementInterfaceException |
32
|
|
|
* @throws NoChargeTaskForPaymentGatewayDefinedException |
33
|
|
|
*/ |
34
|
|
|
public function charge(ChargeableInterface $chargeable, PaymentAccount $account, $amount, $currency = null) : PaymentTransaction |
35
|
|
|
{ |
36
|
|
|
$currency = ($currency === null) ? Config::get('payment.currency') : $currency; |
37
|
|
|
|
38
|
|
|
// check, if the account is owned by user to be charged |
39
|
|
|
App::make(CheckIfPaymentAccountBelongsToUserTask::class)->run($chargeable, $account); |
40
|
|
|
|
41
|
|
|
$typedAccount = $account->accountable; |
42
|
|
|
|
43
|
|
|
$chargerTaskTaskName = Config::get('payment-container.gateways.' . $typedAccount->getPaymentGatewaySlug() . '.charge_task', null); |
44
|
|
|
|
45
|
|
|
if ($chargerTaskTaskName === null) { |
46
|
|
|
throw new NoChargeTaskForPaymentGatewayDefinedException(); |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
// create the task |
50
|
|
|
$chargerTask = App::make($chargerTaskTaskName); |
51
|
|
|
|
52
|
|
|
// check if it implements the required interface |
53
|
|
|
if (!$chargerTask instanceof PaymentChargerInterface) { |
54
|
|
|
throw new ChargerTaskDoesNotImplementInterfaceException(); |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
/** @var PaymentTransaction $transaction */ |
58
|
|
|
$transaction = $chargerTask->charge($chargeable, $typedAccount, $amount, $currency); |
59
|
|
|
|
60
|
|
|
// now set some details of the transaction |
61
|
|
|
$transaction->user_id = $chargeable->id; |
|
|
|
|
62
|
|
|
$transaction->gateway = $typedAccount->getPaymentGatewayReadableName(); |
63
|
|
|
$transaction->amount = $amount; |
64
|
|
|
$transaction->currency = $currency; |
65
|
|
|
|
66
|
|
|
$transaction->save(); |
67
|
|
|
|
68
|
|
|
return $transaction; |
69
|
|
|
} |
70
|
|
|
} |
71
|
|
|
|
If you access a property on an interface, you most likely code against a concrete implementation of the interface.
Available Fixes
Adding an additional type check:
Changing the type hint: