diff --git a/api/v3/Stripe/Listevents.php b/api/v3/Stripe/Listevents.php
index 2d2a873298e22f3b2dda6866be88a98afde9a177..d5ca427b9464da5b6354c88433749982ea99e67b 100644
--- a/api/v3/Stripe/Listevents.php
+++ b/api/v3/Stripe/Listevents.php
@@ -206,10 +206,6 @@ function civicrm_api3_stripe_Listevents($params) {
   $processor->setAPIParams();
 
   $data_list = \Stripe\Event::all($args);
-  if (array_key_exists('error', $data_list)) {
-    $err = $data_list['error'];
-    throw new API_Exception(/*errorMessage*/ "Stripe returned an error: " . $err->message, /*errorCode*/ $err->type);
-  }
   $out = $data_list;
   if ($params['output'] == 'brief') {
     $out = [];
diff --git a/tests/phpunit/CRM/Stripe/IpnTest.php b/tests/phpunit/CRM/Stripe/IpnTest.php
index 6384478e8a8c6a8567bb26c05fcdbd4b952d7699..f43aa521e6d089760d791fc14f8fc5eb79f4b57a 100644
--- a/tests/phpunit/CRM/Stripe/IpnTest.php
+++ b/tests/phpunit/CRM/Stripe/IpnTest.php
@@ -48,6 +48,7 @@ class CRM_Stripe_IpnTest extends CRM_Stripe_BaseTest {
     $payment_extra_params = [
       'is_recur' => 1,
       'contributionRecurID' => $this->contributionRecurID,
+      'contributionID' => $this->contributionID,
       'frequency_unit' => $this->frequency_unit,
       'frequency_interval' => $this->frequency_interval,
       'installments' => $this->installments,
@@ -55,7 +56,7 @@ class CRM_Stripe_IpnTest extends CRM_Stripe_BaseTest {
     $this->doPayment($payment_extra_params);
 
     // Ensure contribution status is set to pending.
-    $status_id = civicrm_api3('Contribution', 'getvalue', [ 'id' => $this->contributionID, 'return' => 'contribution_status_id' ]);
+    $status_id = civicrm_api3('Contribution', 'getvalue', ['id' => $this->contributionID, 'return' => 'contribution_status_id']);
     $this->assertEquals(2, $status_id);
 
     // Now check to see if an event was triggered and if so, process it.
@@ -64,7 +65,7 @@ class CRM_Stripe_IpnTest extends CRM_Stripe_BaseTest {
       $this->ipn($payment_object);
     }
     // Ensure Contribution status is updated to complete.
-    $status_id = civicrm_api3('Contribution', 'getvalue', [ 'id' => $this->contributionID, 'return' => 'contribution_status_id' ]);
+    $status_id = civicrm_api3('Contribution', 'getvalue', ['id' => $this->contributionID, 'return' => 'contribution_status_id']);
     $this->assertEquals(1, $status_id);
 
   }
@@ -90,25 +91,35 @@ class CRM_Stripe_IpnTest extends CRM_Stripe_BaseTest {
     // Now try to retrieve this transaction.
     // Give it a few seconds to be processed...
     sleep(5);
-    $transactions = civicrm_api3('Stripe', 'listevents', $params );
+    $transactions = civicrm_api3('Stripe', 'listevents', $params);
     foreach($transactions['values']['data'] as $transaction) {
       if ($transaction->data->object->$property == $this->processorID) {
         return $transaction;
       }
     }
     return NULL;
-
   }
 
   /**
    * Run the webhook/ipn
    *
    */
-  public function ipn($data, $verify = TRUE) {
-    // The $_GET['processor_id'] value is normally set by
-    // CRM_Core_Payment::handlePaymentMethod
-    $_GET['processor_id'] = $this->paymentProcessorID;
-    $ipnClass = new CRM_Core_Payment_StripeIPN($data, $verify);
+  public function ipn($event, $verifyRequest = TRUE) {
+    $ipnClass = new CRM_Core_Payment_StripeIPN();
+    $ipnClass->setEventID($event->id);
+    if (!$ipnClass->setEventType($event->type)) {
+      // We don't handle this event
+      return FALSE;
+    };
+    $ipnClass->setVerifyData($verifyRequest);
+    if (!$verifyRequest) {
+      $ipnClass->setData($event->data);
+    }
+    $ipnClass->setPaymentProcessor($this->paymentProcessorID);
+    $ipnClass->setExceptionMode(FALSE);
+    if (isset($emailReceipt)) {
+      $ipnClass->setSendEmailReceipt($emailReceipt);
+    }
     $ipnClass->processWebhook();
   }