mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-10 13:12:50 +01:00
Fixes for stripe payments
This commit is contained in:
parent
4c68d6ba79
commit
a2503f0f40
@ -90,6 +90,7 @@ class PaymentController extends Controller
|
|||||||
|
|
||||||
public function response(PaymentResponseRequest $request)
|
public function response(PaymentResponseRequest $request)
|
||||||
{
|
{
|
||||||
|
|
||||||
$gateway = CompanyGateway::findOrFail($request->input('company_gateway_id'));
|
$gateway = CompanyGateway::findOrFail($request->input('company_gateway_id'));
|
||||||
|
|
||||||
$payment_hash = PaymentHash::whereRaw('BINARY `hash`= ?', [$request->payment_hash])->first();
|
$payment_hash = PaymentHash::whereRaw('BINARY `hash`= ?', [$request->payment_hash])->first();
|
||||||
|
@ -13,6 +13,7 @@ namespace App\Models;
|
|||||||
|
|
||||||
use App\Events\Payment\PaymentWasRefunded;
|
use App\Events\Payment\PaymentWasRefunded;
|
||||||
use App\Events\Payment\PaymentWasVoided;
|
use App\Events\Payment\PaymentWasVoided;
|
||||||
|
use App\Models\GatewayType;
|
||||||
use App\Services\Ledger\LedgerService;
|
use App\Services\Ledger\LedgerService;
|
||||||
use App\Services\Payment\PaymentService;
|
use App\Services\Payment\PaymentService;
|
||||||
use App\Utils\Ninja;
|
use App\Utils\Ninja;
|
||||||
@ -148,6 +149,11 @@ class Payment extends BaseModel
|
|||||||
return $this->belongsTo(PaymentType::class);
|
return $this->belongsTo(PaymentType::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function gateway_type()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(GatewayType::class);
|
||||||
|
}
|
||||||
|
|
||||||
public function paymentables()
|
public function paymentables()
|
||||||
{
|
{
|
||||||
return $this->hasMany(Paymentable::class);
|
return $this->hasMany(Paymentable::class);
|
||||||
|
@ -154,7 +154,6 @@ class ACSS
|
|||||||
'interval_description' => 'when any invoice becomes due',
|
'interval_description' => 'when any invoice becomes due',
|
||||||
'transaction_type' => 'personal' // TODO: check if is company or personal https://stripe.com/docs/payments/acss-debit
|
'transaction_type' => 'personal' // TODO: check if is company or personal https://stripe.com/docs/payments/acss-debit
|
||||||
],
|
],
|
||||||
'currency' => $this->stripe->client->currency()->code,
|
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
], $this->stripe->stripe_connect_auth);
|
], $this->stripe->stripe_connect_auth);
|
||||||
|
@ -42,6 +42,8 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
|
|
||||||
private $company_gateway_id;
|
private $company_gateway_id;
|
||||||
|
|
||||||
|
public $payment_completed = false;
|
||||||
|
|
||||||
public function __construct($stripe_request, $company_key, $company_gateway_id)
|
public function __construct($stripe_request, $company_key, $company_gateway_id)
|
||||||
{
|
{
|
||||||
$this->stripe_request = $stripe_request;
|
$this->stripe_request = $stripe_request;
|
||||||
@ -51,39 +53,79 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
|
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
|
// nlog($this->stripe_request);
|
||||||
// nlog(optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata'])['gateway_type_id']);
|
// nlog(optional($this->stripe_request['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['object']['charges']['data'][0]['metadata'])['payment_hash']);
|
||||||
// nlog(optional($this->stripe_request['data']['object']['charges']['data'][0]['payment_method_details']['card'])['brand']);
|
// nlog(optional($this->stripe_request['object']['charges']['data'][0]['payment_method_details']['card'])['brand']);
|
||||||
|
|
||||||
MultiDB::findAndSetDbByCompanyKey($this->company_key);
|
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();
|
||||||
|
|
||||||
|
foreach ($this->stripe_request as $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(optional($this->stripe_request['object']['charges']['data'][0])['id']){
|
||||||
|
|
||||||
$company = Company::where('company_key', $this->company_key)->first();
|
$company = Company::where('company_key', $this->company_key)->first();
|
||||||
|
|
||||||
$payment = Payment::query()
|
$payment = Payment::query()
|
||||||
->where('company_id', $company->id)
|
->where('company_id', $company->id)
|
||||||
->where('transaction_reference', $this->stripe_request['data']['object']['charges']['data'][0]['id'])
|
->where('transaction_reference', $this->stripe_request['object']['charges']['data'][0]['id'])
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
//return early
|
//return early
|
||||||
if($payment && $payment->status_id == Payment::STATUS_COMPLETED){
|
if($payment && $payment->status_id == Payment::STATUS_COMPLETED){
|
||||||
nlog(" payment found and status correct - returning ");
|
nlog(" payment found and status correct - returning ");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
elseif($payment){
|
||||||
|
$payment->status_id = Payment::STATUS_COMPLETED;
|
||||||
|
$payment->save();
|
||||||
|
}
|
||||||
|
|
||||||
$hash = optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata'])['payment_hash'];
|
|
||||||
|
$hash = optional($this->stripe_request['object']['charges']['data'][0]['metadata'])['payment_hash'];
|
||||||
|
|
||||||
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
||||||
|
|
||||||
nlog("no payment found");
|
nlog("no payment found");
|
||||||
|
|
||||||
if(optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata']['payment_hash']))
|
if(optional($this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash']) && in_array('card', $this->stripe_request['object']['allowed_source_types']))
|
||||||
{
|
{
|
||||||
nlog("hash found");
|
nlog("hash found");
|
||||||
|
|
||||||
$hash = $this->stripe_request['data']['object']['charges']['data'][0]['metadata']['payment_hash'];
|
$hash = $this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash'];
|
||||||
|
|
||||||
$payment_hash = PaymentHash::where('hash', $hash)->first();
|
$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);
|
||||||
@ -99,7 +141,7 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
private function updateCreditCardPayment($payment_hash, $client)
|
private function updateCreditCardPayment($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['data']['object']['charges']['data'][0]['metadata'])['gateway_type_id'];
|
$payment_method_type = optional($this->stripe_request['object']['charges']['data'][0]['metadata'])['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);
|
||||||
@ -107,10 +149,10 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
$driver->setPaymentHash($payment_hash);
|
$driver->setPaymentHash($payment_hash);
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'payment_method' => $payment_hash->data->data->object->payment_method,
|
'payment_method' => $payment_hash->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,
|
'payment_type' => PaymentType::parseCardType(strtolower(optional($this->stripe_request['object']['charges']['data'][0]['payment_method_details']['card'])['brand'])) ?: PaymentType::CREDIT_CARD_OTHER,
|
||||||
'amount' => $payment_hash->data->amount_with_fee,
|
'amount' => $payment_hash->data->amount_with_fee,
|
||||||
'transaction_reference' => $this->stripe_request['data']['object']['charges']['data'][0]['id'],
|
'transaction_reference' => $this->stripe_request['object']['charges']['data'][0]['id'],
|
||||||
'gateway_type_id' => GatewayType::CREDIT_CARD,
|
'gateway_type_id' => GatewayType::CREDIT_CARD,
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -127,9 +169,9 @@ class PaymentIntentWebhook implements ShouldQueue
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//charge # optional($this->stripe_request['data']['object']['charges']['data'][0])['id']
|
//charge # optional($this->stripe_request['object']['charges']['data'][0])['id']
|
||||||
//metadata # optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata']['gateway_type_id']
|
//metadata # optional($this->stripe_request['object']['charges']['data'][0]['metadata']['gateway_type_id']
|
||||||
//metadata # optional($this->stripe_request['data']['object']['charges']['data'][0]['metadata']['payment_hash']
|
//metadata # optional($this->stripe_request['object']['charges']['data'][0]['metadata']['payment_hash']
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -532,12 +532,13 @@ class StripePaymentDriver extends BaseDriver
|
|||||||
|
|
||||||
//payment_intent.succeeded - this will confirm or cancel the payment
|
//payment_intent.succeeded - this will confirm or cancel the payment
|
||||||
if($request->type === 'payment_intent.succeeded'){
|
if($request->type === 'payment_intent.succeeded'){
|
||||||
PaymentIntentWebhook::dispatch($request->all(), $request->company_key, $this->company_gateway->id)->delay(10);
|
PaymentIntentWebhook::dispatch($request->data, $request->company_key, $this->company_gateway->id)->delay(10);
|
||||||
// PaymentIntentWebhook::dispatch($request->all(), $request->company_key, $this->company_gateway->id);
|
// PaymentIntentWebhook::dispatch($request->data, $request->company_key, $this->company_gateway->id);
|
||||||
return response()->json([], 200);
|
return response()->json([], 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->type === 'charge.succeeded' || $request->type === 'payment_intent.succeeded') {
|
if ($request->type === 'charge.succeeded') {
|
||||||
|
// if ($request->type === 'charge.succeeded' || $request->type === 'payment_intent.succeeded') {
|
||||||
|
|
||||||
foreach ($request->data as $transaction) {
|
foreach ($request->data as $transaction) {
|
||||||
|
|
||||||
@ -564,6 +565,7 @@ class StripePaymentDriver extends BaseDriver
|
|||||||
$payment->save();
|
$payment->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} elseif ($request->type === 'source.chargeable') {
|
} elseif ($request->type === 'source.chargeable') {
|
||||||
$this->init();
|
$this->init();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user