mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Confirm charges using Stripe webhooks
This commit is contained in:
parent
da7ac32703
commit
3ac8d456d5
161
app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php
Normal file
161
app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php
Normal file
@ -0,0 +1,161 @@
|
||||
<?php
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://www.elastic.co/licensing/elastic-license
|
||||
*/
|
||||
|
||||
namespace App\PaymentDrivers\Stripe\Jobs;
|
||||
|
||||
use App\Jobs\Util\SystemLogger;
|
||||
use App\Libraries\MultiDB;
|
||||
use App\Models\Company;
|
||||
use App\Models\CompanyGateway;
|
||||
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\Stripe\Utilities;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class PaymentIntentWebhook implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Utilities;
|
||||
|
||||
public $tries = 1; //number of retries
|
||||
|
||||
public $deleteWhenMissingModels = true;
|
||||
|
||||
public $stripe_request;
|
||||
|
||||
public $company_key;
|
||||
|
||||
private $company_gateway_id;
|
||||
|
||||
public function __construct($stripe_request, $company_key, $company_gateway_id)
|
||||
{
|
||||
$this->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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
* */
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user