From fcff16f10f8f9e4b8a947df26e5ff8d8c0c50765 Mon Sep 17 00:00:00 2001
From: Matthew Wire <mjw@mjwconsult.co.uk>
Date: Wed, 17 Feb 2021 21:01:03 +0000
Subject: [PATCH] Catch errors processing webhooks and continue processing the
 list of pending webhooks

---
 .../Job/ProcessPaymentprocessorWebhooks.php   | 26 ++++++++++++++-----
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/api/v3/Job/ProcessPaymentprocessorWebhooks.php b/api/v3/Job/ProcessPaymentprocessorWebhooks.php
index 4ca4db3..4b93d6c 100644
--- a/api/v3/Job/ProcessPaymentprocessorWebhooks.php
+++ b/api/v3/Job/ProcessPaymentprocessorWebhooks.php
@@ -9,6 +9,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\PaymentprocessorWebhook;
+
 /**
  * This job performs various housekeeping actions related to the Stripe payment processor
  *
@@ -21,20 +23,20 @@
 function civicrm_api3_job_process_paymentprocessor_webhooks($params) {
   if ($params['delete_old'] !== 0 && !empty($params['delete_old'])) {
     // Delete all locally recorded webhooks that are older than 3 months
-    \Civi\Api4\PaymentprocessorWebhook::delete()
+    PaymentprocessorWebhook::delete()
       ->setCheckPermissions(FALSE) // Replace with ::update(FALSE) when minversion = 5.29
       ->addWhere('created_date', '<', $params['delete_old'])
       ->execute();
   }
 
-  $paymentProcessorWebhooks = \Civi\Api4\PaymentprocessorWebhook::get()
+  $paymentProcessorWebhooks = PaymentprocessorWebhook::get()
     ->setCheckPermissions(FALSE) // Replace with ::update(FALSE) when minversion = 5.29
     ->addWhere('processed_date', 'IS NULL')
     ->addWhere('status', 'IS NULL')
     ->execute();
   $results = [];
   if (!empty($paymentProcessorWebhooks->rowCount)) {
-    \Civi\Api4\PaymentprocessorWebhook::update()
+    PaymentprocessorWebhook::update()
       ->setCheckPermissions(FALSE) // Replace with ::update(FALSE) when minversion = 5.29
       ->addWhere('id', 'IN', $paymentProcessorWebhooks->column('id'))
       ->addValue('status', 'processing')
@@ -45,10 +47,20 @@ function civicrm_api3_job_process_paymentprocessor_webhooks($params) {
       ->getById($webhook['payment_processor_id']);
     switch ($paymentProcessor->getPaymentProcessor()['class_name']) {
       case 'Payment_Stripe':
-        $results[$webhook['id']] = civicrm_api3('Stripe', 'Ipn', [
-          'evtid' => $webhook['event_id'],
-          'ppid' => $webhook['payment_processor_id']
-        ])['values'];
+        try {
+          $results[$webhook['id']] = civicrm_api3('Stripe', 'Ipn', [
+            'evtid' => $webhook['event_id'],
+            'ppid' => $webhook['payment_processor_id']
+          ])['values'];
+        }
+        catch (Exception $e) {
+          \Civi::log()->error('Error processing webhook (ID: ' . $webhook['id'] . '): ' . $e->getMessage());
+          PaymentprocessorWebhook::update()
+            ->setCheckPermissions(FALSE) // Replace with ::update(FALSE) when minversion = 5.29
+            ->addWhere('id', '=', $webhook['id'])
+            ->addValue('status', 'error')
+            ->execute();
+        }
         break;
     }
   }
-- 
GitLab