From bc50c34792786be8037200c4fd2bc1a430a3ac65 Mon Sep 17 00:00:00 2001 From: Glauber Silva Date: Fri, 27 Oct 2023 18:32:48 -0300 Subject: [PATCH 1/5] refactor: use the exit statement in webhook events only when it is processed --- .../Webhooks/Listeners/ChargeRefunded.php | 14 +++++++++----- .../Listeners/CustomerSubscriptionCreated.php | 14 ++++++++------ .../Listeners/CustomerSubscriptionDeleted.php | 14 +++++++++----- .../Webhooks/Listeners/InvoicePaymentFailed.php | 14 +++++++++----- .../Listeners/InvoicePaymentSucceeded.php | 15 +++++++++------ .../Listeners/PaymentIntentPaymentFailed.php | 14 +++++++++----- .../Webhooks/Listeners/PaymentIntentSucceeded.php | 14 +++++++++----- 7 files changed, 62 insertions(+), 37 deletions(-) diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php index 5d363da6da..4e3af042fe 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php @@ -22,6 +22,7 @@ class ChargeRefunded * * @see https://stripe.com/docs/api/events/types#event_types-charge.refunded * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -30,20 +31,21 @@ class ChargeRefunded public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 * * @throws Exception */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var Charge $stripeCharge */ $stripeCharge = $event->data->object; @@ -51,7 +53,7 @@ public function processEvent(Event $event) $donation = give()->donations->getByGatewayTransactionId($stripeCharge->payment_intent); if (!$donation || !$this->shouldProcessDonation($donation)) { - return; + return false; } if ($stripeCharge->refunded && !$donation->status->isRefunded()) { @@ -63,5 +65,7 @@ public function processEvent(Event $event) 'content' => __('Payment refunded in Stripe.', 'give'), ]); } + + return true; } } diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php index 73a6e8e7a1..a10f97ddf4 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php @@ -20,6 +20,7 @@ class CustomerSubscriptionCreated * * @see https://stripe.com/docs/api/events/types#event_types-customer.subscription.created * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -28,18 +29,19 @@ class CustomerSubscriptionCreated public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var StripeSubscription $stripeSubscription */ $stripeSubscription = $event->data->object; @@ -48,11 +50,11 @@ public function processEvent(Event $event) // only use this for next gen for now if (!$subscription || !$this->shouldProcessSubscription($subscription)) { - return; + return false; } // exit early to prevent legacy webhook // we don't need to do anything here at the moment because the subscription is already created & active - exit; + return true; } } diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php index 8561b12b2e..19636500c7 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php @@ -21,6 +21,7 @@ class CustomerSubscriptionDeleted * * @see https://stripe.com/docs/api/events/types#event_types-customer.subscription.deleted * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -29,19 +30,20 @@ class CustomerSubscriptionDeleted public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 * @throws Exception */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var StripeSubscription $stripeSubscription */ $stripeSubscription = $event->data->object; @@ -50,12 +52,14 @@ public function processEvent(Event $event) // only use this for next gen for now if (!$subscription || !$this->shouldProcessSubscription($subscription)) { - return; + return false; } if (!$subscription->status->isCancelled() && !$subscription->status->isCompleted()) { $subscription->status = SubscriptionStatus::COMPLETED(); $subscription->save(); } + + return true; } } diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php index 88a1feb10f..de94f5268c 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php @@ -21,6 +21,7 @@ class InvoicePaymentFailed * * @see https://stripe.com/docs/api/events/types#event_types-invoice.payment_failed * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -29,20 +30,21 @@ class InvoicePaymentFailed public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 * * @throws Exception */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var Invoice $invoice */ $invoice = $event->data->object; @@ -51,7 +53,7 @@ public function processEvent(Event $event) // only use this for next gen for now if (!$subscription || !$this->shouldProcessSubscription($subscription)) { - return; + return false; } if ( @@ -64,6 +66,8 @@ public function processEvent(Event $event) $subscription->status = SubscriptionStatus::FAILING(); $subscription->save(); } + + return true; } /** diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php index be8e06988b..f3d50b1947 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php @@ -25,27 +25,28 @@ class InvoicePaymentSucceeded * * @see https://stripe.com/docs/api/events/types#event_types-invoice.payment_succeeded * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * - * @return void * @throws \Exception */ public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 * @throws \Exception */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var Invoice $invoice */ $invoice = $event->data->object; @@ -54,7 +55,7 @@ public function processEvent(Event $event) // only use this for next gen for now if (!$subscription || !$this->shouldProcessSubscription($subscription)) { - return; + return false; } if ($initialDonation = give()->donations->getByGatewayTransactionId($invoice->payment_intent)) { @@ -71,6 +72,8 @@ public function processEvent(Event $event) $subscriptionModel->handleSubscriptionCompleted(); } } + + return true; } /** diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php index 4cc6148b5d..fd12882155 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php @@ -22,6 +22,7 @@ class PaymentIntentPaymentFailed * * @see https://stripe.com/docs/api/events/types#event_types-payment_intent.payment_failed * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -30,18 +31,19 @@ class PaymentIntentPaymentFailed public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var PaymentIntent $paymentIntent */ $paymentIntent = $event->data->object; @@ -49,7 +51,7 @@ public function processEvent(Event $event) $donation = give()->donations->getByGatewayTransactionId($paymentIntent->id); if (!$donation || !$this->shouldProcessDonation($donation)) { - return; + return false; } if ($donation->type->isSingle() && !$donation->status->isFailed()) { @@ -61,5 +63,7 @@ public function processEvent(Event $event) 'content' => __('Payment failed in Stripe.', 'give'), ]); } + + return true; } } diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php index 5460e56957..7502d6c108 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php @@ -22,6 +22,7 @@ class PaymentIntentSucceeded * * @see https://stripe.com/docs/api/events/types#event_types-invoice.payment_succeeded * + * @unreleased Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -30,18 +31,19 @@ class PaymentIntentSucceeded public function __invoke(Event $event) { try { - $this->processEvent($event); + if ($this->processEvent($event)) { + exit; + } } catch (Exception $exception) { $this->logWebhookError($event, $exception); } - - exit; } /** + * @unreleased Return a bool value. * @since 3.0.0 */ - public function processEvent(Event $event) + public function processEvent(Event $event): bool { /* @var PaymentIntent $paymentIntent */ $paymentIntent = $event->data->object; @@ -49,7 +51,7 @@ public function processEvent(Event $event) $donation = give()->donations->getByGatewayTransactionId($paymentIntent->id); if (!$donation || !$this->shouldProcessDonation($donation)) { - return; + return false; } if ($donation->type->isSingle() && !$donation->status->isComplete()) { @@ -61,5 +63,7 @@ public function processEvent(Event $event) 'content' => __('Payment succeeded in Stripe.', 'give'), ]); } + + return true; } } From 18701777daf9850d56b8809a09f8e38de276a2be Mon Sep 17 00:00:00 2001 From: Jon Waldstein Date: Mon, 30 Oct 2023 10:31:56 -0400 Subject: [PATCH 2/5] chore: prepare for 3.0.4 release --- give.php | 4 ++-- readme.txt | 5 ++++- .../Webhooks/Listeners/ChargeRefunded.php | 4 ++-- .../Webhooks/Listeners/CustomerSubscriptionCreated.php | 4 ++-- .../Webhooks/Listeners/CustomerSubscriptionDeleted.php | 4 ++-- .../Webhooks/Listeners/InvoicePaymentFailed.php | 4 ++-- .../Webhooks/Listeners/InvoicePaymentSucceeded.php | 4 ++-- .../Webhooks/Listeners/PaymentIntentPaymentFailed.php | 4 ++-- .../Webhooks/Listeners/PaymentIntentSucceeded.php | 4 ++-- 9 files changed, 20 insertions(+), 17 deletions(-) diff --git a/give.php b/give.php index cd1679e378..e362fa758b 100644 --- a/give.php +++ b/give.php @@ -6,7 +6,7 @@ * Description: The most robust, flexible, and intuitive way to accept donations on WordPress. * Author: GiveWP * Author URI: https://givewp.com/ - * Version: 3.0.3 + * Version: 3.0.4 * Requires at least: 6.0 * Requires PHP: 7.2 * Text Domain: give @@ -391,7 +391,7 @@ private function setup_constants() { // Plugin version. if (!defined('GIVE_VERSION')) { - define('GIVE_VERSION', '3.0.2'); + define('GIVE_VERSION', '3.0.4'); } // Plugin Root File. diff --git a/readme.txt b/readme.txt index a8de6b6aa4..40dd7e3197 100644 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Tags: donation, donate, recurring donations, fundraising, crowdfunding Requires at least: 6.0 Tested up to: 6.4 Requires PHP: 7.2 -Stable tag: 3.0.3 +Stable tag: 3.0.4 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -262,6 +262,9 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri 10. Use almost any payment gateway integration with GiveWP through our add-ons or by creating your own add-on. == Changelog == += 3.0.4: October 30th, 2023 = +* Fix: Resolved issue with Stripe webhook not recording recurring donation renewals + = 3.0.3: October 20th, 2023 = * Fix: Using the multi-form shortcode with the ids attribute no longer causes a fatal error diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php index 4e3af042fe..9d472bd81c 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/ChargeRefunded.php @@ -22,7 +22,7 @@ class ChargeRefunded * * @see https://stripe.com/docs/api/events/types#event_types-charge.refunded * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -40,7 +40,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 * * @throws Exception diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php index a10f97ddf4..4e12392028 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionCreated.php @@ -20,7 +20,7 @@ class CustomerSubscriptionCreated * * @see https://stripe.com/docs/api/events/types#event_types-customer.subscription.created * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -38,7 +38,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 */ public function processEvent(Event $event): bool diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php index 19636500c7..072c1e5224 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/CustomerSubscriptionDeleted.php @@ -21,7 +21,7 @@ class CustomerSubscriptionDeleted * * @see https://stripe.com/docs/api/events/types#event_types-customer.subscription.deleted * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -39,7 +39,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 * @throws Exception */ diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php index de94f5268c..338c86bc08 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentFailed.php @@ -21,7 +21,7 @@ class InvoicePaymentFailed * * @see https://stripe.com/docs/api/events/types#event_types-invoice.payment_failed * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -39,7 +39,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 * * @throws Exception diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php index f3d50b1947..cff11aec7c 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/InvoicePaymentSucceeded.php @@ -25,7 +25,7 @@ class InvoicePaymentSucceeded * * @see https://stripe.com/docs/api/events/types#event_types-invoice.payment_succeeded * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @throws \Exception @@ -42,7 +42,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 * @throws \Exception */ diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php index fd12882155..19a8935c64 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentPaymentFailed.php @@ -22,7 +22,7 @@ class PaymentIntentPaymentFailed * * @see https://stripe.com/docs/api/events/types#event_types-payment_intent.payment_failed * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -40,7 +40,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 */ public function processEvent(Event $event): bool diff --git a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php index 7502d6c108..fd9d4b969f 100644 --- a/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php +++ b/src/PaymentGateways/Gateways/Stripe/StripePaymentElementGateway/Webhooks/Listeners/PaymentIntentSucceeded.php @@ -22,7 +22,7 @@ class PaymentIntentSucceeded * * @see https://stripe.com/docs/api/events/types#event_types-invoice.payment_succeeded * - * @unreleased Add exit statement only when the event is successfully processed. + * @since 3.0.4 Add exit statement only when the event is successfully processed. * @since 3.0.0 * * @return void @@ -40,7 +40,7 @@ public function __invoke(Event $event) } /** - * @unreleased Return a bool value. + * @since 3.0.4 Return a bool value. * @since 3.0.0 */ public function processEvent(Event $event): bool From 790b68207e039432b967f18b232acb7f26f1b00d Mon Sep 17 00:00:00 2001 From: Jon Waldstein Date: Mon, 30 Oct 2023 12:21:46 -0400 Subject: [PATCH 3/5] docs: update readme file with customer facing instructions --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 40dd7e3197..c27b079e59 100644 --- a/readme.txt +++ b/readme.txt @@ -263,7 +263,7 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri == Changelog == = 3.0.4: October 30th, 2023 = -* Fix: Resolved issue with Stripe webhook not recording recurring donation renewals +* Fix: Resolved issue with Stripe webhook not recording recurring donation renewals. To recover missing renewals from Stripe in GiveWP, please use the "Sync Subscription" button on the individual subscription details page. Click [here](https://givewp.com/recurring-donations-1-3/) to learn more about syncing subscriptions in GiveWP. = 3.0.3: October 20th, 2023 = * Fix: Using the multi-form shortcode with the ids attribute no longer causes a fatal error From 0e0da234567e90ff00ae51eeab4e3a632fa980c4 Mon Sep 17 00:00:00 2001 From: Jon Waldstein Date: Mon, 30 Oct 2023 12:28:30 -0400 Subject: [PATCH 4/5] docs: update reamde description --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index c27b079e59..a2739fe182 100644 --- a/readme.txt +++ b/readme.txt @@ -263,7 +263,7 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri == Changelog == = 3.0.4: October 30th, 2023 = -* Fix: Resolved issue with Stripe webhook not recording recurring donation renewals. To recover missing renewals from Stripe in GiveWP, please use the "Sync Subscription" button on the individual subscription details page. Click [here](https://givewp.com/recurring-donations-1-3/) to learn more about syncing subscriptions in GiveWP. +* Fix: Resolved issue with some Stripe gateways not recording incoming recurring donation renewals. To recover missing renewals from Stripe in GiveWP, please use the "Sync Subscription" button on the individual subscription details page. Click [here](https://givewp.com/recurring-donations-1-3/) to learn more about syncing subscriptions in GiveWP. = 3.0.3: October 20th, 2023 = * Fix: Using the multi-form shortcode with the ids attribute no longer causes a fatal error From 338dc9d48218f26ee8d7bdd2c72ba1abe59ccadf Mon Sep 17 00:00:00 2001 From: Jon Waldstein Date: Mon, 30 Oct 2023 13:39:55 -0400 Subject: [PATCH 5/5] docs: update readme with new docs link --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index a2739fe182..9a5cbc4210 100644 --- a/readme.txt +++ b/readme.txt @@ -263,7 +263,7 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri == Changelog == = 3.0.4: October 30th, 2023 = -* Fix: Resolved issue with some Stripe gateways not recording incoming recurring donation renewals. To recover missing renewals from Stripe in GiveWP, please use the "Sync Subscription" button on the individual subscription details page. Click [here](https://givewp.com/recurring-donations-1-3/) to learn more about syncing subscriptions in GiveWP. +* Fix: Resolved issue with some Stripe gateways not recording incoming recurring donation renewals. To recover missing renewals from Stripe in GiveWP, please use the "Sync Subscription" button on the individual subscription details page. Click [here](https://docs.givewp.com/syncrecurring) to learn more about syncing subscriptions in GiveWP. = 3.0.3: October 20th, 2023 = * Fix: Using the multi-form shortcode with the ids attribute no longer causes a fatal error