Version 4.7.23

This commit is contained in:
Neo committed 2025-12-19 16:21:27 -08:00
1 parent 7124a02564
commit 25ddeb65d6
1791 files changed
+76990 -44452

No files matched your search

@@ -13,7 +13,7 @@
require_once '../../../../init.php';
\IPS\Session\Front::i();
\IPS\Output::i()->pageCaching = FALSE;
\IPS\Output::setCacheTime( false );
/**
* Stripe Webhook Handler
@@ -312,6 +312,61 @@ class stripeWebhookHandler
/* Return */
return 'OK';
}
/**
* A payment intent failed so we need to mark the transaction as failed locally
*
* @return string
*/
private function paymentIntentFailed(): string
{
/* Check the status */
if ( !\in_array( $this->transaction->status, [ \IPS\nexus\Transaction::STATUS_GATEWAY_PENDING, IPS\nexus\Transaction::STATUS_PENDING ] ) )
{
if ( $this->transaction->status === \IPS\nexus\Transaction::STATUS_REFUSED )
{
return 'ALREADY_PROCESSED';
}
else
{
throw new \Exception('BAD_STATUS');
}
}
/* Validate the charge with Stripe */
try
{
$pi = $this->transaction->method->api( 'payment_intents/' . $this->data['data']['object']['id'], null, 'get' );
if ( !is_array( $pi['last_payment_error'] ) )
{
throw new \Exception;
}
}
catch ( \Exception $e )
{
throw new \Exception('INVALID_PI');
}
/* Mark it failed */
$this->transaction->status = \IPS\nexus\Transaction::STATUS_REFUSED;
$extra = $this->transaction->extra;
$extra['history'][] = array( 's' => \IPS\nexus\Transaction::STATUS_REFUSED, 'noteRaw' => $this->data['data']['object']['last_payment_error']['message'] );
$this->transaction->extra = $extra;
$this->transaction->save();
$this->transaction->member->log( 'transaction', array(
'type' => 'paid',
'status' => \IPS\nexus\Transaction::STATUS_REFUSED,
'id' => $this->transaction->id,
'invoice_id' => $this->transaction->invoice->id,
'invoice_title' => $this->transaction->title,
), FALSE );
/* Send notification */
$this->transaction->sendNotification();
/* Return */
return 'OK';
}
/**
* A chargeback/dispute has been made against a transaction so we need to mark it as such locally
@@ -449,7 +504,7 @@ class stripeWebhookHandler
public function run( $signature )
{
/* Ignore anything we don't care about */
if ( !isset( $this->data['type'] ) or !\in_array( $this->data['type'], array( 'source.chargeable', 'charge.succeeded', 'charge.failed', 'charge.dispute.created', 'charge.dispute.closed' ) ) )
if ( !isset( $this->data['type'] ) or !\in_array( $this->data['type'], array( 'source.chargeable', 'charge.succeeded', 'charge.failed', 'charge.dispute.created', 'charge.dispute.closed'/*, 'payment_intent.payment_failed'*/ ) ) )
{
return 'UNNEEDED_TYPE';
}
@@ -460,12 +515,14 @@ class stripeWebhookHandler
{
if ( isset( $this->data['data']['object']['metadata']['Transaction ID'] ) )
{
$this->transaction = \IPS\nexus\Transaction::load( $this->data['data']['object']['metadata']['Transaction ID'] );
/* @note SELECT_FROM_WRITE_SERVER transaction race condition */
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', array( 't_id=?', $this->data['data']['object']['metadata']['Transaction ID'] ), flags: \IPS\Db::SELECT_FROM_WRITE_SERVER )->first() );
}
elseif ( isset( $this->data['data']['object']['redirect']['return_url'] ) )
{
$url = new \IPS\Http\Url( $this->data['data']['object']['redirect']['return_url'] );
$this->transaction = \IPS\nexus\Transaction::load( $url->queryString['nexusTransactionId'] );
/* @note SELECT_FROM_WRITE_SERVER transaction race condition */
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', array( 't_id=?', $url->queryString['nexusTransactionId'] ), flags: \IPS\Db::SELECT_FROM_WRITE_SERVER )->first() );
}
elseif ( isset( $this->data['data']['object']['charge'] ) )
{
@@ -492,11 +549,13 @@ class stripeWebhookHandler
if ( $paymentIntentId )
{
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', array( '( t_gw_id=? OR t_gw_id=? )', $paymentIntentId, $this->data['data']['object']['charge'] ) )->first() );
/* @note SELECT_FROM_WRITE_SERVER transaction race condition */
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', array( '( t_gw_id=? OR t_gw_id=? )', $paymentIntentId, $this->data['data']['object']['charge'] ), flags: \IPS\Db::SELECT_FROM_WRITE_SERVER )->first() );
}
else
{
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', array( 't_gw_id=?', $this->data['data']['object']['charge'] ) )->first() );
{
/* @note SELECT_FROM_WRITE_SERVER transaction race condition */
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', array( 't_gw_id=?', $this->data['data']['object']['charge'] ), flags: \IPS\Db::SELECT_FROM_WRITE_SERVER )->first() );
}
}
elseif ( isset( $this->data['data']['object']['id'] ) and mb_substr( $this->data['data']['object']['id'], 0, 4 ) !== 'src_' )
@@ -517,7 +576,8 @@ class stripeWebhookHandler
try
{
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', $where )->first() );
/* @note SELECT_FROM_WRITE_SERVER transaction race condition */
$this->transaction = \IPS\nexus\Transaction::constructFromData( \IPS\Db::i()->select( '*', 'nexus_transactions', $where, flags: \IPS\Db::SELECT_FROM_WRITE_SERVER )->first() );
}
catch ( \UnderflowException $e )
{
@@ -608,6 +668,8 @@ class stripeWebhookHandler
return $this->disputeCreated();
case 'charge.dispute.closed':
return $this->disputeClosed();
/*case 'payment_intent.payment_failed':
return $this->paymentIntentFailed();*/
default:
return 'UNNEEDED_TYPE';
}