Skip to content

Commit

Permalink
stripe test account client flow
Browse files Browse the repository at this point in the history
  • Loading branch information
diego-escobedo committed Feb 6, 2023
1 parent f2d8679 commit ab67e5a
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 22 deletions.
6 changes: 5 additions & 1 deletion backend/lotus/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
pass

VITE_API_URL = config("VITE_API_URL", default="http://localhost:8000")
VITE_STRIPE_CLIENT = config("VITE_STRIPE_CLIENT", default="")
EVENT_CACHE_FLUSH_SECONDS = config("EVENT_CACHE_FLUSH_SECONDS", default=180, cast=int)
EVENT_CACHE_FLUSH_COUNT = config("EVENT_CACHE_FLUSH_COUNT", default=1000, cast=int)
DOCKERIZED = config("DOCKERIZED", default=False, cast=bool)
Expand All @@ -66,8 +65,13 @@
STRIPE_LIVE_SECRET_KEY = config("STRIPE_LIVE_SECRET_KEY", default=None)
if STRIPE_LIVE_SECRET_KEY is None:
STRIPE_LIVE_SECRET_KEY = config("STRIPE_SECRET_KEY", default=None)
STRIPE_LIVE_CLIENT = config("STRIPE_LIVE_CLIENT", default=None)
if STRIPE_LIVE_CLIENT is None:
STRIPE_LIVE_CLIENT = config("VITE_STRIPE_CLIENT", default=None)
STRIPE_TEST_SECRET_KEY = config("STRIPE_TEST_SECRET_KEY", default=None)
STRIPE_TEST_CLIENT = config("STRIPE_TEST_CLIENT", default="")
STRIPE_WEBHOOK_SECRET = config("STRIPE_WEBHOOK_SECRET", default="whsec_")

# Webhooks for Svix
SVIX_API_KEY = config("SVIX_API_KEY", default="")
SVIX_JWT_SECRET = config("SVIX_JWT_SECRET", default="")
Expand Down
42 changes: 30 additions & 12 deletions backend/metering_billing/payment_providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@
import stripe
from django.conf import settings
from django.db.models import F, Prefetch, Q
from rest_framework import serializers, status
from rest_framework.response import Response

from metering_billing.exceptions.exceptions import ExternalConnectionInvalid
from metering_billing.serializers.payment_provider_serializers import (
PaymentProviderPostResponseSerializer,
Expand All @@ -22,13 +19,16 @@
PAYMENT_PROVIDERS,
PLAN_STATUS,
)
from rest_framework import serializers, status
from rest_framework.response import Response

logger = logging.getLogger("django.server")

SELF_HOSTED = settings.SELF_HOSTED
STRIPE_LIVE_SECRET_KEY = settings.STRIPE_LIVE_SECRET_KEY
STRIPE_TEST_SECRET_KEY = settings.STRIPE_TEST_SECRET_KEY
VITE_STRIPE_CLIENT = settings.VITE_STRIPE_CLIENT
STRIPE_TEST_CLIENT = settings.STRIPE_TEST_CLIENT
STRIPE_LIVE_CLIENT = settings.STRIPE_LIVE_CLIENT
VITE_API_URL = settings.VITE_API_URL


Expand Down Expand Up @@ -97,7 +97,7 @@ def handle_post(self, data, organization) -> PaymentProviderPostResponseSerializ
pass

@abc.abstractmethod
def get_redirect_url(self) -> str:
def get_redirect_url(self, organization) -> str:
"""The link returned by this method will be called when a user clicks on the connect button for a payment processor. It should return a link that the user will be redirected to in order to connect their account to the payment processor."""
pass

Expand All @@ -112,17 +112,30 @@ def __init__(self):
self.live_secret_key = STRIPE_LIVE_SECRET_KEY
self.test_secret_key = STRIPE_TEST_SECRET_KEY
self.self_hosted = SELF_HOSTED
redirect_dict = {
live_redirect_dict = {
"response_type": "code",
"scope": "read_write",
"client_id": VITE_STRIPE_CLIENT,
"client_id": STRIPE_LIVE_CLIENT,
"redirect_uri": VITE_API_URL + "redirectstripe",
}
qstr = urlencode(redirect_dict)
live_qstr = urlencode(live_redirect_dict)
test_redirect_dict = {
"response_type": "code",
"scope": "read_write",
"client_id": STRIPE_TEST_CLIENT,
"redirect_uri": VITE_API_URL + "redirectstripe",
}
test_qstr = urlencode(test_redirect_dict)
if not self.self_hosted:
self.redirect_url = "https://connect.stripe.com/oauth/authorize?" + qstr
self.live_redirect_url = (
"https://connect.stripe.com/oauth/authorize?" + live_qstr
)
self.test_redirect_url = (
"https://connect.stripe.com/oauth/authorize?" + test_qstr
)
else:
self.redirect_url = ""
self.live_redirect_url = None
self.test_redirect_url = None

def working(self) -> bool:
return self.live_secret_key is not None or self.test_secret_key is not None
Expand Down Expand Up @@ -458,8 +471,13 @@ def handle_post(self, data, organization) -> PaymentProviderPostResponseSerializ
validated_data = serializer.validated_data
return Response(validated_data, status=status.HTTP_200_OK)

def get_redirect_url(self) -> str:
return self.redirect_url
def get_redirect_url(self, organization) -> str:
from metering_billing.models import Organization

if organization.organization_type == Organization.OrganizationType.PRODUCTION:
return self.live_redirect_url
else:
return self.test_redirect_url

def transfer_subscriptions(
self, organization, end_now=False
Expand Down
11 changes: 6 additions & 5 deletions backend/metering_billing/views/payment_provider_views.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
from drf_spectacular.utils import extend_schema
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from metering_billing.payment_providers import PAYMENT_PROVIDER_MAP
from metering_billing.permissions import ValidOrganization
from metering_billing.serializers.payment_provider_serializers import (
PaymentProviderPostRequestSerializer,
PaymentProviderPostResponseSerializer,
SinglePaymentProviderSerializer,
)
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView


class PaymentProviderView(APIView):
Expand All @@ -26,7 +27,7 @@ def get(self, request, format=None):
pp_response = {
"payment_provider_name": payment_processor_name,
"connected": pp_obj.organization_connected(organization),
"redirect_url": pp_obj.get_redirect_url(),
"redirect_url": pp_obj.get_redirect_url(organization),
}
response.append(pp_response)
serializer = SinglePaymentProviderSerializer(data=response, many=True)
Expand Down
3 changes: 2 additions & 1 deletion docs/contributing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ chmod +x ./scripts/run-codestyle-docker.sh && ./scripts/run-codestyle-docker.sh
| DJANGO_SETTINGS_MODULE | "lotus.settings" | |
| NODE_ENV | development | |
| VITE_API_URL | "http://localhost:8000/" | |
| VITE_STRIPE_CLIENT | ca\_ ||
| STRIPE_LIVE_SECRET_KEY | sk_live\_ ||
| STRIPE_LIVE_CLIENT | ca\_ ||
| STRIPE_TEST_SECRET_KEY | sk_test\_ ||
| STRIPE_TEST_CLIENT | ca\_ ||
| STRIPE_WEBHOOK_SECRET | whsec\_ ||
| SVIX_JWT_SECRET | change_me ||
3 changes: 2 additions & 1 deletion docs/overview/self-hosting.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ Optionally:
| DJANGO_SETTINGS_MODULE | "lotus.settings" | |
| NODE_ENV | production | |
| VITE_API_URL | "http://localhost/" | |
| VITE_STRIPE_CLIENT | ca\_ ||
| STRIPE_LIVE_SECRET_KEY | sk_live\_ ||
| STRIPE_LIVE_CLIENT | ca\_ ||
| STRIPE_TEST_SECRET_KEY | sk_test\_ ||
| STRIPE_TEST_CLIENT | ca\_ ||
| STRIPE_WEBHOOK_SECRET | whsec\_ ||
| SVIX_JWT_SECRET | change_me ||
3 changes: 2 additions & 1 deletion env/.env.dev.example
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ DJANGO_SETTINGS_MODULE="lotus.settings"
NODE_ENV=development
VITE_API_URL="http://localhost:8000/"

VITE_STRIPE_CLIENT=ca_
STRIPE_LIVE_SECRET_KEY=sk_live_
STRIPE_LIVE_CLIENT=ca_
STRIPE_TEST_SECRET_KEY=sk_test_
STRIPE_TEST_CLIENT=ca_
STRIPE_WEBHOOK_SECRET=whsec_

KAFKA_URL="redpanda:29092"
Expand Down
3 changes: 2 additions & 1 deletion env/.env.prod.example
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ PRODUCT_ANALYTICS_OPT_IN=True
NODE_ENV=production
VITE_API_URL="http://localhost/"

VITE_STRIPE_CLIENT=ca_
STRIPE_LIVE_SECRET_KEY=sk_live_
STRIPE_LIVE_CLIENT=ca_
STRIPE_TEST_SECRET_KEY=sk_test_
STRIPE_TEST_CLIENT=ca_
STRIPE_WEBHOOK_SECRET=whsec_

KAFKA_URL="redpanda:29092"
Expand Down

0 comments on commit ab67e5a

Please sign in to comment.