update dg payment
This commit is contained in:
		
					parent
					
						
							
								69f9f4a416
							
						
					
				
			
			
				commit
				
					
						65e3cdeb94
					
				
			
		
					 10 changed files with 69 additions and 60 deletions
				
			
		|  | @ -28,7 +28,7 @@ | ||||||
|           rel="stylesheet" type="text/css"> |           rel="stylesheet" type="text/css"> | ||||||
|     <link href="//fonts.googleapis.com/css?family=Josefin+Slab:100,300,400,600,700,100italic,300italic,400italic,600italic,700italic" |     <link href="//fonts.googleapis.com/css?family=Josefin+Slab:100,300,400,600,700,100italic,300italic,400italic,600italic,700italic" | ||||||
|           rel="stylesheet" type="text/css"> |           rel="stylesheet" type="text/css"> | ||||||
|     <link href="{% static 'digitalglarus/css/font-awesome.min.css' %}" |     <link href="{% static 'digitalglarus/bower_components/font-awesome/css/font-awesome.min.css' %}" | ||||||
|           rel="stylesheet" type="text/css"> |           rel="stylesheet" type="text/css"> | ||||||
| 
 | 
 | ||||||
|     {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %} |     {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %} | ||||||
|  | @ -65,7 +65,7 @@ | ||||||
| <div class="pull-right u_P user"> | <div class="pull-right u_P user"> | ||||||
|     {% if request.user.is_authenticated %} |     {% if request.user.is_authenticated %} | ||||||
|         <div class="user_loggedin"> |         <div class="user_loggedin"> | ||||||
|             <h4>{{ request.user.name }} |             <h4><a href="{% url 'membership' %}">{{ request.user.name }}</a> | ||||||
|                 <a href="{% url 'logout_glarus' %}"><i class="fa fa-1x fa-sign-out" |                 <a href="{% url 'logout_glarus' %}"><i class="fa fa-1x fa-sign-out" | ||||||
|                                                        aria-hidden="true"></i></a> |                                                        aria-hidden="true"></i></a> | ||||||
|             </h4> |             </h4> | ||||||
|  |  | ||||||
|  | @ -1,13 +1,13 @@ | ||||||
| from django.conf.urls import url | from django.conf.urls import url | ||||||
| 
 |  | ||||||
| from django.utils.translation import ugettext_lazy as _ | from django.utils.translation import ugettext_lazy as _ | ||||||
|  | 
 | ||||||
| from . import views | from . import views | ||||||
| from .views import ContactView, IndexView, AboutView | from .views import ContactView, IndexView, AboutView | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|     #    url(r'^$', IndexView.as_view(), name='home'), |     #    url(r'^$', IndexView.as_view(), name='home'), | ||||||
|    url(_(r'home/?$'), IndexView.as_view(), name='home'), |     # url(_(r'home/?$'), IndexView.as_view(), name='home'), | ||||||
|    url(_(r'about/?$'), AboutView.as_view(), name='about'), |     # url(_(r'about/?$'), AboutView.as_view(), name='about'), | ||||||
|     url(_(r'contact/?$'), ContactView.as_view(), name='contact'), |     url(_(r'contact/?$'), ContactView.as_view(), name='contact'), | ||||||
|     url(_(r'supporters/?$'), views.supporters, name='supporters'), |     url(_(r'supporters/?$'), views.supporters, name='supporters'), | ||||||
|     url(r'calendar_api/(?P<month>\d+)/(?P<year>\d+)?$', views.CalendarApi.as_view()), |     url(r'calendar_api/(?P<month>\d+)/(?P<year>\d+)?$', views.CalendarApi.as_view()), | ||||||
|  |  | ||||||
|  | @ -446,8 +446,8 @@ AUTH_USER_MODEL = 'membership.CustomUser' | ||||||
| 
 | 
 | ||||||
| # PAYMENT | # PAYMENT | ||||||
| 
 | 
 | ||||||
| STRIPE_API_PUBLIC_KEY = 'pk_test_QqBZ50Am8KOxaAlOxbcm9Psl'  # used in frontend to call from user browser | STRIPE_API_PUBLIC_KEY = 'pk_test_ZRg6P8g5ybiHE6l2RW5pSaYV'  # used in frontend to call from user browser | ||||||
| STRIPE_API_PRIVATE_KEY = 'sk_test_dqAmbKAij12QCGfkYZ3poGt2'  # used in backend payment | STRIPE_API_PRIVATE_KEY = 'sk_test_uIPMdgXoRGydrcD7fkwcn7dj'  # used in backend payment | ||||||
| STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services" | STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services" | ||||||
| 
 | 
 | ||||||
| # EMAIL MESSAGES | # EMAIL MESSAGES | ||||||
|  |  | ||||||
|  | @ -23,13 +23,13 @@ urlpatterns += i18n_patterns('', | ||||||
|                              url(r'^admin/', include(admin.site.urls)), |                              url(r'^admin/', include(admin.site.urls)), | ||||||
|                              url(r'^digitalglarus/login/', include(membership_urls)), |                              url(r'^digitalglarus/login/', include(membership_urls)), | ||||||
|                              url(r'^digitalglarus/', include('digitalglarus.urls', |                              url(r'^digitalglarus/', include('digitalglarus.urls', | ||||||
|                                                              namespace="digitalglarus"), |                                                              namespace="digitalglarus")), | ||||||
|                              url(r'^blog/', include('ungleich.urls', namespace='ungleich')), |                              url(r'^blog/', include('ungleich.urls', namespace='ungleich')), | ||||||
|                              url(r'^ungleich_page/', |                              url(r'^ungleich_page/', | ||||||
|                                  include('ungleich_page.urls', namespace='ungleich_page'), |                                  include('ungleich_page.urls', namespace='ungleich_page'), | ||||||
|                                  name='ungleich_page'), |                                  name='ungleich_page'), | ||||||
|                              url(r'^blog/',include('ungleich.urls',namespace='ungleich')), |                              url(r'^blog/',include('ungleich.urls',namespace='ungleich')), | ||||||
|                              url(r'^', include('cms.urls')), |                              url(r'^', include('cms.urls')) | ||||||
|                              ) |                              ) | ||||||
| 
 | 
 | ||||||
| if settings.DEBUG: | if settings.DEBUG: | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView, \ | ||||||
|                     NodeJSHostingView, LoginView, SignupView, IndexView |                     NodeJSHostingView, LoginView, SignupView, IndexView | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|     url(r'pricing/?$', VMPricingView.as_view(), name='pricing'), |     # url(r'pricing/?$', VMPricingView.as_view(), name='pricing'), | ||||||
|     url(r'index/?$', IndexView.as_view(), name='index'), |     url(r'index/?$', IndexView.as_view(), name='index'), | ||||||
|     url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'), |     url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'), | ||||||
|     url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'), |     url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'), | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ from django.core.mail import send_mail | ||||||
| from django.core.validators import RegexValidator | from django.core.validators import RegexValidator | ||||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||||
| from django.contrib.sites.models import Site | from django.contrib.sites.models import Site | ||||||
|  | 
 | ||||||
| from utils.stripe_utils import StripeUtils | from utils.stripe_utils import StripeUtils | ||||||
| 
 | 
 | ||||||
| REGISTRATION_MESSAGE = {'subject': "Validation mail", | REGISTRATION_MESSAGE = {'subject': "Validation mail", | ||||||
|  | @ -132,8 +133,12 @@ class StripeCustomer(models.Model): | ||||||
|             Check if there is a registered stripe customer with that email |             Check if there is a registered stripe customer with that email | ||||||
|             or create a new one |             or create a new one | ||||||
|         """ |         """ | ||||||
|  | 
 | ||||||
|         try: |         try: | ||||||
|  |             stripe_utils = StripeUtils() | ||||||
|             stripe_customer = cls.objects.get(user__email=email) |             stripe_customer = cls.objects.get(user__email=email) | ||||||
|  |             #check if user is not in stripe but in database | ||||||
|  |             stripe_utils.check_customer(stripe_customer.stripe_id,stripe_customer.user,token) | ||||||
|             return stripe_customer |             return stripe_customer | ||||||
| 
 | 
 | ||||||
|         except StripeCustomer.DoesNotExist: |         except StripeCustomer.DoesNotExist: | ||||||
|  | @ -157,6 +162,10 @@ class CreditCards(models.Model): | ||||||
|     ccv = models.CharField(max_length=4, validators=[RegexValidator(r'\d{3,4}', _('Wrong CCV number.'))]) |     ccv = models.CharField(max_length=4, validators=[RegexValidator(r'\d{3,4}', _('Wrong CCV number.'))]) | ||||||
|     payment_type = models.CharField(max_length=5, default='N') |     payment_type = models.CharField(max_length=5, default='N') | ||||||
| 
 | 
 | ||||||
|  |     def save(self, *args, **kwargs): | ||||||
|  |         # override saving to database | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class Calendar(models.Model): | class Calendar(models.Model): | ||||||
|     datebooked = models.DateField() |     datebooked = models.DateField() | ||||||
|  | @ -176,4 +185,3 @@ class Calendar(models.Model): | ||||||
|             old_dates.delete() |             old_dates.delete() | ||||||
|         for date in dates: |         for date in dates: | ||||||
|             Calendar.objects.create(datebooked=date, user=user) |             Calendar.objects.create(datebooked=date, user=user) | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -125,7 +125,7 @@ | ||||||
|                     for coworking. It is a perfect try-out package! |                     for coworking. It is a perfect try-out package! | ||||||
|                     <br> |                     <br> | ||||||
|                 </p> |                 </p> | ||||||
|                 <a class="btn btn-primary" href="/login/buy/month/">Buy Now</a> |                 <a class="btn btn-primary" href="{% url 'payment' time='month' %}">Buy Now</a> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
|  | @ -146,7 +146,7 @@ | ||||||
|                     membership. |                     membership. | ||||||
|                     <br> |                     <br> | ||||||
|                 </p> |                 </p> | ||||||
|                 <a class="btn btn-primary" href="/login/buy/year/">Buy Now</a> |                 <a class="btn btn-primary" href="{% url 'payment' time='year' %}">Buy Now</a> | ||||||
|             </div> |             </div> | ||||||
|             <div class="col-md-6"> |             <div class="col-md-6"> | ||||||
|                 <img src="https://unsplash.imgix.net/photo-1413834932717-29e7d4714192?w=1024&q=50&fm=jpg&s=d9d6cbc32dd4968d0c21e331436a6af6" |                 <img src="https://unsplash.imgix.net/photo-1413834932717-29e7d4714192?w=1024&q=50&fm=jpg&s=d9d6cbc32dd4968d0c21e331436a6af6" | ||||||
|  |  | ||||||
|  | @ -1,17 +1,18 @@ | ||||||
|  | {% load static %} | ||||||
| <html> | <html> | ||||||
| <head> | <head> | ||||||
|     <meta charset="utf-8"> |     <meta charset="utf-8"> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|     <script type="text/javascript" src="{% static 'digitalglarus/bower_components/jquery/dist/jquery.min.js' %}"></script> |     <script type="text/javascript" src="{% static 'digitalglarus/bower_components/jquery/dist/jquery.min.js' %}"></script> | ||||||
|     <script type="text/javascript" src="{% static 'digitalglarus/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script> |     <script type="text/javascript" src="{% static 'digitalglarus/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script> | ||||||
|     <link href="{%  static 'digitalglarus/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css"> |     <link href="{%  static 'digitalglarus/bower_components/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css"> | ||||||
|     <link href="{% static 'digitalglarus/bower_components/bootstrap/dist/css/bootstrap.min.css' %}" rel="stylesheet" |     <link href="{% static 'digitalglarus/bower_components/bootstrap/dist/css/bootstrap.min.css' %}" rel="stylesheet" | ||||||
|           type="text/css"> |           type="text/css"> | ||||||
|     {% if request.session.next == None %} |     {% if request.session.next == None %} | ||||||
|     <script> |     <script> | ||||||
|         type = "text/javascript" > |         type = "text/javascript" > | ||||||
|                 setTimeout(function () { |                 setTimeout(function () { | ||||||
|                     window.location.href = "/"; |                     window.location.href = "{% url 'membership' %}"; | ||||||
|                 }, 5000); |                 }, 5000); | ||||||
|     </script> |     </script> | ||||||
|     {% endif %} |     {% endif %} | ||||||
|  | @ -25,7 +26,7 @@ | ||||||
|                     {% if msg == 'succeeded' %} |                     {% if msg == 'succeeded' %} | ||||||
|                         Thank You for Your payment!<br> <p>redirecting...</p> |                         Thank You for Your payment!<br> <p>redirecting...</p> | ||||||
|                     {% else %} |                     {% else %} | ||||||
|                         Your payment was not processed correctly.<br> Reason: {{ msg }} |                         Your payment was not processed correctly. Please contact us <a href="{% url 'digitalglarus:contact' %}">here</a>! | ||||||
|                     {% endif %} |                     {% endif %} | ||||||
|                 </h3> |                 </h3> | ||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
|  | @ -8,9 +8,9 @@ from django.contrib.auth import logout | ||||||
| from django.http import HttpResponseRedirect | from django.http import HttpResponseRedirect | ||||||
| from django.contrib.auth import login | from django.contrib.auth import login | ||||||
| 
 | 
 | ||||||
| from .models import CustomUser | from .models import CustomUser,StripeCustomer | ||||||
| from .forms import (LoginForm, RegisterForm, PaymentForm) | from .forms import (LoginForm, RegisterForm, PaymentForm) | ||||||
| from .payment import StripePayment | from utils.stripe_utils import StripeUtils | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def validate_email(request, validate_slug): | def validate_email(request, validate_slug): | ||||||
|  | @ -49,10 +49,12 @@ class CreditCardView(View): | ||||||
|             template = 'templates/creditcard.html' |             template = 'templates/creditcard.html' | ||||||
|             request.session['next'] +=1 |             request.session['next'] +=1 | ||||||
|         elif next == 2: |         elif next == 2: | ||||||
|             msg = StripePayment.make_payment(request.user, request.session['amount'], |             customer = StripeCustomer.get_or_create(email=request.user.email,token=request.session['token']) | ||||||
|                                              request.session['token'],request.session['time']) |             stripe_utils = StripeUtils() | ||||||
|  |             charge = stripe_utils.make_charge(request.session['amount'],customer=customer.stripe_id) | ||||||
|             template = 'templates/validated.html' |             template = 'templates/validated.html' | ||||||
|             context['msg'] = msg |             import ipdb;ipdb.set_trace() | ||||||
|  |             context['msg'] = charge.get('status') | ||||||
|             request.session['next'] = None |             request.session['next'] = None | ||||||
|         return render(request, template, context) |         return render(request, template, context) | ||||||
| 
 | 
 | ||||||
|  | @ -63,7 +65,6 @@ class CreditCardView(View): | ||||||
|         if form.is_valid(): |         if form.is_valid(): | ||||||
|             ret = form.save(request.user) |             ret = form.save(request.user) | ||||||
|             amount = 35 if time == 'month' else 360 |             amount = 35 if time == 'month' else 360 | ||||||
|             amount = amount * 100  # payments are in 'cents' |  | ||||||
|             request.session['token'] = stripe_token |             request.session['token'] = stripe_token | ||||||
|             request.session['amount'] = amount |             request.session['amount'] = amount | ||||||
|             request.session['next'] +=1 |             request.session['next'] +=1 | ||||||
|  |  | ||||||
|  | @ -1,19 +1,32 @@ | ||||||
| import stripe | import stripe | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
|  | from django.db import models | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | stripe.api_key = settings.STRIPE_API_PRIVATE_KEY | ||||||
|  | 
 | ||||||
| class StripeUtils(object): | class StripeUtils(object): | ||||||
| 
 |  | ||||||
|     CURRENCY = 'chf' |     CURRENCY = 'chf' | ||||||
|     INTERVAL = 'month' |     INTERVAL = 'month' | ||||||
|     SUCCEEDED_STATUS = 'succeeded' |     SUCCEEDED_STATUS = 'succeeded' | ||||||
| 
 | 
 | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         self.stripe = stripe |         self.stripe = stripe | ||||||
|         self.stripe.api_key = settings.STRIPE_API_PRIVATE_KEY | 
 | ||||||
|  |     def check_customer(self, id,user,token): | ||||||
|  |         customers = self.stripe.Customer.all() | ||||||
|  |         if not customers.get('data'): | ||||||
|  |             customer = self.create_customer(token,user.email) | ||||||
|  |         else: | ||||||
|  |             try: | ||||||
|  |                 customer = stripe.Customer.retrieve(id) | ||||||
|  |             except stripe.InvalidRequestError: | ||||||
|  |                 customer = self.create_customer(token,user.email) | ||||||
|  |                 user.stripecustomer.stripe_id=customer.get('id') | ||||||
|  |                 user.stripecustomer.save() | ||||||
|  |         return customer | ||||||
| 
 | 
 | ||||||
|     def create_customer(self, token, email): |     def create_customer(self, token, email): | ||||||
|         stripe.api_key = settings.STRIPE_API_PRIVATE_KEY |  | ||||||
|         customer = stripe.Customer.create( |         customer = stripe.Customer.create( | ||||||
|             source=token, |             source=token, | ||||||
|             description='description for testing', |             description='description for testing', | ||||||
|  | @ -23,36 +36,14 @@ class StripeUtils(object): | ||||||
| 
 | 
 | ||||||
|     def make_charge(self, amount=None, customer=None): |     def make_charge(self, amount=None, customer=None): | ||||||
|         amount = int(amount * 100)  # stripe amount unit, in cents |         amount = int(amount * 100)  # stripe amount unit, in cents | ||||||
| 
 |         import ipdb;ipdb.set_trace() | ||||||
|  |         try: | ||||||
|             charge = self.stripe.Charge.create( |             charge = self.stripe.Charge.create( | ||||||
|                 amount=amount,  # in cents |                 amount=amount,  # in cents | ||||||
|                 currency=self.CURRENCY, |                 currency=self.CURRENCY, | ||||||
|                 customer=customer |                 customer=customer | ||||||
|             ) |             ) | ||||||
|             return charge |             return charge | ||||||
| 
 |  | ||||||
|     def create_plan(self, amount, name, id): |  | ||||||
|         self.stripe.Plan.create( |  | ||||||
|           amount=amount, |  | ||||||
|           interval=self.INTERVAL, |  | ||||||
|           name=name, |  | ||||||
|           currency=self.CURRENCY, |  | ||||||
|           id=id) |  | ||||||
| 
 |  | ||||||
|     def make_payment(self, user, amount, token): |  | ||||||
|         try: |  | ||||||
|             # Use Stripe's library to make requests... |  | ||||||
|             charge = self.stripe.Charge.create( |  | ||||||
|                 amount=amount, |  | ||||||
|                 currency=self.CURRENCY, |  | ||||||
|                 source=token, |  | ||||||
|                 description=settings.STRIPE_DESCRIPTION_ON_PAYMENT |  | ||||||
|             ) |  | ||||||
| 
 |  | ||||||
|             if charge.get('status') == self.SUCCEEDED_STATUS: |  | ||||||
|                 # do something |  | ||||||
|                 pass |  | ||||||
|             return charge['status'] |  | ||||||
|         except self.stripe.error.CardError as e: |         except self.stripe.error.CardError as e: | ||||||
|             # Since it's a decline, stripe.error.CardError will be caught |             # Since it's a decline, stripe.error.CardError will be caught | ||||||
|             body = e.json_body |             body = e.json_body | ||||||
|  | @ -74,3 +65,11 @@ class StripeUtils(object): | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             # maybe send email |             # maybe send email | ||||||
|             return "Currently its not possible to make payments." |             return "Currently its not possible to make payments." | ||||||
|  | 
 | ||||||
|  |     def create_plan(self, amount, name, id): | ||||||
|  |         self.stripe.Plan.create( | ||||||
|  |             amount=amount, | ||||||
|  |             interval=self.INTERVAL, | ||||||
|  |             name=name, | ||||||
|  |             currency=self.CURRENCY, | ||||||
|  |             id=id) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue