From 6740e348a19e7578b81c86eba95e47adc89f0ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Wed, 4 Aug 2021 15:44:43 +0200 Subject: [PATCH 1/5] Refactor PaymentWebhookController --- .../Controllers/PaymentWebhookController.php | 22 +++++-------------- app/Models/CompanyGateway.php | 2 +- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/PaymentWebhookController.php b/app/Http/Controllers/PaymentWebhookController.php index 01b38c3abab3..67907deb5709 100644 --- a/app/Http/Controllers/PaymentWebhookController.php +++ b/app/Http/Controllers/PaymentWebhookController.php @@ -13,26 +13,14 @@ namespace App\Http\Controllers; use App\Http\Requests\Payments\PaymentWebhookRequest; -use App\Libraries\MultiDB; -use Auth; class PaymentWebhookController extends Controller { - public function __invoke(PaymentWebhookRequest $request, string $company_key, string $company_gateway_id) + public function __invoke(PaymentWebhookRequest $request) { - - $payment = $request->getPayment(); - - if(!$payment) - return response()->json(['message' => 'Payment record not found.'], 400); - - $client = is_null($payment) ? $request->getClient() : $payment->client; - - if(!$client) - return response()->json(['message' => 'Client record not found.'], 400); - - return $request->getCompanyGateway() - ->driver($client) - ->processWebhookRequest($request, $payment); + return $request + ->getCompanyGateway() + ->driver() + ->processWebhookRequest($request); } } diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index b9105b566e9e..f7efd1c79e2c 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -118,7 +118,7 @@ class CompanyGateway extends BaseModel } /* This is the public entry point into the payment superclass */ - public function driver(Client $client) + public function driver(Client $client = null) { $class = static::driver_class(); From ab890f770eb7fc719f1a1351f5423335f4e4fb0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Wed, 4 Aug 2021 16:19:01 +0200 Subject: [PATCH 2/5] Stripe: Support for new webhooks format --- app/PaymentDrivers/StripePaymentDriver.php | 26 ++++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/app/PaymentDrivers/StripePaymentDriver.php b/app/PaymentDrivers/StripePaymentDriver.php index e0cc6af1e117..96f56159c7c8 100644 --- a/app/PaymentDrivers/StripePaymentDriver.php +++ b/app/PaymentDrivers/StripePaymentDriver.php @@ -387,21 +387,23 @@ class StripePaymentDriver extends BaseDriver return $this->payment_method->processVerification($request, $payment_method); } - public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment) + public function processWebhookRequest(PaymentWebhookRequest $request) { - if ($request->type == 'source.chargeable') { - $payment->status_id = Payment::STATUS_COMPLETED; - $payment->save(); + if ($request->type === 'charge.succeeded' || $request->type === 'source.chargeable') { + foreach ($request->data as $transaction) { + $payment = Payment::query() + ->where('transaction_reference', $transaction['id']) + ->where('company_id', $request->getCompany()->id) + ->first(); + + if ($payment) { + $payment->status_id = Payment::STATUS_COMPLETED; + $payment->save(); + } + } } - if ($request->type == 'charge.succeeded') { - $payment->status_id = Payment::STATUS_COMPLETED; - $payment->save(); - } - - // charge.failed, charge.refunded - - return response([], 200); + return response()->json([], 200); } public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) From 0a4a92b25639501f88e772a7353d7c6f55c51f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Wed, 4 Aug 2021 16:24:44 +0200 Subject: [PATCH 3/5] Fixes for Checkout.com --- app/PaymentDrivers/CheckoutComPaymentDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/PaymentDrivers/CheckoutComPaymentDriver.php b/app/PaymentDrivers/CheckoutComPaymentDriver.php index 708ada890f03..e820808316e3 100644 --- a/app/PaymentDrivers/CheckoutComPaymentDriver.php +++ b/app/PaymentDrivers/CheckoutComPaymentDriver.php @@ -332,7 +332,7 @@ class CheckoutComPaymentDriver extends BaseDriver } } - public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null) + public function processWebhookRequest(PaymentWebhookRequest $request) { return true; } From 7ab6dbd1b7d54b84a2986d0f21d5fbe941cfe82c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Wed, 4 Aug 2021 16:24:49 +0200 Subject: [PATCH 4/5] Cleanup of PaymentWebhookRequest --- .../Payments/PaymentWebhookRequest.php | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/app/Http/Requests/Payments/PaymentWebhookRequest.php b/app/Http/Requests/Payments/PaymentWebhookRequest.php index 50bc276c14ae..5aac0825e4f4 100644 --- a/app/Http/Requests/Payments/PaymentWebhookRequest.php +++ b/app/Http/Requests/Payments/PaymentWebhookRequest.php @@ -65,54 +65,6 @@ class PaymentWebhookRequest extends Request return false; } - /** - * Resolve possible payment in the request. - * - * @return null|\App\Models\Payment - */ - public function getPayment() - { - // For testing purposes we'll slow down the webhook processing by 2 seconds - // to make sure webhook request doesn't came before our processing. - //if (app()->environment() !== 'production') { - sleep(2); - //} - - // Some gateways, like Checkout, we can dynamically pass payment hash, - // which we will resolve here and get payment information from it. - if ($this->getPaymentHash()) { - return $this->getPaymentHash()->payment; - } - - // While for some gateways, we need to extract the payment source/reference from the webhook request. - // Gateways like this: Stripe - if ($this->has('api_version') && $this->has('type') && $this->has('data')) { - $src = $this->data['object']['id']; - - return Payment::where('transaction_reference', $src)->firstOrFail(); - } - - // If none of previously done logics is correct, we'll just display - // not found page. - return false; - } - - /** - * Resolve client from payment hash. - * - * @return null|\App\Models\Client|bool - */ - public function getClient() - { - $hash = $this->getPaymentHash(); - - if($hash) { - return Client::find($hash->data->client_id)->firstOrFail(); - } - - return false; - } - /** * Resolve company from company_key parameter. * From 0e687783e47fb3463a2236c08f8538110c59138a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 5 Aug 2021 13:34:44 +0200 Subject: [PATCH 5/5] Add $config to WePay webhook logic --- app/PaymentDrivers/WePayPaymentDriver.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/PaymentDrivers/WePayPaymentDriver.php b/app/PaymentDrivers/WePayPaymentDriver.php index cebe3812c2d2..89f628654b3f 100644 --- a/app/PaymentDrivers/WePayPaymentDriver.php +++ b/app/PaymentDrivers/WePayPaymentDriver.php @@ -168,6 +168,8 @@ class WePayPaymentDriver extends BaseDriver $input = $request->all(); + $config = $this->company_gateway->getConfig(); + $accountId = $this->company_gateway->getConfigField('accountId'); foreach (array_keys($input) as $key) {