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…
Reference in a new issue