feat: add portal recharge page

This commit is contained in:
QiuSW
2026-07-03 14:49:45 +08:00
parent 4a10c2bb92
commit c2e411fe45
18 changed files with 518 additions and 31 deletions
+52 -3
View File
@@ -2,15 +2,21 @@ from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Sum
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse_lazy
from django.urls import reverse, reverse_lazy
from django.views import View
from django.views.generic import FormView, TemplateView
from apps.billing.payment_gateways import PaymentOrderCreateError
from apps.billing.pricing import NoExchangeRateError
from apps.billing.models import PointsLedger, RechargeOrder
from apps.billing.services import get_balance_snapshot
from apps.billing.services import (
RechargeOrderCreateError,
create_recharge_order,
get_balance_snapshot,
)
from apps.users.models import ApiKey
from .forms import ApiKeyCreateForm
from .forms import ApiKeyCreateForm, RechargeCreateForm
NEW_API_KEY_SESSION_KEY = "portal_new_api_key"
@@ -120,6 +126,49 @@ class ApiKeyDeleteView(LoginRequiredMixin, View):
return redirect("portal-apikeys")
class RechargePageView(LoginRequiredMixin, FormView):
template_name = "portal/recharge.html"
form_class = RechargeCreateForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
order_no = str(self.request.GET.get("order_no") or "").strip()
current_order = None
if order_no:
current_order = RechargeOrder.objects.filter(
user=self.request.user,
order_no=order_no,
).first()
context["balance"] = get_balance_snapshot(self.request.user)
context.update(get_portal_account_summary(self.request.user))
context["current_order"] = current_order
context["recent_recharge_orders"] = get_recharge_orders_for_user(
self.request.user
)[:5]
return context
def form_valid(self, form):
try:
order = create_recharge_order(
user=self.request.user,
amount=form.cleaned_data["amount"],
pay_method=form.cleaned_data["pay_method"],
)
except NoExchangeRateError:
form.add_error(None, "未配置当前币种汇率,暂时无法充值。")
return self.form_invalid(form)
except RechargeOrderCreateError:
form.add_error(None, "充值下单参数错误,请检查金额和支付方式。")
return self.form_invalid(form)
except PaymentOrderCreateError:
form.add_error(None, "支付下单失败,请稍后重试。")
return self.form_invalid(form)
messages.success(self.request, "充值订单已创建,请扫码支付。")
recharge_url = reverse("portal-recharge")
return redirect(f"{recharge_url}?order_no={order.order_no}")
class RechargeRecordListView(LoginRequiredMixin, TemplateView):
template_name = "portal/recharge_records.html"