import json
import requests
import random
from django.shortcuts import redirect
from django.views.generic import TemplateView
from oscar.apps.checkout.views import PaymentDetailsView as CorePaymentDetailsView
from oscar.apps.payment import models
from oscar.apps.payment.exceptions import PaymentError
from oscar.apps.payment.models import Source
from django.http import HttpResponse
from django.conf import settings
from oscar.apps.checkout.mixins import OrderPlacementMixin
from oscar.core.loading import get_model
Order = get_model('order', 'Order')
SourceType = get_model('payment', 'SourceType')
Basket = get_model('basket', 'Basket')
Line = get_model('basket', 'Line')
class PaymentDetailsView(CorePaymentDetailsView):
template_name = 'oscar/checkout/payment_details.html'
def get_basket_total(self, basket_id):
lines = Line.objects.filter(basket_id=basket_id)
total = sum([line.line_price_incl_tax for line in lines])
return total
def handle_payment(self, order_number, total, **kwargs):
self.request.session['order_number'] = order_number
super().handle_payment(order_number, total, **kwargs)
def post(self, request, **kwargs):
ctx = self.get_context_data(**kwargs)
# Retrieve the order number and total from the request or from the basket
# order = Order.objects.get(basket=basket_id)
order_number = str(random.randrange(1000000, 99999999))
total = request.basket.total_incl_tax
# Make a request to theWebpay API to initiate the transaction
headers = {'content-type': 'application/json', 'Tbk-Api-Key-Id': settings.WEBPAY_ID, 'Tbk-Api-Key-Secret': settings.WEBPAY_SECRET}
payload = {
'amount': int(total),
'buy_order': order_number,
'session_id': order_number,
'return_url': settings.WEBPAY_URL_RETURN,
}
if response.status_code != 200:
raise PaymentError("An error occurred while initiating the transaction")
# Extract the token and pass it to the template
response_json = json.loads(response.text)
token = response_json['token']
url = response_json['url']
self.request.session['webpay_token'] = token
self.request.session['url'] = url
ctx['webpay_token'] = token
ctx['url'] = url
print(ctx)
return self.render_to_response(ctx)
try:
token = self.request.session['webpay_token']
url = self.request.session['url']
except KeyError:
return HttpResponse("Error. Session variables not found")
ctx = self.get_context_data(**kwargs)
ctx['webpay_token'] = token
ctx['url'] = url
return self.render_to_response(ctx)
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['webpay_token'] = self.request.session.get('webpay_token')
ctx['url'] = self.request.session.get('url')
return ctx
def handle_webpay_response(self, request):
order_number = request.session.get('order_number')
token = request.GET.get('token_ws')
headers = {'content-type': 'application/json', 'Tbk-Api-Key-Id': settings.WEBPAY_ID, 'Tbk-Api-Key-Secret': settings.WEBPAY_SECRET}
response = requests.get(api_url, headers=headers)
if response.status_code != 200:
raise PaymentError("An error occurred while trying to confirm the transaction")
response_json = json.loads(response.text)
buy_order = response_json['buy_order']
session_id = response_json['session_id']
if buy_order != order_number or session_id != order_number:
raise PaymentError("The order number in the response does not match the original order number")
# The payment was successful, mark the order as 'paid'
order = Order.objects.get(number=order_number)
source_type, __ = SourceType.objects.get_or_create(name='Webpay')
source = Source(source_type=source_type, currency='CLP', amount_allocated=order.total_incl_tax, reference=token)
self.add_payment_source(source)
self.add_payment_event('Settled', order.total_incl_tax)
return redirect('checkout:thank_you')
class ShippingAddressView(OrderPlacementMixin, TemplateView):
template_name = 'oscar/checkout/shipping_address.html'
def post(self, request, *args, **kwargs):
# Create a form instance and populate it with data from the request:
form = self.form_class(request.POST)
# Check whether it's valid:
if form.is_valid():
# Process the data in form.cleaned_data as required
# Save the shipping address to the order
shipping_address = form.save()
self.create_order(shipping_address)
# Make the request to the webpay API to get the token and url
token, url = self.generate_webpay_token()
# Save the token and url in the session
request.session['webpay_token'] = token
request.session['webpay_url'] = url
# Redirect the user to the payment view
return redirect('payment-details')
# If the form is not valid, re-render the form with error messages
return self.render_to_response(self.get_context_data(form=form))
def get_basket_total(basket_id):
lines = Line.objects.filter(basket_id=basket_id)
total = sum([line.line_price_incl_tax for line in lines])
return total
def generate_webpay_token(self, request):
# order = Order.objects.get(basket=basket_id)
order_number = self.create_order()
total = request.basket.total_incl_tax
headers = {'content-type': 'application/json', 'Tbk-Api-Key-Id': settings.WEBPAY_ID, 'Tbk-Api-Key-Secret': settings.WEBPAY_SECRET}
payload = {
'amount': total,
'buy_order': order_number,
'session_id': order_number,
'return_url': settings.WEBPAY_URL_RETURN,
}
if response.status_code != 200:
raise PaymentError("An error occurred while initiating the transaction")
# Extract the token and the url from the API response
response_json = json.loads(response.text)
token = response_json['token']
url = response_json['url']
return token, url
because this is my actual views.py i can do all success but dont save me the order and the info, in the admin panel i dont have buy orders, but the transaction pass jaja
soo i dont know what im doing wrong