· 6 years ago · Nov 04, 2019, 10:50 PM
1@login_required
2def PaymentView(request):
3 user = request.user
4 try:
5 address = profile.address.get(address_type="home")
6 except:
7 address = None
8 user_membership = get_user_membership(request)
9 try:
10 selected_membership = get_selected_membership(request)
11 except:
12 return redirect(reverse("memberships:select"))
13 publishKey = settings.STRIPE_PUBLISHABLE_KEY
14 if request.method == "POST":
15 # try:
16 source = request.POST.get('PaymentMethod', "")
17 amend = request.POST.get('amend', '')
18
19 '''
20 First we need to add the source for the customer
21 '''
22 if amend == "true":
23 customer = stripe.Customer.modify(
24 user_membership.stripe_customer_id,
25 source=source,
26 )
27 customer.save()
28 else:
29 customer = stripe.Customer.retrieve(
30 user_membership.stripe_customer_id)
31
32 try:
33 customer.source = source # 4242424242424242
34 customer.save()
35 except:
36 messages.warning(
37 request, "Your card has been failed or declined, Please try a different card")
38 context = {
39 'publishKey': publishKey,
40 'selected_membership': selected_membership,
41 'address': address,
42 'profile': profile,
43 'amend': "true"
44 }
45 return render(request, "membership/membership_payment.html", context)
46
47 '''
48 before we make any subscriptions, we need to make sure there isn't any current active subscriptions for the customer.
49 Without this, we could get duplicates payment
50 We first fetch the customer to make sure we have the latest update
51 '''
52 customer = stripe.Customer.retrieve(user_membership.stripe_customer_id)
53 if customer.subscriptions.total_count > 0:
54 for i in customer.subscriptions.data:
55 if i.plan['id'] == selected_membership.stripe_plan_id and i.plan['active'] == True:
56 messages.info(
57 request, "Your have already subscribed to this plan")
58 return redirect(reverse('memberships:update-transactions',
59 kwargs={
60 'subscription_id': i.id
61 }))
62 else:
63 pass # Maybe we can check if users have a subscription that needs renewing
64 else:
65 '''
66 Now we can create the subscription using only the customer as we don't need to pass their
67 credit card source anymore
68 '''
69
70 stripe_subscription = stripe.Subscription.create(
71 customer=user_membership.stripe_customer_id,
72 items=[
73 {"plan": selected_membership.stripe_plan_id},
74 ],
75 # billing="charge_automatically", #billing is depricated
76 collection_method="charge_automatically",
77 expand=['latest_invoice.payment_intent'],
78 # idempotency_key='FXZMav7BbtEui1Z3', # we can add a random idempotency key too
79 )
80 '''
81 Here we check three different status of the subscription object according to API and if
82 secure 3D payment is required, we redirect them for the necessary payments.
83 '''
84 if stripe_subscription.status == "active":
85 return redirect(reverse('memberships:update-transactions',
86 kwargs={
87 'subscription_id': stripe_subscription.id
88 }))
89 elif stripe_subscription.status == "incomplete":
90 payment_intent = stripe_subscription.latest_invoice.payment_intent
91 if payment_intent.status == "requires_action":
92 messages.info(
93 request, "Your bank requires extra authentication")
94 context = {
95 "client_secret": payment_intent.client_secret,
96 "STRIPE_PUBLIC_KEY": settings.STRIPE_PUBLISHABLE_KEY,
97 "subscription_id": stripe_subscription.id
98 }
99 return render(request, "memberships/3d-secure-checkout.html", context)
100 elif payment_intent.status == "requires_payment_method":
101 messages.warning(
102 request, "Your card has been failed or declined, Please try a different card")
103 context = {
104 'publishKey': publishKey,
105 'selected_membership': selected_membership,
106 # 'client_secret': client_secret,
107 'address': address,
108 'profile': profile,
109 'amend': "true"
110 }
111 return render(request, "memberships/membership_payment.html", context)
112 else:
113 messages.info(
114 request, "Something went wrong. Please report to the website admin.")
115
116
117
118 context = {
119 'publishKey': publishKey,
120 'selected_membership': selected_membership,
121 # 'client_secret': client_secret,
122 'address': address,
123 'user': user,
124 'amend': "false"
125 }
126
127 return render(request, "memberships/membership_payment.html", context)
128
129@login_required
130def updateTransactionRecords(request, subscription_id):
131 user_membership = get_user_membership(request)
132 selected_membership = get_selected_membership(request)
133 user_membership.membership = selected_membership
134 user_membership.save()
135
136 sub, created = Subscription.objects.get_or_create(
137 user_membership=user_membership)
138 sub.stripe_subscription_id = subscription_id
139 sub.active = True
140 sub.save()
141
142 try:
143 del request.session['selected_membership_type']
144 except:
145 pass
146
147 messages.info(request, 'Successfully created {} membership'.format(
148 selected_membership))
149 return redirect(reverse('memberships:select'))