what im doing wrong?

71 views
Skip to first unread message

Data Tips

unread,
Jan 13, 2023, 11:45:15 AM1/13/23
to django-oscar
hi guys im trying to implement webpay in django-oscar

but i dont know what im doing wrong u.u


this is my view.py 

from django.shortcuts import render, redirect
import requests
from django.views import View
import requests
from django.conf import settings
from django.urls import reverse
from oscar.apps.checkout.views import PaymentDetailsView

class WebpayPlusPaymentDetailsView(PaymentDetailsView):
    def get(self, request, *args, **kwargs):
        # Obtener el token de transacción
        data = {
            'buy_order': self.request.basket.order_number,
            'session_id': self.request.session.session_key,
            'amount': self.get_order_totals(self.request.basket)[0].incl_tax,
            'return_url': request.build_absolute_uri(reverse('webpayplus_return')),  
        }
        headers = {
            'content-type': 'application/json',
            'Tbk-Api-Key-Id': settings.WEBPAY_COMMERCE_CODE,
            'Tbk-Api-Key-Secret': settings.WEBPAY_API_KEY}
        response = requests.post(settings.WEBPAY_URL_INIT, json=data, headers=headers)
        token = response.json()['token']

        # Pasar el token como contexto al template
        context = self.get_context_data(**kwargs)
        context['token'] = token
        return render(request, 'oscar/checkout/payment_details.html', context)


my urls.py 

from django.urls import path

from .views import WebpayPlusConfirmationView, WebpayPlusReturnView, WebpayPlusPaymentDetailsView

urlpatterns = [
    path('webpayplus/', WebpayPlusPaymentDetailsView.as_view(), name='webpayplus'),
    path('webpayplus/confirmation/', WebpayPlusConfirmationView.as_view(), name='webpayplus_confirmation'),
    path('webpayplus/return/', WebpayPlusReturnView.as_view(),  name='webpayplus_return'),
    ]







and my html 



{% extends "oscar/checkout/payment_details.html" %}

{% block payment_methods %}
   
{% endblock %}

{% block payment_details %}
    {% block payment_details_content %}
        <p>This page needs implementing within your project.  You may want to use one of Oscar's payment gateway libraries:</p>
        <form action="https://webpay3g.transbank.cl/webpayserver/bp_payment.cgi" method="post">
          {% csrf_token %}
          <input type="" name="token_ws" value="{{ token }}">
        <input type="submit" value="Pagar con Webpay Plus">
        </form>
     
       
    {% endblock payment_details_content %}
{% endblock payment_details %}








Sebastian Jung

unread,
Jan 18, 2023, 4:33:32 PM1/18/23
to django...@googlegroups.com
You must all apps fork... Do you have done it. Please search after django oscar fork and you will find a manual how to do it ;-)

--
https://github.com/django-oscar/django-oscar
http://django-oscar.readthedocs.org/en/latest/
---
You received this message because you are subscribed to the Google Groups "django-oscar" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-oscar...@googlegroups.com.
To view this discussion on the web, visit https://groups.google.com/d/msgid/django-oscar/8a484785-815b-4ff2-a01a-437be71d136cn%40googlegroups.com.

Data Tips

unread,
Jan 24, 2023, 11:56:52 PM1/24/23
to django-oscar
so i need to fork all apps ? 


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
        # basket_id = request.basket.id
        # 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,
        }
        response = requests.post(api_url, headers=headers, json=payload)


        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)

    def get(self, request, *args, **kwargs):
        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):
        # basket_id = request.basket.id
        # 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,
        }
        response = requests.post(api_url, headers=headers, json=payload)
        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
Reply all
Reply to author
Forward
0 new messages