This commit is contained in:
Sayyid Hamid Mahdavi 2026-03-09 17:44:49 +03:30
parent 6bab3b28a8
commit d749dedbef
5 changed files with 62 additions and 35 deletions

View file

@ -7,7 +7,7 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('pg', '0005_fake'), ('pg', '0007_paymentrequest_commission'),
] ]
operations = [ operations = [

View file

@ -0,0 +1,31 @@
# Generated by Django 5.1.4 on 2026-03-09 16:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pg', '0008_sep'),
]
operations = [
migrations.RemoveField(
model_name='sep',
name='sep_order_id',
),
migrations.RemoveField(
model_name='sep',
name='sep_originator',
),
migrations.AddField(
model_name='sep',
name='sep_ref_number',
field=models.CharField(blank=True, db_index=True, max_length=255, null=True),
),
migrations.AlterField(
model_name='paymentrequest',
name='gateway',
field=models.CharField(choices=[('fake', 'fake'), ('pna', 'pna'), ('sep', 'sep')], max_length=255),
),
]

View file

@ -332,7 +332,7 @@ class SEP(BasePGModel):
def make_request(self): def make_request(self):
self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state') self.payment_request.change_state(StateChoices.CREATED, StateChoices.IPG_PENDING, 'can not change state')
amount = self.payment_request.amount amount = self.payment_request.amount + self.payment_request.commission
description = 'from addwin ipg' description = 'from addwin ipg'
callback_url = urllib.parse.urljoin( callback_url = urllib.parse.urljoin(
settings.IPG_BASE_PUBLIC_URL, settings.IPG_BASE_PUBLIC_URL,
@ -342,6 +342,8 @@ class SEP(BasePGModel):
try: try:
response = self.client.request_token(amount, callback_url, order_id, phone_number) response = self.client.request_token(amount, callback_url, order_id, phone_number)
self.details['get_token_response'] = response
self.sep_status_code = response['status'] self.sep_status_code = response['status']
self.sep_status_message = response.get('title') self.sep_status_message = response.get('title')
@ -349,7 +351,6 @@ class SEP(BasePGModel):
self.sep_token = response['token'] self.sep_token = response['token']
else: else:
self.details['get_token_response'] = response
self.payment_request.change_state(self.payment_request.state, StateChoices.FAILED, self.payment_request.change_state(self.payment_request.state, StateChoices.FAILED,
'error in sep gateway') 'error in sep gateway')
except Exception as e: except Exception as e:
@ -364,7 +365,7 @@ class SEP(BasePGModel):
def confirm_request(self, request=None): def confirm_request(self, request=None):
if self.payment_request.state not in [StateChoices.IPG_PENDING]: if self.payment_request.state not in [StateChoices.IPG_PENDING]:
messages.error(request, "وضعیت تراکنش در حالت مناسبی نیست.") messages.error(request, "وضعیت تراکنش در حالت مناسبی نیست.")
return return False, "وضعیت تراکنش در حالت مناسبی نیست."
print(dict(request.POST)) print(dict(request.POST))
post_dict = dict(request.POST) post_dict = dict(request.POST)
@ -372,7 +373,7 @@ class SEP(BasePGModel):
# post = {'MID': ['0'], 'TerminalId': ['15336754'], 'RefNum': ['wSLVxHt51y3BjY9tkFXieaQAxHg6cmGp2X7B506RZs'], 'ResNum': ['10'], 'State': ['OK'], 'TraceNo': ['393594'], 'Amount': ['20000'], 'AffectiveAmount': ['20000'], 'Wage': [''], 'Rrn': ['224413541909'], 'SecurePan': ['504172******9210'], 'Status': ['2'], 'Token': ['dd830117c88a4e8284230430ccf6c553'], 'HashedCardNumber': ['6008617e6bab76997499446356f5c8b60288445650dd551fdf32007bcf2b14af']} # post = {'MID': ['0'], 'TerminalId': ['15336754'], 'RefNum': ['wSLVxHt51y3BjY9tkFXieaQAxHg6cmGp2X7B506RZs'], 'ResNum': ['10'], 'State': ['OK'], 'TraceNo': ['393594'], 'Amount': ['20000'], 'AffectiveAmount': ['20000'], 'Wage': [''], 'Rrn': ['224413541909'], 'SecurePan': ['504172******9210'], 'Status': ['2'], 'Token': ['dd830117c88a4e8284230430ccf6c553'], 'HashedCardNumber': ['6008617e6bab76997499446356f5c8b60288445650dd551fdf32007bcf2b14af']}
try: try:
ref_number = post_dict.get('ref_number')[0] ref_number = post_dict.get('RefNum')[0]
except Exception as e: except Exception as e:
print(e) print(e)
ref_number = None ref_number = None
@ -398,15 +399,16 @@ class SEP(BasePGModel):
self.payment_request.charge_wallet_balance() self.payment_request.charge_wallet_balance()
messages.success(request, 'شارژ انجام شد') messages.success(request, 'شارژ انجام شد')
return True, 'شارژ انجام شد'
except Exception as e: except Exception as e:
print(e) print(e)
messages.error(request, str(e)) messages.error(request, str(e))
return False, "خطایی رخ داده است."
else: else:
print(request.POST) print(request.POST)
messages.error(request, "نتیجه تراکنش از سمت درگاه دریافت نشد.") messages.error(request, "نتیجه تراکنش از سمت درگاه دریافت نشد.")
return False, "نتیجه تراکنش از سمت درگاه دریافت نشد."
def reverse_request(self): def reverse_request(self):
raise NotImplementedError() raise NotImplementedError()

View file

@ -75,33 +75,26 @@ class PaymentRequestView(UpdateView):
slug_url_kwarg = 'uuid' slug_url_kwarg = 'uuid'
# TODO: remove it in future # TODO: remove it in future
def get(self, request, *args, **kwargs): # def get(self, request, *args, **kwargs):
charge_request: PaymentRequest = self.get_object() # charge_request: PaymentRequest = self.get_object()
charge_request.set_gateway({'pna': True}) # if charge_request.state == StateChoices.FAILED:
charge_request.save_commission() # return render(request, 'pg/payment_failure.html', {
tool = charge_request.get_gateway_tools() # 'object': charge_request
tool.make_request() # })
charge_request.refresh_from_db() # redirect_url = tool.get_pg_page_url()
if charge_request.state == StateChoices.FAILED: # return HttpResponseRedirect(redirect_url)
return render(request, 'pg/payment_failure.html', { #
'object': charge_request # # TODO: remove it in future
}) # def post(self, request, *args, **kwargs):
redirect_url = tool.get_pg_page_url() # charge_request: PaymentRequest = self.get_object()
return HttpResponseRedirect(redirect_url) # tool = charge_request.get_gateway_tools()
# charge_request.refresh_from_db()
# TODO: remove it in future # if charge_request.state == StateChoices.FAILED:
def post(self, request, *args, **kwargs): # return render(request, 'pg/payment_failure.html', {
charge_request: PaymentRequest = self.get_object() # 'object': charge_request
charge_request.set_gateway({'pna': True}) # })
tool = charge_request.get_gateway_tools() # redirect_url = tool.get_pg_page_url()
tool.make_request() # return HttpResponseRedirect(redirect_url)
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)
def get_queryset(self): def get_queryset(self):
# return ChargeRequest.objects.all() # return ChargeRequest.objects.all()
@ -113,6 +106,7 @@ class PaymentRequestView(UpdateView):
charge_request: PaymentRequest = self.get_object() charge_request: PaymentRequest = self.get_object()
charge_request.set_gateway(form.data) charge_request.set_gateway(form.data)
charge_request.save_commission()
tool:BasePGModel = charge_request.get_gateway_tools() tool:BasePGModel = charge_request.get_gateway_tools()

View file

@ -26,7 +26,7 @@ class SEPClient:
# success_token = {'status': 1, 'token': '38faf9c852664f3ea1ecf764f853a284'} # success_token = {'status': 1, 'token': '38faf9c852664f3ea1ecf764f853a284'}
# failed_token = {'status': -1, 'errorCode': '5', 'errorDesc': 'پارامترهای ارسال شده نامعتبر است.; شماره ترمینال باید بزرگتر یا برابر با 1 باشد'} # failed_token = {'status': -1, 'errorCode': '5', 'errorDesc': 'پارامترهای ارسال شده نامعتبر است.; شماره ترمینال باید بزرگتر یا برابر با 1 باشد'}
response = requests.post(self.token_request_url, json=data) response = requests.post(self.request_token_url, json=data)
print(response.json()) print(response.json())
tmp = {} tmp = {}