首页 > 解决方案 > 未找到:/回调/错误。我希望我的 payment_reponse 函数将 order.paid 更新为 True,保存到数据库并返回 done.html 页面

问题描述

#orders.view#

支付成功完成。但不是设置order.pad=True,保存和重定向到orders:doneorders:canceled它返回“未找到:/回调/”错误

from django.shortcuts import render, redirect
from django.urls import reverse
from cart.cart import Cart
from .models import OrderItem, Order
from .forms import OrderCreateForm
from .tasks import order_created
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_http_methods
from django.template import loader
from decimal import Decimal
import environ
import random
import math
import requests


env = environ.Env()
environ.Env.read_env()


def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        total_cost = cart.get_total_price()
        if form.is_valid():
            name = form.cleaned_data['last_name']
            email = form.cleaned_data['email']
            amount = f'{total_cost:.2f}',
            phone = form.cleaned_data['phone']
            order = form.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            # clear the cart
            cart.clear()
            # launch asynchronous task
            order_created.delay(order.id)
            request.session['order_id'] = order.id
            return redirect(str(process_payment(name, email, amount, phone)))
    else:
        form = OrderCreateForm()
    return render(request,
                  'orders/order/create.html',
                  {'cart': cart, 'form': form})


def process_payment(name, email, amount, phone):
    auth_token = env('SECRET_KEY')
    hed = {'Authorization': 'Bearer ' + auth_token}
    data = {
        "tx_ref": ''+str(math.floor(1000000 + random.random()*9000000)),
        "amount": amount,
        "currency": "NGN",
        "redirect_url": "http://localhost:8000/callback",
        "payment_options": "card",
        "meta": {
                    "consumer_id": 23,
                    "consumer_mac": "92a3-912ba-1192a"
        },
        "customer": {
            "email": email,
            "phonenumber": phone,
            "name": name
        },
        "customizations": {
            "title": "Jmd Fashion Store",
            "description": "Best store in town",
            "logo": "https://getbootstrap.com/docs/4.0/assets/brand/bootstrap-solid.svg"
        }
    }
    url = ' https://api.flutterwave.com/v3/payments'
    response = requests.post(url, json=data, headers=hed)
    response = response.json()
    link = response['data']['link']
    return link


@csrf_exempt
def payment_done(request):
    return render(request, 'orders/order/done.html')


@csrf_exempt
def payment_canceled(request):
    return render(request, 'orders/order/canceled.html')


@require_http_methods(['GET', 'POST'])
def payment_response(request, order_id):
    order_id = request.session.get('order_id')
    order = get_object_or_404(Order, id=order_id)
    status = request.GET.get('status', None)
    tx_ref = request.GET.get('tx_ref', None)
    if status and tx_ref:
        order.paid = True
        order.flutter_tx_ref = tx_ref
        order.save()
        return render('orders:done')
    else:
        return render('orders:canceled')

#orders.url#

from django.urls import path
from . import views

app_name = 'orders'


urlpatterns = [
    path('create/', views.order_create, name='order_create'),
    path('callback', views.payment_response, name='payment_response'),
    path('done/', views.payment_done, name='done'),
    path('canceled/', views.payment_canceled, name='canceled'),
]

找不到控制台输出

标签: djangoflutterwave

解决方案


推荐阅读