From 370a0582e939bb7cf58a1e5c32532fade6cbe713 Mon Sep 17 00:00:00 2001 From: Dries Vints <dries@vints.io> Date: Tue, 9 Feb 2021 16:19:17 +0100 Subject: [PATCH] [12.x] Allow Stripe dashboard subscriptions (#1058) * Allow Stripe dashboard subscriptions * Add payload param * Re-add test --- src/Http/Controllers/WebhookController.php | 13 ++++++- tests/Feature/WebhooksTest.php | 40 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Http/Controllers/WebhookController.php b/src/Http/Controllers/WebhookController.php index 406cf873..fb30f904 100644 --- a/src/Http/Controllers/WebhookController.php +++ b/src/Http/Controllers/WebhookController.php @@ -79,7 +79,7 @@ protected function handleCustomerSubscriptionCreated(array $payload) $isSinglePlan = count($data['items']['data']) === 1; $subscription = $user->subscriptions()->create([ - 'name' => $data['metadata']['name'], + 'name' => $data['metadata']['name'] ?? $this->newSubscriptionName($payload), 'stripe_id' => $data['id'], 'stripe_status' => $data['status'], 'stripe_plan' => $isSinglePlan ? $firstItem['plan']['id'] : null, @@ -101,6 +101,17 @@ protected function handleCustomerSubscriptionCreated(array $payload) return $this->successMethod(); } + /** + * Determines the name that should be used when new subscriptions are created from the Stripe dashboard. + * + * @param array $payload + * @return string + */ + protected function newSubscriptionName(array $payload) + { + return 'default'; + } + /** * Handle customer subscription updated. * diff --git a/tests/Feature/WebhooksTest.php b/tests/Feature/WebhooksTest.php index 5ff4d303..aa7a7889 100644 --- a/tests/Feature/WebhooksTest.php +++ b/tests/Feature/WebhooksTest.php @@ -54,6 +54,46 @@ public static function tearDownAfterClass(): void static::deleteStripeResource(new Product(static::$productId)); } + public function test_subscriptions_are_created() + { + $user = $this->createCustomer('subscriptions_are_updated', ['stripe_id' => 'cus_foo']); + + $this->postJson('stripe/webhook', [ + 'id' => 'foo', + 'type' => 'customer.subscription.created', + 'data' => [ + 'object' => [ + 'id' => 'sub_foo', + 'customer' => 'cus_foo', + 'cancel_at_period_end' => false, + 'quantity' => 5, + 'items' => [ + 'data' => [[ + 'id' => 'bar', + 'plan' => ['id' => 'plan_foo'], + 'quantity' => 10, + ]], + ], + 'status' => 'active', + ], + ], + ])->assertOk(); + + $this->assertDatabaseHas('subscriptions', [ + 'name' => 'default', + 'user_id' => $user->id, + 'stripe_id' => 'sub_foo', + 'stripe_status' => 'active', + 'quantity' => 5, + ]); + + $this->assertDatabaseHas('subscription_items', [ + 'stripe_id' => 'bar', + 'stripe_plan' => 'plan_foo', + 'quantity' => 10, + ]); + } + public function test_subscriptions_are_updated() { $user = $this->createCustomer('subscriptions_are_updated', ['stripe_id' => 'cus_foo']);