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