From 3d6f9b69728883bbac1a791dd101ffd5ad303720 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Tue, 13 May 2025 18:14:13 +0330 Subject: [PATCH] pna client --- apps/pg/views.py | 5 ++-- main/settings.py | 2 ++ utils/pna.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 utils/pna.py diff --git a/apps/pg/views.py b/apps/pg/views.py index a089c00..afadf52 100644 --- a/apps/pg/views.py +++ b/apps/pg/views.py @@ -63,7 +63,8 @@ class ChargeRequestView(UpdateView): messages.error(self.request, 'خطایی رخ داده است') charge_request.change_state(from_state=StateChoices.PENDING.value, to_state=StateChoices.EXPECTED_FAILURE.value) - return HttpResponseRedirect(self.get_success_url()) + return HttpResponseRedirect(self.get_success_url()) def get_success_url(self): - return reverse('pg:charge-request-view', kwargs={'pk': self.object.pk}) + return self.object.callback_url + # return reverse('pg:charge-request-view', kwargs={'pk': self.object.pk}) diff --git a/main/settings.py b/main/settings.py index f41bdc1..dfb7488 100644 --- a/main/settings.py +++ b/main/settings.py @@ -243,3 +243,5 @@ CACHES = { } } } + +PNA_CORPORATION_PIN = config('PNA_CORPORATION_PIN'), \ No newline at end of file diff --git a/utils/pna.py b/utils/pna.py new file mode 100644 index 0000000..b72fe31 --- /dev/null +++ b/utils/pna.py @@ -0,0 +1,77 @@ +import requests +from django.conf import settings + +class PNAClient: + normal_sale_request_url = 'https://pna.shaparak.ir/mhipg/api/Payment/NormalSale' + normal_sale_confirm_url = 'https://pna.shaparak.ir/mhipg/api/Payment/confirm' + normal_sale_reverse_url = 'https://pna.shaparak.ir/mhipg/api/Payment/Reverse' + + pg_base_url = 'https://pna.shaparak.ir/mhui/home/index/{token}' + + corporation_pin = settings.PNA_CORPORATION_PIN + + def request_normal_sale(self, amount, phone_number, discription, callback_url, order_id: int): + data = { + "CorporationPin": self.corporation_pin, + "Amount": amount, + "OrderId": order_id, + "CallBackUrl": callback_url, + "AdditionalData": discription, # optional + "Originator": phone_number, # optional + } + + response = requests.post(self.normal_sale_request_url, json=data) + print(response.json()) + + response_json_sample = { + "Token": "MTIzNDU2Nzg5MTA=", + "Message": "عملیات موفق", + "Status": "0" + } + + response_json_sample_error = { + 'errors': { + 'OrderId': [ + 'Error converting value "5c0980a4-ff91-4afb-9f1e-85b15af6fee5" to type \'System.Int64\'. Path \'OrderId\', line 1, position 123.' + ], + 'requestData': ['The requestData field is required.'] + }, + 'type': 'https://tools.ietf.org/html/rfc7231#section-6.5.1', + 'title': 'One or more validation errors occurred.', + 'status': 400, + 'traceId': '00-2e5835d18d02352de88318defe53ebc7-bf6082b6fb9f964c-00' + } + + return response.json() + + def request_normal_sale_confirm(self, token): + data = { + "CorporationPin": self.corporation_pin, + "Token": token + } + + response_json_sample = { + "Status": "0", + "CardNumberMasked ": "627412******2424", + "RRN": "800473354463", + "Token": " MTIzNDU2Nzg5MTA=" + } + + response = requests.post(self.normal_sale_confirm_url, json=data) + return response.json() + + def request_normal_sale_reverse(self, token): + data = { + "CorporationPin": self.corporation_pin, + "Token": token + } + + response_json_sample = { + "Token": " MTIzNDU2Nzg5MTA=", + "Message": "عملیات موفق", + "Status": "0" + } + response = requests.post(self.normal_sale_confirm_url, json=data) + + return response.json() +