wp-user-avatar
/
src
/
Membership
/
PaymentMethods
/
Stripe
/
WebhookHandlers
/
CustomerSubscriptionUpdated.php
ChargeRefunded.php
11 months ago
CheckoutSessionAsyncPaymentFailed.php
4 months ago
CheckoutSessionAsyncPaymentSucceeded.php
4 months ago
CheckoutSessionCompleted.php
4 months ago
CustomerSubscriptionCreated.php
2 years ago
CustomerSubscriptionDeleted.php
3 years ago
CustomerSubscriptionUpdated.php
11 months ago
InvoicePaymentSucceeded.php
2 years ago
PaymentIntentSucceeded.php
3 years ago
index.php
3 years ago
CustomerSubscriptionUpdated.php
100 lines
| 1 | <?php |
| 2 | |
| 3 | namespace ProfilePress\Core\Membership\PaymentMethods\Stripe\WebhookHandlers; |
| 4 | |
| 5 | use ProfilePress\Core\Membership\Models\Subscription\SubscriptionStatus; |
| 6 | use ProfilePress\Core\Membership\PaymentMethods\Stripe\PaymentHelpers; |
| 7 | use ProfilePress\Core\Membership\PaymentMethods\WebhookHandlerInterface; |
| 8 | use ProfilePress\Core\Membership\Repositories\SubscriptionRepository; |
| 9 | use ProfilePress\Core\Membership\Services\Calculator; |
| 10 | use ProfilePressVendor\Carbon\CarbonImmutable; |
| 11 | |
| 12 | class CustomerSubscriptionUpdated implements WebhookHandlerInterface |
| 13 | { |
| 14 | public function handle($event_data) |
| 15 | { |
| 16 | $subscription_profile_id = $event_data['id']; |
| 17 | |
| 18 | $subscription = SubscriptionRepository::init()->retrieveBy([ |
| 19 | 'profile_id' => $subscription_profile_id |
| 20 | ]); |
| 21 | |
| 22 | if (empty($subscription)) return; |
| 23 | |
| 24 | $subscription = $subscription[0]; |
| 25 | |
| 26 | if ($event_data['cancel_at_period_end'] === true) { |
| 27 | // This is a subscription that has been cancelled but not deleted until period end |
| 28 | $subscription->add_note( |
| 29 | sprintf( |
| 30 | esc_html__('Subscription is scheduled for cancellation on %s', 'wp-user-avatar'), |
| 31 | ppress_format_date($event_data['cancel_at']) |
| 32 | ) |
| 33 | ); |
| 34 | |
| 35 | // cancelling early so subscription can be set back to active down below if this isn't an immediate cancellation |
| 36 | $subscription->cancel(); |
| 37 | } |
| 38 | |
| 39 | switch ($event_data['status']) { |
| 40 | case 'active': |
| 41 | if ( ! $subscription->is_active()) { |
| 42 | $subscription->activate_subscription($subscription_profile_id); |
| 43 | } else { |
| 44 | $subscription->status = SubscriptionStatus::ACTIVE; |
| 45 | } |
| 46 | // ensures expiration date is in sync with Stripe |
| 47 | $subscription->expiration_date = CarbonImmutable::createFromTimestampUTC($event_data['current_period_end'])->toDateTimeString(); |
| 48 | break; |
| 49 | case 'trialing': |
| 50 | if ( ! $subscription->is_active()) { |
| 51 | $subscription->enable_subscription_trial($subscription_profile_id); |
| 52 | } else { |
| 53 | $subscription->status = SubscriptionStatus::TRIALLING; |
| 54 | } |
| 55 | // ensures expiration date is in sync with Stripe |
| 56 | $subscription->expiration_date = CarbonImmutable::createFromTimestampUTC($event_data['trial_end'])->toDateTimeString(); |
| 57 | break; |
| 58 | case 'unpaid': |
| 59 | $subscription->expire(); |
| 60 | break; |
| 61 | case 'canceled': |
| 62 | if ($event_data['cancel_at_period_end'] !== true && apply_filters('ppress_stripe_subscription_set_cancelled_action_as_expired', false, $subscription)) { |
| 63 | $subscription->expire(); |
| 64 | } else { |
| 65 | $subscription->cancel(); |
| 66 | } |
| 67 | break; |
| 68 | case 'past_due': |
| 69 | $subscription->add_note( |
| 70 | sprintf( |
| 71 | esc_html__('Stripe payment failed (payment is past due)', 'wp-user-avatar'), |
| 72 | ppress_format_date($event_data['cancel_at']) |
| 73 | ) |
| 74 | ); |
| 75 | break; |
| 76 | } |
| 77 | |
| 78 | do_action('ppress_stripe_subscription_status_change', $subscription->status, $event_data, $subscription); |
| 79 | |
| 80 | $old_amount = $subscription->recurring_amount; |
| 81 | $new_amount = $event_data['plan']['amount']; |
| 82 | |
| 83 | if ( ! PaymentHelpers::is_zero_decimal_currency($event_data['plan']['currency'])) { |
| 84 | $new_amount = Calculator::init($new_amount)->dividedBy('100')->val(); |
| 85 | } |
| 86 | |
| 87 | $old_amount = ppress_sanitize_amount($old_amount); |
| 88 | $new_amount = ppress_sanitize_amount($new_amount); |
| 89 | |
| 90 | if ($new_amount !== $old_amount) { |
| 91 | |
| 92 | $subscription->recurring_amount = $new_amount; |
| 93 | |
| 94 | $subscription->add_note(sprintf(__('Recurring amount changed from %s to %s in Stripe.', 'wp-user-avatar'), $old_amount, $new_amount)); |
| 95 | } |
| 96 | |
| 97 | $subscription->save(); |
| 98 | } |
| 99 | } |
| 100 |