· 4 years ago · Apr 23, 2021, 02:40 AM
1from re import template
2from django.shortcuts import render
3from paypalcheckoutsdk.orders.orders_capture_request import OrdersCaptureRequest
4from stripe.api_resources import charge, source
5from .forms import FormularioEnvio
6from paypalcheckoutsdk.core import PayPalHttpClient, SandboxEnvironment
7from django.conf import settings
8from paypalcheckoutsdk.orders import OrdersCreateRequest
9from paypalhttp import HttpError
10from django.template.loader import get_template
11from django.core.mail import EmailMultiAlternatives
12from django.conf import settings
13from .models import Ventas_por_enviar
14import mercadopago
15import stripe
16
17
18stripe.api_key = settings.STRIPE_SECRET_KEY
19
20
21def checkout(request):
22
23 formulario_envio = FormularioEnvio()
24 return render(request, "checkout/checkout.html",{'formulario_envios':formulario_envio})
25
26def envio_email_confirmacion(dic):
27 nombre=dic['nombre']
28 context={
29 'nombre':nombre,
30 }
31 mail=dic['email']
32 template=get_template('checkout/correo.html')
33 content= template.render(context)
34 email=EmailMultiAlternatives(
35 'Confirmacion de pago',
36 'Joyapan',
37 settings.EMAIL_HOST_USER,
38 [mail]
39 )
40 email.attach_alternative(content, 'text/html')
41 email.send()
42
43def resumen(request):
44 estado=int(request.GET.get("estado"))
45 if estado>=1 and estado<=11:
46 resultado=141.16
47 elif estado>=12 and estado<=23:
48 resultado=149.16
49 elif estado>=24 and estado <=35:
50 resultado=156.02
51 elif estado>=36 and estado<=43:
52 resultado=173.69
53 elif estado>=44 and estado<=51:
54 resultado=221.31
55 elif estado >=52 and estado<=55:
56 resultado=229.84
57 else:
58 resultado=173.69
59 subtotal=0.0
60 productos_nombres=""
61 cantidad_articulos=""
62 if request.user.is_authenticated:
63 for key ,value in request.session["carrito"].items():
64 subtotal=subtotal+(float(value["precio"])*value["cantidad"])
65 productos_nombres = productos_nombres+str(value["producto_id"])+","
66 cantidad_articulos = cantidad_articulos+str(value["cantidad"])+","
67 else:
68 for key ,value in request.session["carrito"].items():
69 subtotal=subtotal+(float(value["precio"])*value["cantidad"])
70 productos_nombres = productos_nombres+str(value["producto_id"])+","
71 cantidad_articulos = cantidad_articulos+str(value["cantidad"])+","
72 sesion_id=request.session.session_key
73
74 total=resultado+subtotal
75 if total>=950.00 and total<1900.00:
76 descuento="5% de descuento!"
77 sub=total*0.05
78 total=total-sub
79 elif total>=1900 and total<3762.00:
80 sub=total*0.10
81 total=total-sub
82 descuento="10% de descuento!"
83
84 elif total>=3762.00 and total<7600.00:
85 sub=total*0.15
86 total=total-sub
87 descuento="15% de descuento!"
88
89 elif total>=7600.00 and total<11400.00:
90 sub=total*0.20
91 total=total-sub
92 descuento="20% de descuento!"
93
94 elif total>=11400.00 and total<15200.00:
95 sub=total*0.25
96 total=total-sub
97 descuento="25% de descuento!"
98
99 elif total>=15200.00 and total<19000.00:
100 sub=total*0.30
101 total=total-sub
102 descuento="30% de descuento!"
103
104 elif total>=19000.00:
105 sub=total*0.40
106 total=total-sub
107 descuento="40% de descuento!"
108
109 else:
110 total=total
111 descuento="No aplica"
112 total=round(total,2)
113 datos={
114 'nombre':str( request.GET.get("nombre")),
115 'apellidos':str( request.GET.get("apellidos")),
116 'telefono':str( request.GET.get("telefono")),
117 'email':str( request.GET.get("email")),
118 'municipio':str( request.GET.get("municipio")),
119 'colonia':str( request.GET.get("colonia")),
120 'codigo_postal':str( request.GET.get("codigo_postal")),
121 'calle':str( request.GET.get("calle")),
122 'num_exterior':str( request.GET.get("noexterior")),
123 'num_interior':str( request.GET.get("nointerior")),
124 'referencias':str( request.GET.get("referencias")),
125 'envio':str(resultado),
126 'total':str(total),
127 'subtotal':str(subtotal),
128 'descuento':str(descuento),
129 }
130 registro=Ventas_por_enviar(
131 enviado=False,
132 sesion = sesion_id,
133 nombre=datos['nombre'],
134 apellidos = datos['apellidos'],
135 telefono =datos['telefono'],
136 email = datos['email'],
137 municipio = datos['municipio'],
138 colonia = datos['colonia'],
139 codigo_postal= datos['codigo_postal'],
140 calle= datos['calle'],
141 num_exterior = datos['num_exterior'],
142 num_interior = datos['num_interior'],
143 referencias = datos['referencias'],
144 envio = datos['envio'],
145 total = datos['total'],
146 productos=productos_nombres,
147 cantidad = cantidad_articulos,
148 )
149 registro.save()
150 return render(request,"checkout/resumen.html",{'dic':datos})
151
152def pago_cancelado(request):
153
154 return render(request,"checkout/pago_cancelado.html")
155def hecho(request):
156 sesion_id=request.session.session_key
157 registro=Ventas_por_enviar.objects.filter(sesion=sesion_id)
158 posicion=(len(registro))
159 total=float(registro[posicion-1].total)+0.5
160 total=total*100
161
162 if request.method == 'POST':
163 charge = stripe.Charge.create(
164 amount=round(total),
165 currency="mxn",
166 description='Un cargo',
167 source=request.POST['stripeToken'],
168 )
169 registro[posicion-1].autorizacion=str(source)+str("stripe")
170 registro[posicion-1].verificacion=str(source)+str("stripe")
171 diccionario={
172 'nombre':registro[posicion-1].nombre,
173 'email':registro[posicion-1].email,
174 }
175 registro[posicion-1].save()
176 envio_email_confirmacion(diccionario)
177
178 return render(request,"checkout/pago_hecho.html")
179 else:
180 return render(request,"checkout/pago_cancelado.html")
181
182#PAYPALBUTTON
183def pago(request):
184 # Creating Access Token for Sandbox
185 client_id = "AWKxRtjpmHR9Jd8n8fMGO77lqcIw7fFHML19xSzd1Scfv4Mk-XGwnjBYJIkaRaFa_y2LC2PXBulTMPFK"
186 client_secret = "EGlVhQYGDzop2HftvmEqh726ChUjz4e7x_Ai4Hp900iA8troRX5feiS6ThlfB-HSVwzKNdHW2W3BzCyf"
187 # Creating an environment
188 environment = SandboxEnvironment(client_id=client_id, client_secret=client_secret)
189 client = PayPalHttpClient(environment)
190 # Construct a request object and set desired parameters
191 # Here, OrdersCreateRequest() creates a POST request to /v2/checkout/orders
192 requestPaypal = OrdersCreateRequest()
193 sesion_id=request.session.session_key
194 registro=Ventas_por_enviar.objects.filter(sesion=sesion_id)
195 posicion=(len(registro))
196 total=registro[posicion-1].total
197 total_stripe=float(total)
198 total_stripe=total_stripe*100
199 requestPaypal.prefer('return=representation')
200 requestPaypal.request_body (
201 {
202 "intent": "CAPTURE",
203 "purchase_units": [
204 {
205 "amount": {
206 "currency_code": 'MXN',
207 "value": float(total),
208 }
209 }
210 ],
211 "application_context":{
212 "return_url":"http://127.0.0.1:8000/checkout/exitoso",
213 "cancel_url":"http://127.0.0.1:8000/checkout/cancelado",
214 "brand_name":"Joyapan"
215 }
216 }
217 )
218 try:
219 # Call API with your client and get a response for your call
220 response = client.execute(requestPaypal)
221 if response.result.status == 'CREATED':
222 approval_url = str(response.result.links[1].href)
223 print(approval_url)
224
225
226 return render(request, 'checkout/pago.html',{#aqui es donde esta el boton
227 'approval_url':approval_url,'STRIPE_PUBLISHABLE_KEY':settings.STRIPE_PUBLISHABLE_KEY,'total':total,'total_stripe':total_stripe,
228 })
229
230 except IOError as ioe:
231 print (ioe)
232 if isinstance(ioe, HttpError):
233 # Something went wrong server-side
234 return render(request,'checkout/pago_cancelado.html')
235#PAYPAL
236def pago_exitoso(request):
237 # Creating Access Token for Sandbox
238 client_id = "AWKxRtjpmHR9Jd8n8fMGO77lqcIw7fFHML19xSzd1Scfv4Mk-XGwnjBYJIkaRaFa_y2LC2PXBulTMPFK"
239 client_secret = "EGlVhQYGDzop2HftvmEqh726ChUjz4e7x_Ai4Hp900iA8troRX5feiS6ThlfB-HSVwzKNdHW2W3BzCyf"
240 # Creating an environment
241 environment = SandboxEnvironment(client_id=client_id, client_secret=client_secret)
242 client = PayPalHttpClient(environment)
243 ordenId=request.GET.get('token')
244 payerId=request.GET.get('PayerID')
245
246
247
248
249
250 requestPaypal =OrdersCaptureRequest(ordenId)
251 print("RequestPaypal")
252 print(requestPaypal)
253 requestPaypal.prefer('return=representation')
254 try:
255 # Call API with your client and get a response for your call
256 response = client.execute(requestPaypal)
257 # If call returns body in response, you can get the deserialized version from the result attribute of the response
258 print("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
259
260 order = response.result.id
261 sesion_id=request.session.session_key
262 registro=Ventas_por_enviar.objects.filter(sesion=sesion_id)
263 posicion=(len(registro))
264 registro[posicion-1].autorizacion=order
265 registro[posicion-1].verificacion=payerId
266 diccionario={
267 'nombre':registro[posicion-1].nombre,
268 'email':registro[posicion-1].email,
269 }
270 registro[posicion-1].save()
271 envio_email_confirmacion(diccionario)
272
273 except IOError as ioe:
274 if isinstance(ioe, HttpError):
275 # Something went wrong server-side
276 print("Algo salio mal :c")
277 print (ioe.status_code)
278 print (ioe.headers)
279 print (ioe)
280 return render(request,'checkout/pago_cancelado.html')
281 else:
282 # Something went wrong client side
283 print (ioe)
284 return render(request,'checkout/pago_cancelado.html')
285
286 return render(request,'checkout/pago_exitoso.html')
287
288
289def mercado_pago(request):
290 sdk = mercadopago.SDK("TEST-7464376773457318-041401-5b77309039187c1aa6183f465644f152-742154279")
291 preference_data = {
292 "items": [
293 {
294 "title": "Prueba",
295 "quantity": 1,
296 "currency_id": "MXN",
297 "unit_price": 100.00,
298 }
299 ],
300 "back_urls": [
301 {
302 "success": "http://127.0.0.1:8000/checkout/hecho",
303 "failure": "http://127.0.0.1:8000/checkout/cancelado",
304 "pending": "http://127.0.0.1:8000/checkout/cancelado",
305 }
306
307 ],
308 "auto_return": "approved"
309}
310 preference_response = sdk.preference().create(preference_data)
311 preference = preference_response["response"]