1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-05 18:52:44 +01:00

- Extract $payment_hash property onto BaseDriver

- Handle internally failed payments inside BaseDriver
- Add SYSTEM_LOG_TYPE property on CheckoutComPaymentDriver
- Remove resolving of $payment_hash inside of payment methods
This commit is contained in:
Benjamin Beganović 2020-10-27 12:53:35 +01:00
parent f3e578cc5c
commit 223ae4cb5b
5 changed files with 53 additions and 41 deletions

View File

@ -220,17 +220,19 @@ class PaymentController extends Controller
return $gateway return $gateway
->driver(auth()->user()->client) ->driver(auth()->user()->client)
->setPaymentMethod($payment_method_id) ->setPaymentMethod($payment_method_id)
->setPaymentHash($payment_hash)
->processPaymentView($data); ->processPaymentView($data);
} }
public function response(PaymentResponseRequest $request) public function response(PaymentResponseRequest $request)
{ {
/*Payment Gateway*/
$gateway = CompanyGateway::find($request->input('company_gateway_id'))->firstOrFail(); $gateway = CompanyGateway::find($request->input('company_gateway_id'))->firstOrFail();
$payment_hash = PaymentHash::whereRaw('BINARY `hash`= ?', [$request->payment_hash])->first();
return $gateway return $gateway
->driver(auth()->user()->client) ->driver(auth()->user()->client)
->setPaymentMethod($request->input('payment_method_id')) ->setPaymentMethod($request->input('payment_method_id'))
->setPaymentHash($payment_hash)
->processPaymentResponse($request); ->processPaymentResponse($request);
} }

View File

@ -14,8 +14,11 @@ namespace App\PaymentDrivers;
use App\Events\Invoice\InvoiceWasPaid; use App\Events\Invoice\InvoiceWasPaid;
use App\Events\Payment\PaymentWasCreated; use App\Events\Payment\PaymentWasCreated;
use App\Exceptions\PaymentFailed;
use App\Factory\PaymentFactory; use App\Factory\PaymentFactory;
use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest;
use App\Jobs\Mail\PaymentFailureMailer;
use App\Jobs\Util\SystemLogger;
use App\Models\Client; use App\Models\Client;
use App\Models\ClientContact; use App\Models\ClientContact;
use App\Models\ClientGatewayToken; use App\Models\ClientGatewayToken;
@ -23,6 +26,7 @@ use App\Models\CompanyGateway;
use App\Models\Invoice; use App\Models\Invoice;
use App\Models\Payment; use App\Models\Payment;
use App\Models\PaymentHash; use App\Models\PaymentHash;
use App\Models\SystemLog;
use App\PaymentDrivers\AbstractPaymentDriver; use App\PaymentDrivers\AbstractPaymentDriver;
use App\Utils\Ninja; use App\Utils\Ninja;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
@ -58,6 +62,11 @@ class BaseDriver extends AbstractPaymentDriver
/* The initiated gateway driver class*/ /* The initiated gateway driver class*/
public $payment_method; public $payment_method;
/**
* @var \App\Models\PaymentHash
*/
public $payment_hash;
public static $methods = []; public static $methods = [];
public function __construct(CompanyGateway $company_gateway, Client $client = null, $invitation = false) public function __construct(CompanyGateway $company_gateway, Client $client = null, $invitation = false)
@ -112,6 +121,13 @@ class BaseDriver extends AbstractPaymentDriver
{ {
} }
public function setPaymentHash(PaymentHash $payment_hash)
{
$this->payment_hash = $payment_hash;
return $this;
}
/** /**
* Helper method to attach invoices to a payment. * Helper method to attach invoices to a payment.
* *
@ -274,4 +290,32 @@ class BaseDriver extends AbstractPaymentDriver
return $company_gateway_token; return $company_gateway_token;
} }
public function processInternallyFailedPayment($gateway, $e)
{
if ($e instanceof \Exception) {
$error = $e->getMessage();
}
if ($e instanceof \Checkout\Library\Exceptions\CheckoutHttpException) {
$error = $e->getBody();
}
PaymentFailureMailer::dispatch(
$gateway->client,
$error,
$gateway->client->company,
$this->payment_hash->data->value
);
SystemLogger::dispatch(
$this->checkout->payment_hash,
SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_ERROR,
$gateway::SYSTEM_LOG_TYPE,
$this->checkout->client,
);
throw new PaymentFailed($error, $e->getCode());
}
} }

View File

@ -85,12 +85,8 @@ class CreditCard
$state = array_merge($state, $request->all()); $state = array_merge($state, $request->all());
$state['store_card'] = boolval($state['store_card']); $state['store_card'] = boolval($state['store_card']);
$payment_hash = PaymentHash::whereRaw('BINARY `hash`= ?', [$request->payment_hash])->first(); $this->checkout->payment_hash->data = array_merge((array) $this->checkout->payment_hash->data, $state);
$this->checkout->payment_hash->save();
$payment_hash->data = array_merge((array) $payment_hash->data, $state);
$payment_hash->save();
$this->checkout->payment_hash = $payment_hash;
if ($request->has('token') && !is_null($request->token)) { if ($request->has('token') && !is_null($request->token)) {
return $this->attemptPaymentUsingToken($request); return $this->attemptPaymentUsingToken($request);

View File

@ -118,38 +118,10 @@ trait Utilities
try { try {
return redirect($_payment->_links['redirect']['href']); return redirect($_payment->_links['redirect']['href']);
} catch (\Exception $e) { } catch (\Exception $e) {
return $this->processInternallyFailedPayment($e); return $this->processInternallyFailedPayment($this->checkout, $e);
} }
} }
private function processInternallyFailedPayment($e)
{
if ($e instanceof \Checkout\Library\Exceptions\CheckoutHttpException) {
$error = $e->getBody();
}
if ($e instanceof \Exception) {
$error = $e->getMessage();
}
PaymentFailureMailer::dispatch(
$this->checkout->client,
$error,
$this->checkout->client->company,
$this->checkout->payment_hash->data->value
);
SystemLogger::dispatch(
$this->checkout->payment_hash,
SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_ERROR,
SystemLog::TYPE_CHECKOUT,
$this->checkout->client,
);
throw new PaymentFailed($error, $e->getCode());
}
private function storePaymentMethod(\Checkout\Models\Payments\Payment $response) private function storePaymentMethod(\Checkout\Models\Payments\Payment $response)
{ {
try { try {

View File

@ -16,6 +16,7 @@ use App\Models\ClientGatewayToken;
use App\Models\GatewayType; use App\Models\GatewayType;
use App\Models\Payment; use App\Models\Payment;
use App\Models\PaymentHash; use App\Models\PaymentHash;
use App\Models\SystemLog;
use App\PaymentDrivers\BaseDriver; use App\PaymentDrivers\BaseDriver;
use App\PaymentDrivers\CheckoutCom\Utilities; use App\PaymentDrivers\CheckoutCom\Utilities;
use App\Utils\Traits\SystemLogTrait; use App\Utils\Traits\SystemLogTrait;
@ -48,15 +49,12 @@ class CheckoutComPaymentDriver extends BaseDriver
public $payment_method; //the gateway type id public $payment_method; //the gateway type id
/**
* @var \App\Models\PaymentHash
*/
public $payment_hash;
public static $methods = [ public static $methods = [
GatewayType::CREDIT_CARD => \App\PaymentDrivers\CheckoutCom\CreditCard::class, GatewayType::CREDIT_CARD => \App\PaymentDrivers\CheckoutCom\CreditCard::class,
]; ];
const SYSTEM_LOG_TYPE = SystemLog::TYPE_CHECKOUT;
/** /**
* Returns the default gateway type. * Returns the default gateway type.
*/ */