mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-07 13:04:30 -04:00
Refactor Stripe API Webhooks to work across all API Versions
This commit is contained in:
parent
0210cededc
commit
86e92a7f32
@ -60,132 +60,64 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
|
|
||||||
$company = Company::where('company_key', $this->company_key)->first();
|
$company = Company::where('company_key', $this->company_key)->first();
|
||||||
|
|
||||||
nlog($this->stripe_request);
|
foreach ($this->stripe_request as $transaction) {
|
||||||
|
|
||||||
// foreach ($this->stripe_request as $transaction) {
|
if(array_key_exists('payment_intent', $transaction))
|
||||||
|
|
||||||
// if(array_key_exists('payment_intent', $transaction))
|
|
||||||
// {
|
|
||||||
// $payment = Payment::query()
|
|
||||||
// ->where('company_id', $company->id)
|
|
||||||
// ->where(function ($query) use ($transaction) {
|
|
||||||
// $query->where('transaction_reference', $transaction['payment_intent'])
|
|
||||||
// ->orWhere('transaction_reference', $transaction['id']);
|
|
||||||
// })
|
|
||||||
// ->first();
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// $payment = Payment::query()
|
|
||||||
// ->where('company_id', $company->id)
|
|
||||||
// ->where('transaction_reference', $transaction['id'])
|
|
||||||
// ->first();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if ($payment) {
|
|
||||||
// $payment->status_id = Payment::STATUS_COMPLETED;
|
|
||||||
// $payment->save();
|
|
||||||
|
|
||||||
// $this->payment_completed = true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// if($this->payment_completed)
|
|
||||||
// return;
|
|
||||||
|
|
||||||
|
|
||||||
// if(isset($this->stripe_request['object']['charges']) && optional($this->stripe_request['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['object']['charges']['data'][0]['id'])
|
|
||||||
// ->first();
|
|
||||||
|
|
||||||
// //return early
|
|
||||||
// if($payment && $payment->status_id == Payment::STATUS_COMPLETED){
|
|
||||||
// nlog(" payment found and status correct - returning ");
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// elseif($payment){
|
|
||||||
// $payment->status_id = Payment::STATUS_COMPLETED;
|
|
||||||
// $payment->save();
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// $hash = optional($this->stripe_request['object']['charges']['data'][0]['metadata'])['payment_hash'];
|
|
||||||
|
|
||||||
// $payment_hash = PaymentHash::where('hash', $hash)->first();
|
|
||||||
|
|
||||||
// if(!$payment_hash)
|
|
||||||
// return;
|
|
||||||
|
|
||||||
// nlog("payment intent");
|
|
||||||
// nlog($this->stripe_request);
|
|
||||||
|
|
||||||
// if(array_key_exists('allowed_source_types', $this->stripe_request['object']) && optional($this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash']) && in_array('card', $this->stripe_request['object']['allowed_source_types']))
|
|
||||||
// {
|
|
||||||
// nlog("hash found");
|
|
||||||
|
|
||||||
// $hash = $this->stripe_request['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);
|
|
||||||
// }
|
|
||||||
// elseif(array_key_exists('payment_method_types', $this->stripe_request['object']) && optional($this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash']) && in_array('card', $this->stripe_request['object']['payment_method_types']))
|
|
||||||
// {
|
|
||||||
// nlog("hash found");
|
|
||||||
|
|
||||||
// $hash = $this->stripe_request['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);
|
|
||||||
// }
|
|
||||||
// elseif(array_key_exists('payment_method_types', $this->stripe_request['object']) && optional($this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash']) && in_array('us_bank_account', $this->stripe_request['object']['payment_method_types']))
|
|
||||||
// {
|
|
||||||
// nlog("hash found");
|
|
||||||
|
|
||||||
// $hash = $this->stripe_request['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->updateAchPayment($payment_hash, $client);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// SystemLogger::dispatch(
|
|
||||||
// ['response' => $this->stripe_request, 'data' => []],
|
|
||||||
// SystemLog::CATEGORY_GATEWAY_RESPONSE,
|
|
||||||
// SystemLog::EVENT_GATEWAY_SUCCESS,
|
|
||||||
// SystemLog::TYPE_STRIPE,
|
|
||||||
// null,
|
|
||||||
// $company,
|
|
||||||
// );
|
|
||||||
|
|
||||||
// return;
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
nlog("if");
|
|
||||||
|
|
||||||
nlog($this->stripe_request['object']['latest_charge']);
|
|
||||||
|
|
||||||
if(isset($this->stripe_request['object']['latest_charge']))
|
|
||||||
{
|
{
|
||||||
$pi = \Stripe\PaymentIntent::retrieve($this->stripe_request['object']['id'], $this->stripe_driver->stripe_connect_auth);
|
$payment = Payment::query()
|
||||||
|
->where('company_id', $company->id)
|
||||||
|
->where(function ($query) use ($transaction) {
|
||||||
|
$query->where('transaction_reference', $transaction['payment_intent'])
|
||||||
|
->orWhere('transaction_reference', $transaction['id']);
|
||||||
|
})
|
||||||
|
->first();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$payment = Payment::query()
|
||||||
|
->where('company_id', $company->id)
|
||||||
|
->where('transaction_reference', $transaction['id'])
|
||||||
|
->first();
|
||||||
|
}
|
||||||
|
|
||||||
$charge = reset($pi->charges->data);
|
if ($payment) {
|
||||||
|
$payment->status_id = Payment::STATUS_COMPLETED;
|
||||||
|
$payment->save();
|
||||||
|
|
||||||
nlog($charge);
|
$this->payment_completed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if($this->payment_completed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$company_gateway = CompanyGateway::find($this->company_gateway_id);
|
||||||
|
$stripe_driver = $company_gateway->driver()->init();
|
||||||
|
|
||||||
|
$charge_id = false;
|
||||||
|
|
||||||
|
if(isset($this->stripe_request['object']['charges']) && optional($this->stripe_request['object']['charges']['data'][0])['id'])
|
||||||
|
$charge_id = $this->stripe_request['object']['charges']['data'][0]['id']; // API VERSION 2018
|
||||||
|
elseif (isset($this->stripe_request['object']['latest_charge']))
|
||||||
|
$charge_id = $this->stripe_request['object']['latest_charge']; // API VERSION 2022-11-15
|
||||||
|
|
||||||
|
|
||||||
|
if(!$charge_id){
|
||||||
|
nlog("could not resolve charge");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pi = \Stripe\PaymentIntent::retrieve($this->stripe_request['object']['id'], $stripe_driver->stripe_connect_auth);
|
||||||
|
|
||||||
|
$charge = \Stripe\Charge::retrieve($charge_id, $stripe_driver->stripe_connect_auth);
|
||||||
|
|
||||||
|
if(!$charge)
|
||||||
|
{
|
||||||
|
nlog("no charge found");
|
||||||
|
nlog($this->stripe_request);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$company = Company::where('company_key', $this->company_key)->first();
|
$company = Company::where('company_key', $this->company_key)->first();
|
||||||
|
|
||||||
@ -204,48 +136,46 @@ nlog($charge);
|
|||||||
$payment->save();
|
$payment->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
$hash = optional($charge['metadata']['payment_hash']);
|
$hash = isset($charge['metadata']['payment_hash']) ? $charge['metadata']['payment_hash'] : false;
|
||||||
|
|
||||||
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
||||||
|
|
||||||
if(!$payment_hash)
|
if(!$payment_hash)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
$stripe_driver->client = $payment_hash->fee_invoice->client;
|
||||||
|
|
||||||
|
$meta = [
|
||||||
|
'gateway_type_id' => $pi['metadata']['gateway_type_id'],
|
||||||
|
'transaction_reference' => $charge['id'],
|
||||||
|
'customer' => $charge['customer'],
|
||||||
|
'payment_method' => $charge['payment_method'],
|
||||||
|
'card_details' => isset($charge['payment_method_details']['card']['brand']) ? $charge['payment_method_details']['card']['brand'] : PaymentType::CREDIT_CARD_OTHER
|
||||||
|
];
|
||||||
|
|
||||||
if(isset($pi['allowed_source_types']) && in_array('card', $pi['allowed_source_types']))
|
if(isset($pi['allowed_source_types']) && in_array('card', $pi['allowed_source_types']))
|
||||||
{
|
{
|
||||||
nlog("hash found");
|
|
||||||
|
|
||||||
$hash = $this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash'];
|
|
||||||
|
|
||||||
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
|
||||||
$invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id);
|
$invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id);
|
||||||
$client = $invoice->client;
|
$client = $invoice->client;
|
||||||
|
|
||||||
$this->updateCreditCardPayment($payment_hash, $client);
|
$this->updateCreditCardPayment($payment_hash, $client, $meta);
|
||||||
}
|
}
|
||||||
elseif(isset($pi['payment_method_types']) && in_array('card', $pi['payment_method_types']))
|
elseif(isset($pi['payment_method_types']) && in_array('card', $pi['payment_method_types']))
|
||||||
{
|
{
|
||||||
nlog("hash found");
|
|
||||||
|
|
||||||
$hash = $this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash'];
|
|
||||||
|
|
||||||
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
|
||||||
$invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id);
|
$invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id);
|
||||||
$client = $invoice->client;
|
$client = $invoice->client;
|
||||||
|
|
||||||
$this->updateCreditCardPayment($payment_hash, $client);
|
$this->updateCreditCardPayment($payment_hash, $client, $meta);
|
||||||
}
|
}
|
||||||
elseif(isset($pi['payment_method_types']) && in_array('us_bank_account', $pi['payment_method_types']))
|
elseif(isset($pi['payment_method_types']) && in_array('us_bank_account', $pi['payment_method_types']))
|
||||||
{
|
{
|
||||||
nlog("hash found");
|
|
||||||
|
|
||||||
$hash = $this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash'];
|
|
||||||
|
|
||||||
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
|
||||||
$invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id);
|
$invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id);
|
||||||
$client = $invoice->client;
|
$client = $invoice->client;
|
||||||
|
|
||||||
$this->updateAchPayment($payment_hash, $client);
|
$this->updateAchPayment($payment_hash, $client, $meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemLogger::dispatch(
|
SystemLogger::dispatch(
|
||||||
@ -258,18 +188,12 @@ nlog($charge);
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function updateAchPayment($payment_hash, $client, $meta)
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private function updateAchPayment($payment_hash, $client)
|
|
||||||
{
|
{
|
||||||
$company_gateway = CompanyGateway::find($this->company_gateway_id);
|
$company_gateway = CompanyGateway::find($this->company_gateway_id);
|
||||||
$payment_method_type = optional($this->stripe_request['object']['charges']['data'][0]['metadata'])['gateway_type_id'];
|
$payment_method_type = $meta['gateway_type_id'];
|
||||||
$driver = $company_gateway->driver($client)->init()->setPaymentMethod($payment_method_type);
|
$driver = $company_gateway->driver($client)->init()->setPaymentMethod($payment_method_type);
|
||||||
|
|
||||||
$payment_hash->data = array_merge((array) $payment_hash->data, $this->stripe_request);
|
$payment_hash->data = array_merge((array) $payment_hash->data, $this->stripe_request);
|
||||||
@ -280,7 +204,7 @@ nlog($charge);
|
|||||||
'payment_method' => $payment_hash->data->object->payment_method,
|
'payment_method' => $payment_hash->data->object->payment_method,
|
||||||
'payment_type' => PaymentType::ACH,
|
'payment_type' => PaymentType::ACH,
|
||||||
'amount' => $payment_hash->data->amount_with_fee,
|
'amount' => $payment_hash->data->amount_with_fee,
|
||||||
'transaction_reference' => $this->stripe_request['object']['charges']['data'][0]['id'],
|
'transaction_reference' => $meta['transaction_reference'],
|
||||||
'gateway_type_id' => GatewayType::BANK_TRANSFER,
|
'gateway_type_id' => GatewayType::BANK_TRANSFER,
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -297,9 +221,9 @@ nlog($charge);
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$customer = $driver->getCustomer($this->stripe_request['object']['charges']['data'][0]['customer']);
|
$customer = $driver->getCustomer($meta['customer']);
|
||||||
$method = $driver->getStripePaymentMethod($this->stripe_request['object']['charges']['data'][0]['payment_method']);
|
$method = $driver->getStripePaymentMethod($meta['payment_method']);
|
||||||
$payment_method = $this->stripe_request['object']['charges']['data'][0]['payment_method'];
|
$payment_method = $meta['payment_method'];
|
||||||
|
|
||||||
$token_exists = ClientGatewayToken::where([
|
$token_exists = ClientGatewayToken::where([
|
||||||
'gateway_customer_reference' => $customer->id,
|
'gateway_customer_reference' => $customer->id,
|
||||||
@ -341,10 +265,10 @@ nlog($charge);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private function updateCreditCardPayment($payment_hash, $client)
|
private function updateCreditCardPayment($payment_hash, $client, $meta)
|
||||||
{
|
{
|
||||||
$company_gateway = CompanyGateway::find($this->company_gateway_id);
|
$company_gateway = CompanyGateway::find($this->company_gateway_id);
|
||||||
$payment_method_type = optional($this->stripe_request['object']['charges']['data'][0]['metadata'])['gateway_type_id'];
|
$payment_method_type = $meta['gateway_type_id'];
|
||||||
$driver = $company_gateway->driver($client)->init()->setPaymentMethod($payment_method_type);
|
$driver = $company_gateway->driver($client)->init()->setPaymentMethod($payment_method_type);
|
||||||
|
|
||||||
$payment_hash->data = array_merge((array) $payment_hash->data, $this->stripe_request);
|
$payment_hash->data = array_merge((array) $payment_hash->data, $this->stripe_request);
|
||||||
@ -353,9 +277,9 @@ nlog($charge);
|
|||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'payment_method' => $payment_hash->data->object->payment_method,
|
'payment_method' => $payment_hash->data->object->payment_method,
|
||||||
'payment_type' => PaymentType::parseCardType(strtolower(optional($this->stripe_request['object']['charges']['data'][0]['payment_method_details']['card'])['brand'])) ?: PaymentType::CREDIT_CARD_OTHER,
|
'payment_type' => PaymentType::parseCardType(strtolower($meta['card_details'])) ?: PaymentType::CREDIT_CARD_OTHER,
|
||||||
'amount' => $payment_hash->data->amount_with_fee,
|
'amount' => $payment_hash->data->amount_with_fee,
|
||||||
'transaction_reference' => $this->stripe_request['object']['charges']['data'][0]['id'],
|
'transaction_reference' => $meta['transaction_reference'],
|
||||||
'gateway_type_id' => GatewayType::CREDIT_CARD,
|
'gateway_type_id' => GatewayType::CREDIT_CARD,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user