hackish way of registering works
This commit is contained in:
		
					parent
					
						
							
								df4c0c3060
							
						
					
				
			
			
				commit
				
					
						6efedcb381
					
				
			
		
					 5 changed files with 80 additions and 56 deletions
				
			
		| 
						 | 
				
			
			@ -86,9 +86,11 @@ urlpatterns = [
 | 
			
		|||
 | 
			
		||||
    # web/ = stuff to view in the browser
 | 
			
		||||
#    path('web/vpn/create/', netviews.WireGuardVPNCreateView.as_view(), name="vpncreate"),
 | 
			
		||||
 | 
			
		||||
    path('login/', authviews.LoginView.as_view(), name="login"),
 | 
			
		||||
    path('logout/', authviews.LogoutView.as_view(), name="logout"),
 | 
			
		||||
    path('admin/', admin.site.urls),
 | 
			
		||||
    path('cc/reg/', payviews.RegisterCard.as_view(), name="cc_register"),
 | 
			
		||||
    path('cc/submit/', payviews.RegisterCard.as_view(), name="cc_register"),
 | 
			
		||||
    path('', uncloudviews.UncloudIndex.as_view(), name="uncloudindex"),
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,14 @@ from django.utils.translation import gettext_lazy as _
 | 
			
		|||
 | 
			
		||||
from .models import *
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
# Checked code
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
################################################################################
 | 
			
		||||
# Unchecked code
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
# Payments and Payment Methods.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +26,7 @@ class PaymentMethodSerializer(serializers.ModelSerializer):
 | 
			
		|||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = PaymentMethod
 | 
			
		||||
        fields = ['uuid', 'source', 'description', 'primary', 'stripe_card_last4', 'active']
 | 
			
		||||
        fields = [ 'source', 'description', 'primary', 'stripe_card_last4', 'active']
 | 
			
		||||
 | 
			
		||||
class UpdatePaymentMethodSerializer(serializers.ModelSerializer):
 | 
			
		||||
    class Meta:
 | 
			
		||||
| 
						 | 
				
			
			@ -30,10 +38,12 @@ class ChargePaymentMethodSerializer(serializers.Serializer):
 | 
			
		|||
 | 
			
		||||
class CreatePaymentMethodSerializer(serializers.ModelSerializer):
 | 
			
		||||
    please_visit = serializers.CharField(read_only=True)
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = PaymentMethod
 | 
			
		||||
        fields = ['source', 'description', 'primary', 'please_visit']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
# Orders & Products.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,17 +7,10 @@ from django.conf import settings
 | 
			
		|||
 | 
			
		||||
import uncloud_pay.models
 | 
			
		||||
 | 
			
		||||
# Static stripe configuration used below.
 | 
			
		||||
CURRENCY = 'chf'
 | 
			
		||||
 | 
			
		||||
# README: We use the Payment Intent API as described on
 | 
			
		||||
#   https://stripe.com/docs/payments/save-and-reuse
 | 
			
		||||
 | 
			
		||||
# For internal use only.
 | 
			
		||||
stripe.api_key = settings.STRIPE_KEY
 | 
			
		||||
 | 
			
		||||
# Helper (decorator) used to catch errors raised by stripe logic.
 | 
			
		||||
# Catch errors that should not be displayed to the end user, raise again.
 | 
			
		||||
def handle_stripe_error(f):
 | 
			
		||||
    def handle_problems(*args, **kwargs):
 | 
			
		||||
        response = {
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +54,6 @@ def handle_stripe_error(f):
 | 
			
		|||
 | 
			
		||||
    return handle_problems
 | 
			
		||||
 | 
			
		||||
# Actual Stripe logic.
 | 
			
		||||
 | 
			
		||||
def public_api_key():
 | 
			
		||||
    return settings.STRIPE_PUBLIC_KEY
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,9 @@
 | 
			
		|||
 | 
			
		||||
{% extends 'uncloud/base.html' %}
 | 
			
		||||
 | 
			
		||||
{% block header %}
 | 
			
		||||
		<script src="https://js.stripe.com/v3/"></script>
 | 
			
		||||
 | 
			
		||||
		<style>
 | 
			
		||||
			#content {
 | 
			
		||||
				width: 400px;
 | 
			
		||||
| 
						 | 
				
			
			@ -12,61 +14,80 @@
 | 
			
		|||
				display: none;
 | 
			
		||||
			}
 | 
			
		||||
		</style>
 | 
			
		||||
        <script>
 | 
			
		||||
          billing_details: { email: email }
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      .then(function(result) {
 | 
			
		||||
        if (result.error) {
 | 
			
		||||
          changeLoadingState(false);
 | 
			
		||||
          var displayError = document.getElementById("card-errors");
 | 
			
		||||
          displayError.textContent = result.error.message;
 | 
			
		||||
        } else {
 | 
			
		||||
          // The PaymentMethod was successfully set up
 | 
			
		||||
          orderComplete(stripe, setupIntent.client_secret);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
        </script>
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block body %}
 | 
			
		||||
		<div id="content">
 | 
			
		||||
			<h1>Registering Stripe Credit Card</h1>
 | 
			
		||||
		  <h1>Registering Credit Card with Stripe</h1>
 | 
			
		||||
            <p>
 | 
			
		||||
              By submitting I authorise to send instructions to
 | 
			
		||||
              the financial institution that issued my card to take
 | 
			
		||||
              payments from my card account in accordance with the
 | 
			
		||||
              terms of my agreement with you.
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
			<!-- Stripe form and messages -->
 | 
			
		||||
			<span id="message"></span>
 | 
			
		||||
			<form id="setup-form">
 | 
			
		||||
				<div id="card-element"></div>
 | 
			
		||||
				<button type='button' id="card-button">
 | 
			
		||||
					Save
 | 
			
		||||
				</button>
 | 
			
		||||
			</form>
 | 
			
		||||
 | 
			
		||||
			<!-- Dirty hack used for callback to API -->
 | 
			
		||||
			<form id="callback-form" action="{{ callback }}" method="post"></form>
 | 
			
		||||
			<div id="card-element"></div>
 | 
			
		||||
			<button type='button' id="card-button">			  Save
 | 
			
		||||
			</button>
 | 
			
		||||
 | 
			
		||||
            <div id="ungleichmessage">The card will be registered with stripe.</div>
 | 
			
		||||
 | 
			
		||||
		</div>
 | 
			
		||||
 | 
			
		||||
		<!-- Enable Stripe from UI elements -->
 | 
			
		||||
		<script>
 | 
			
		||||
			var stripe = Stripe('{{ stripe_pk }}');
 | 
			
		||||
		<!-- Enable Stripe from UI elements - standard code -->
 | 
			
		||||
	<script>
 | 
			
		||||
	  var stripe = Stripe('{{ stripe_pk }}');
 | 
			
		||||
 | 
			
		||||
			var elements = stripe.elements();
 | 
			
		||||
			var cardElement = elements.create('card');
 | 
			
		||||
			cardElement.mount('#card-element');
 | 
			
		||||
	  var elements = stripe.elements();
 | 
			
		||||
	  var cardElement = elements.create('card');
 | 
			
		||||
	  cardElement.mount('#card-element');
 | 
			
		||||
 | 
			
		||||
	  var cardButton = document.getElementById('card-button');
 | 
			
		||||
	  var messageContainer = document.getElementById('message');
 | 
			
		||||
	  var clientSecret = '{{ client_secret }}';
 | 
			
		||||
 | 
			
		||||
	  cardButton.addEventListener('click', function(ev) {
 | 
			
		||||
		  stripe.confirmCardSetup(
 | 
			
		||||
			  clientSecret,
 | 
			
		||||
			  {
 | 
			
		||||
				  payment_method: {
 | 
			
		||||
					  card: cardElement,
 | 
			
		||||
					  billing_details: { name: "{{username}}", },
 | 
			
		||||
				  },
 | 
			
		||||
			  }
 | 
			
		||||
		  ).then(function(result) {
 | 
			
		||||
			  if (result.error) {
 | 
			
		||||
				  var message = document.createTextNode('Error:' + result.error.message);
 | 
			
		||||
				  messageContainer.appendChild(message);
 | 
			
		||||
			  } else {
 | 
			
		||||
				  // Return to API on success.
 | 
			
		||||
				  document.getElementById("ungleichmessage").innerHTML
 | 
			
		||||
		  = "Registered credit card with Stripe."
 | 
			
		||||
			  }
 | 
			
		||||
		  });
 | 
			
		||||
	  });
 | 
			
		||||
		</script>
 | 
			
		||||
 | 
			
		||||
		<!-- Handle card submission -->
 | 
			
		||||
		<script>
 | 
			
		||||
			var cardButton = document.getElementById('card-button');
 | 
			
		||||
			var messageContainer = document.getElementById('message');
 | 
			
		||||
			var clientSecret = '{{ client_secret }}';
 | 
			
		||||
 | 
			
		||||
			cardButton.addEventListener('click', function(ev) {
 | 
			
		||||
 | 
			
		||||
				stripe.confirmCardSetup(
 | 
			
		||||
					clientSecret,
 | 
			
		||||
					{
 | 
			
		||||
						payment_method: {
 | 
			
		||||
							card: cardElement,
 | 
			
		||||
							billing_details: {
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					}
 | 
			
		||||
				).then(function(result) {
 | 
			
		||||
					if (result.error) {
 | 
			
		||||
						var message = document.createTextNode('Error:' + result.error.message);
 | 
			
		||||
						messageContainer.appendChild(message);
 | 
			
		||||
					} else {
 | 
			
		||||
						// Return to API on success.
 | 
			
		||||
						document.getElementById("callback-form").submit();
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		</script>
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,12 +51,12 @@ class OrderViewSet(viewsets.ReadOnlyModelViewSet):
 | 
			
		|||
class RegisterCard(LoginRequiredMixin, TemplateView):
 | 
			
		||||
    login_url = '/login/'
 | 
			
		||||
 | 
			
		||||
    # This is not supposed to be "static" --
 | 
			
		||||
    # the idea is to be able to switch the provider when needed
 | 
			
		||||
    template_name = "uncloud_pay/stripe.html"
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
 | 
			
		||||
        customer_id = uncloud_stripe.get_customer_id_for(self.request.user)
 | 
			
		||||
 | 
			
		||||
        setup_intent = uncloud_stripe.create_setup_intent(customer_id)
 | 
			
		||||
 | 
			
		||||
        context = super().get_context_data(**kwargs)
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ class PaymentMethodViewSet(viewsets.ModelViewSet):
 | 
			
		|||
        # TODO: find a way to use reverse properly:
 | 
			
		||||
        # https://www.django-rest-framework.org/api-guide/reverse/
 | 
			
		||||
        callback_path= "payment-method/{}/activate-stripe-cc/".format(
 | 
			
		||||
                payment_method.uuid)
 | 
			
		||||
                payment_method.id)
 | 
			
		||||
        callback = reverse('api-root', request=request) + callback_path
 | 
			
		||||
 | 
			
		||||
        # Render stripe card registration form.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue