diff --git a/app/PaymentDrivers/Square/CreditCard.php b/app/PaymentDrivers/Square/CreditCard.php index 7ddc6dfa18af..b5bf6eec93ef 100644 --- a/app/PaymentDrivers/Square/CreditCard.php +++ b/app/PaymentDrivers/Square/CreditCard.php @@ -132,6 +132,10 @@ class CreditCard public function paymentResponse(PaymentResponseRequest $request) { $token = $request->sourceId; + + $amount = $this->square_driver->convertAmount( + $this->square_driver->payment_hash->data->amount_with_fee + ); if ($request->shouldUseToken()) { $cgt = ClientGatewayToken::where('token', $request->token)->first(); @@ -139,7 +143,7 @@ class CreditCard } $amount_money = new \Square\Models\Money(); - $amount_money->setAmount(100); + $amount_money->setAmount($amount); $amount_money->setCurrency($this->square_driver->client->currency()->code); $body = new \Square\Models\CreatePaymentRequest($token, Str::random(32), $amount_money); diff --git a/app/PaymentDrivers/SquarePaymentDriver.php b/app/PaymentDrivers/SquarePaymentDriver.php index 818c1e501a3c..793dc25e03fc 100644 --- a/app/PaymentDrivers/SquarePaymentDriver.php +++ b/app/PaymentDrivers/SquarePaymentDriver.php @@ -12,13 +12,18 @@ namespace App\PaymentDrivers; use App\Http\Requests\Payments\PaymentWebhookRequest; +use App\Jobs\Mail\PaymentFailureMailer; +use App\Jobs\Util\SystemLogger; use App\Models\ClientGatewayToken; use App\Models\GatewayType; +use App\Models\Invoice; use App\Models\Payment; use App\Models\PaymentHash; +use App\Models\PaymentType; use App\Models\SystemLog; use App\PaymentDrivers\Square\CreditCard; use App\Utils\Traits\MakesHash; +use Square\Http\ApiResponse; class SquarePaymentDriver extends BaseDriver { @@ -30,7 +35,7 @@ class SquarePaymentDriver extends BaseDriver public $can_authorise_credit_card = true; //does this gateway support authorizations? - public $square; + public $square; public $payment_method; @@ -38,11 +43,10 @@ class SquarePaymentDriver extends BaseDriver GatewayType::CREDIT_CARD => CreditCard::class, //maps GatewayType => Implementation class ]; - const SYSTEM_LOG_TYPE = SystemLog::TYPE_SQUARE; + const SYSTEM_LOG_TYPE = SystemLog::TYPE_SQUARE; public function init() { - $this->square = new \Square\SquareClient([ 'accessToken' => $this->company_gateway->getConfigField('accessToken'), 'environment' => $this->company_gateway->getConfigField('testMode') ? \Square\Environment::SANDBOX : \Square\Environment::PRODUCTION, @@ -56,7 +60,7 @@ class SquarePaymentDriver extends BaseDriver { $types = []; - $types[] = GatewayType::CREDIT_CARD; + $types[] = GatewayType::CREDIT_CARD; return $types; } @@ -96,7 +100,76 @@ class SquarePaymentDriver extends BaseDriver public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) { - //this is your custom implementation from here + $this->init(); + + $amount = array_sum(array_column($payment_hash->invoices(), 'amount')) + $payment_hash->fee_total; + $amount = $this->convertAmount($amount); + + $invoice = Invoice::whereIn('id', $this->transformKeys(array_column($payment_hash->invoices(), 'invoice_id')))->withTrashed()->first(); + + if ($invoice) { + $description = "Invoice {$invoice->number} for {$amount} for client {$this->client->present()->name()}"; + } else { + $description = "Payment with no invoice for amount {$amount} for client {$this->client->present()->name()}"; + } + + $amount_money = new \Square\Models\Money(); + $amount_money->setAmount($amount); + $amount_money->setCurrency($this->client->currency()->code); + + $body = new \Square\Models\CreatePaymentRequest($cgt->token, \Illuminate\Support\Str::random(32), $amount_money); + + /** @var ApiResponse */ + $response = $this->square->getPaymentsApi()->createPayment($body); + $body = json_decode($response->getBody()); + + if ($response->isSuccess()) { + $amount = array_sum(array_column($this->payment_hash->invoices(), 'amount')) + $this->payment_hash->fee_total; + + $payment_record = []; + $payment_record['amount'] = $amount; + $payment_record['payment_type'] = PaymentType::CREDIT_CARD_OTHER; + $payment_record['gateway_type_id'] = GatewayType::CREDIT_CARD; + $payment_record['transaction_reference'] = $body->payment->id; + + $payment = $this->createPayment($payment_record, Payment::STATUS_COMPLETED); + + SystemLogger::dispatch( + ['response' => $response, 'data' => $payment_record], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_CHECKOUT, + $this->client, + $this->client->company, + ); + + return $payment; + } + + $this->unWindGatewayFees($payment_hash); + + PaymentFailureMailer::dispatch( + $this->client, + $body->errors[0]->detail, + $this->client->company, + $amount + ); + + $message = [ + 'server_response' => $response, + 'data' => $payment_hash->data, + ]; + + SystemLogger::dispatch( + $message, + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_FAILURE, + SystemLog::TYPE_SQUARE, + $this->client, + $this->client->company, + ); + + return false; } public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null) @@ -147,4 +220,23 @@ class SquarePaymentDriver extends BaseDriver return $fields; } -} \ No newline at end of file + + public function convertAmount($amount): bool + { + $precision = $this->client->currency()->precision; + + if ($precision == 0) { + return $amount; + } + + if ($precision == 1) { + return $amount*10; + } + + if ($precision == 2) { + return $amount*100; + } + + return $amount; + } +}