Merge pull request 'feat(ipg): fix failed request and change html files' (#10) from FIX/failed-request into master
Reviewed-on: addwin/pg#10 Reviewed-by: Sayyid Hamid Mahdavi <sahama@noreply.localhost>
This commit is contained in:
commit
c437ee453d
7 changed files with 231 additions and 206 deletions
|
|
@ -159,14 +159,18 @@ class PaymentRequest(models.Model):
|
|||
logger.error(f"[Deposit Verify] Failed to get response from wallet service | payment_id={self.pk}")
|
||||
raise Exception('Failed to get response from wallet service')
|
||||
|
||||
if not verify_response.uuid or verify_response.state != 5:
|
||||
if not verify_response.uuid:
|
||||
logger.error(f"[Deposit Verify] Failed to get response uuid from wallet service | payment_id={self.pk}")
|
||||
raise Exception('Failed to get response uuid from wallet service')
|
||||
|
||||
if verify_response.state != 5:
|
||||
logger.error(f"[Deposit Verify] Wallet verification failed | payment_id={self.pk}, response={verify_response}")
|
||||
to_pay_failed = PaymentRequest.objects.filter(
|
||||
pk=self.pk,
|
||||
state=StateChoices.WALLET_SUBMIT_SUCCESS.value
|
||||
).update(
|
||||
state=StateChoices.FAILED.value,
|
||||
)
|
||||
# to_pay_failed = PaymentRequest.objects.filter(
|
||||
# pk=self.pk,
|
||||
# state=StateChoices.WALLET_SUBMIT_SUCCESS.value
|
||||
# ).update(
|
||||
# state=StateChoices.FAILED.value,
|
||||
# )
|
||||
raise Exception('Failed to verify payment in wallet')
|
||||
|
||||
to_pay_success = PaymentRequest.objects.filter(
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ from rest_framework import generics
|
|||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from django.shortcuts import render
|
||||
|
||||
from utils.commons import calculate_pna_commission
|
||||
from .constans import StateChoices
|
||||
|
|
@ -79,6 +80,11 @@ class PaymentRequestView(UpdateView):
|
|||
charge_request.save_commission()
|
||||
tool = charge_request.get_gateway_tools()
|
||||
tool.make_request()
|
||||
charge_request.refresh_from_db()
|
||||
if charge_request.state == StateChoices.FAILED:
|
||||
return render(request, 'pg/payment_failure.html', {
|
||||
'object': charge_request
|
||||
})
|
||||
redirect_url = tool.get_pg_page_url()
|
||||
return HttpResponseRedirect(redirect_url)
|
||||
|
||||
|
|
@ -88,6 +94,11 @@ class PaymentRequestView(UpdateView):
|
|||
charge_request.set_gateway({'pna': True})
|
||||
tool = charge_request.get_gateway_tools()
|
||||
tool.make_request()
|
||||
charge_request.refresh_from_db()
|
||||
if charge_request.state == StateChoices.FAILED:
|
||||
return render(request, 'pg/payment_failure.html', {
|
||||
'object': charge_request
|
||||
})
|
||||
redirect_url = tool.get_pg_page_url()
|
||||
return HttpResponseRedirect(redirect_url)
|
||||
|
||||
|
|
|
|||
BIN
static/image/pg/fail.png
Normal file
BIN
static/image/pg/fail.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
BIN
static/image/pg/tik.png
Normal file
BIN
static/image/pg/tik.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
33
templates/pg/payment-confirm.html
Normal file
33
templates/pg/payment-confirm.html
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{% extends "base.html" %}
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
{% load jalali_tags %}
|
||||
|
||||
{% block title %}بازگشت{% endblock %}
|
||||
{% block page_title %}بازگشت{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
مبلغ {{ object.amount }} ریال با وضعیت {{ object.get_state_display }}<br>
|
||||
<form action="{{ request.get_full_path }}" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
<div class="row g-3">
|
||||
<div class="col-md-12 col-lg-12" id="formset">
|
||||
{# <div class="card">#}
|
||||
{# <div class="card-body">#}
|
||||
{{ form|crispy }}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
</div>
|
||||
<h6 class="h6">بازگشت به برنامه</h6>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<button type="submit" name="redirect-to-app" value="true" class="btn mx-auto d-block">
|
||||
<img class="img-thumbnail" width="128" height="128" src="{% static "image/icon.png" %}"/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
|
@ -1,179 +1,168 @@
|
|||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
{% load jalali_tags %}
|
||||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="fa" dir="rtl">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Payment Unsuccessful</title>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
|
||||
.mobile-frame {
|
||||
width: 100vh;
|
||||
height: 100vh;
|
||||
background-color: #ffffff;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
||||
padding: 30px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.screen-content {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
|
||||
.message-section {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.error-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-color: #e53935; /* Red for error */
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.error-text {
|
||||
color: #e53935;
|
||||
font-size: 1.1rem;
|
||||
font-weight: bold;
|
||||
margin-top: 15px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.divider {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background-color: #eeeeee;
|
||||
border: none;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.details-text {
|
||||
color: #757575;
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.details-text .code {
|
||||
color: #424242;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.placeholder-link {
|
||||
color: #bdbdbd;
|
||||
font-size: 0.9rem;
|
||||
text-decoration: underline;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
|
||||
.button-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
width: 100%;
|
||||
padding: 14px;
|
||||
border-radius: 20px;
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease-in-out;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.btn-retry {
|
||||
background-color: #ffffff;
|
||||
border: 2px solid #6931c9;
|
||||
color: #6931c9;
|
||||
}
|
||||
|
||||
.btn-retry:hover {
|
||||
background-color: #f9f7fd;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #6931c9;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: #7745ce;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="mobile-frame">
|
||||
<div class="screen-content">
|
||||
|
||||
<div class="message-section">
|
||||
<div class="error-icon">!</div>
|
||||
{% if message %}
|
||||
<p class="error-text">{{ message }}</p>
|
||||
{% else %}
|
||||
<p class="error-text">پرداخت شما ناموفق بود</p>
|
||||
{% endif %}
|
||||
<hr class="divider">
|
||||
<div class="details-text">
|
||||
<p>کد پیگیری تراکنش شما: <span class="code">{{ object.reference_number }}</span></p>
|
||||
<p>در صورت کسر از موجودی، مبلغ پرداختی طی یک تا 72 ساعت آینده به حساب شما بازگردانده خواهد شد.</p>
|
||||
</div>
|
||||
<a href="https://winsoo.ir" class="placeholder-link">وینسو</a>
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
<form action="{{ request.get_full_path }}" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<button class="btn btn-primary" name="redirect-to-app" value="true">بازگشت به صفحه اصلی</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
{% load jalali_tags %}
|
||||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="fa" dir="rtl">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Payment Unsuccessful</title>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
|
||||
.screen-content {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
|
||||
.message-section {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.error-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-color: #e53935; /* Red for error */
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.error-text {
|
||||
color: #e53935;
|
||||
font-size: 1.1rem;
|
||||
font-weight: bold;
|
||||
margin-top: 15px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.divider {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background-color: #eeeeee;
|
||||
border: none;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.details-text {
|
||||
color: #757575;
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.details-text .code {
|
||||
color: #424242;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.placeholder-link {
|
||||
color: #bdbdbd;
|
||||
font-size: 0.9rem;
|
||||
text-decoration: underline;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
|
||||
.button-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
width: 100%;
|
||||
padding: 14px;
|
||||
border-radius: 8px;
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease-in-out;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.btn-retry {
|
||||
background-color: #ffffff;
|
||||
border: 2px solid #6931c9;
|
||||
color: #6931c9;
|
||||
}
|
||||
|
||||
.btn-retry:hover {
|
||||
background-color: #f9f7fd;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #3B604B;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: #3B604B;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="mobile-frame">
|
||||
<div class="screen-content">
|
||||
|
||||
<div class="message-section">
|
||||
<div ><img src="{% static "image/pg/fail.png" %}" alt="fail"></div>
|
||||
{% if message %}
|
||||
<p class="error-text">{{ message }}</p>
|
||||
{% else %}
|
||||
<p class="error-text">پرداخت ناموفق </p>
|
||||
{% endif %}
|
||||
<hr class="divider">
|
||||
<div class="details-text">
|
||||
<p>کد پیگیری تراکنش شما: <span class="code">{{ object.reference_number }}</span></p>
|
||||
<p>در صورت کسر از موجودی، مبلغ پرداختی طی یک تا 72 ساعت آینده به حساب شما بازگردانده خواهد شد.</p>
|
||||
</div>
|
||||
<a href="https://winsoo.ir" class="placeholder-link">winsoo</a>
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
<form action="{{ request.get_full_path }}" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<button class="btn btn-primary" name="redirect-to-app" value="true">بازگشت به صفحه اصلی</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -24,18 +24,6 @@
|
|||
min-height: 100vh;
|
||||
}
|
||||
|
||||
|
||||
.mobile-frame {
|
||||
width: 100vh;
|
||||
height: 100vh;
|
||||
background-color: #ffffff;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
||||
padding: 30px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.screen-content {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
|
|
@ -125,7 +113,7 @@
|
|||
width: 100%;
|
||||
padding: 15px;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
border-radius: 8px;
|
||||
font-size: 1.1rem;
|
||||
font-weight: bold;
|
||||
font-family: 'Vazirmatn', sans-serif;
|
||||
|
|
@ -134,12 +122,12 @@
|
|||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #6931c9;
|
||||
background-color: #3B604B;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: #7745ce;
|
||||
background-color: #3B604B;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
|
@ -149,24 +137,24 @@
|
|||
<div class="screen-content">
|
||||
|
||||
<div class="message-section">
|
||||
<div class="success-icon">✓</div>
|
||||
<div ><img src="{% static "image/pg/tik.png" %}" alt="success"></div>
|
||||
<p class="title">پرداخت موفق</p>
|
||||
<p class="subtitle">پرداخت با موفقیت انجام شد.</p>
|
||||
<hr class="divider">
|
||||
<div class="amount-row">
|
||||
<span class="amount-label">مقدار پرداخت شده:</span>
|
||||
<span class="amount-value">{{ object.amount }} ریال</span>
|
||||
<span class="amount-label">مبلغ شارژ</span>
|
||||
<span class="amount-value">{{ object.amount }} تومان</span>
|
||||
</div>
|
||||
<a href="https://winsoo.ir" class="placeholder-link">وینسو</a>
|
||||
<a href="https://winsoo.ir" class="placeholder-link">winsoo</a>
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
<form action="{{ request.get_full_path }}" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<button class="btn btn-primary" name="redirect-to-app" value="true">بازگشت به صفحه اصلی</button>
|
||||
<button class="btn btn-primary" name="redirect-to-app" value="true">بازگشت به وینسو</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue