From 3ac8d456d5037b29fc6b2410e28a110a8a530b07 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 24 Jan 2022 14:30:32 +1100 Subject: [PATCH] Confirm charges using Stripe webhooks --- .../Stripe/Jobs/PaymentIntentWebhook.php | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php diff --git a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php new file mode 100644 index 000000000000..bc09f36e6c05 --- /dev/null +++ b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php @@ -0,0 +1,161 @@ +stripe_request = $stripe_request; + $this->company_key = $company_key; + $this->company_gateway_id = $company_gateway_id; + } + + public function handle() + { + + // nlog(optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata'])['gateway_type_id']); + // nlog(optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata'])['payment_hash']); + // nlog(optional($this->stripe_request['data']['object']['charges']['data'][0]['payment_method_details']['card'])['brand']); + + MultiDB::findAndSetDbByCompanyKey($this->company_key); + + if(optional($this->stripe_request['data']['object']['charges']['data'][0])['id']){ + + $company = Company::where('company_key', $this->company_key)->first(); + + $payment = Payment::query() + ->where('company_id', $company->id) + ->where('transaction_reference', $this->stripe_request['data']['object']['charges']['data'][0]['id']) + ->first(); + + //return early + if($payment && $payment->status_id == Payment::STATUS_COMPLETED){ + nlog(" payment found and status correct - returning "); + return; + } + + $hash = optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata'])['payment_hash']; + + $payment_hash = PaymentHash::where('hash', $hash)->first(); + + nlog("no payment found"); + + if(optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata']['payment_hash'])) + { + nlog("hash found"); + + $hash = $this->stripe_request['data']['object']['charges']['data'][0]['metadata']['payment_hash']; + + $payment_hash = PaymentHash::where('hash', $hash)->first(); + $invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id); + $client = $invoice->client; + + $this->updateCreditCardPayment($payment_hash, $client); + } + + //create the payment + + } + + } + + private function updateCreditCardPayment($payment_hash, $client) + { + $company_gateway = CompanyGateway::find($this->company_gateway_id); + $payment_method_type = optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata'])['gateway_type_id']; + $driver = $company_gateway->driver($client)->init()->setPaymentMethod($payment_method_type); + + $payment_hash->data = array_merge((array) $payment_hash->data, $this->stripe_request); + $payment_hash->save(); + $driver->setPaymentHash($payment_hash); + + $data = [ + 'payment_method' => $payment_hash->data->data->object->payment_method, + 'payment_type' => PaymentType::parseCardType(strtolower(optional($this->stripe_request['data']['object']['charges']['data'][0]['payment_method_details']['card'])['brand'])) ?: PaymentType::CREDIT_CARD_OTHER, + 'amount' => $payment_hash->data->amount_with_fee, + 'transaction_reference' => $this->stripe_request['data']['object']['charges']['data'][0]['id'], + 'gateway_type_id' => GatewayType::CREDIT_CARD, + ]; + + $payment = $driver->createPayment($data, Payment::STATUS_COMPLETED); + + SystemLogger::dispatch( + ['response' => $this->stripe_request, 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_STRIPE, + $client, + $client->company, + ); + + } + + //charge # optional($this->stripe_request['data']['object']['charges']['data'][0])['id'] + //metadata # optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata']['gateway_type_id'] + //metadata # optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata']['payment_hash'] + + +/** + * + * $intent = \Stripe\PaymentIntent::retrieve('{{PAYMENT_INTENT_ID}}'); + $charges = $intent->charges->data; + * + * + * $payment = Payment::query() + ->where('company_id', $request->getCompany()->id) + ->where('transaction_reference', $transaction['id']) + ->first(); + + + if ($payment) { + $payment->status_id = Payment::STATUS_COMPLETED; + $payment->save(); + } + + + + + * */ + + + +} \ No newline at end of file