diff --git a/apps/pg/admin.py b/apps/pg/admin.py index a8d164f..ec9a153 100644 --- a/apps/pg/admin.py +++ b/apps/pg/admin.py @@ -3,6 +3,6 @@ from .models import ChargeRequest class ChargeRequestAdmin(admin.ModelAdmin): - pass + list_display = ['uuid', 'id'] admin.site.register(ChargeRequest, ChargeRequestAdmin) \ No newline at end of file diff --git a/apps/pg/models.py b/apps/pg/models.py index 32d763f..8d5fffc 100644 --- a/apps/pg/models.py +++ b/apps/pg/models.py @@ -1,5 +1,8 @@ +import urllib.parse + from django.conf import settings from django.db import models +from django.urls import reverse from oauth2_provider.settings import oauth2_settings from apps.core.models import BaseModel @@ -49,8 +52,11 @@ class ChargeRequest(models.Model): def request_sale(self): pna_client = PNAClient() + description = 'from addwin ipg' - pna_callback_url = f'https://ipg.addwin.ir/page/pna_callback/{self.uuid}/' + pna_callback_url = urllib.parse.urljoin( + settings.IPG_BASE_PUBLIC_URL, + reverse("pg:charge-confirm-view", kwargs={"uuid": self.uuid})) response = pna_client.request_normal_sale(self.amount, description, pna_callback_url, order_id=self.id) self.pna_status_code = response['status'] @@ -70,6 +76,8 @@ class ChargeRequest(models.Model): pna_client = PNAClient() description = 'from addwin ipg' response = pna_client.request_normal_sale_confirm(self.pna_token) + # response = {'status': 0, 'cardNumberMasked': '504172******9210', 'rrn': 511629210215, 'appToken': 4101434578524, 'token': 'NDEwMTQzNDU3ODUyNA=='} + if response['status'] == 0: self.pna_status = StateChoices.SUCCESS.value diff --git a/apps/pg/views.py b/apps/pg/views.py index 658f18b..32f14ec 100644 --- a/apps/pg/views.py +++ b/apps/pg/views.py @@ -40,8 +40,9 @@ class ChargeRequestView(UpdateView): slug_url_kwarg = 'uuid' def get_queryset(self): - return ChargeRequest.objects.all() + # return ChargeRequest.objects.all() # return Charge.objects.filter(state__in=[StateChoices.CREATED.value, StateChoices.SUCCESS.value]) + return ChargeRequest.objects.filter(state__in=[StateChoices.CREATED.value]) def form_valid(self, form): self.object = form.save() @@ -57,35 +58,13 @@ class ChargeRequestView(UpdateView): # TODO: redirect to error page return HttpResponseRedirect(reverse('pg:charge-request-view', kwargs={'uuid': charge_request.uuid})) - charge_request.charge_wallet_balance() - # transaction = Transaction.objects.create( - # uuid=charge.uuid, - # payee_id=charge.user.pk, - # payee_type=1, - # payer_id=payer_pk, - # payer_type=2, - # amount=amount, - # details={'description': 'شارژ مجازی کیف پول'} - # ) - # transaction.submit() - # transaction.verify() - # charge.change_state(from_state=StateChoices.PENDING.value, to_state=StateChoices.SUCCESS.value) - messages.success(self.request, 'شارژ انجام شد') - - # except Exception as e: - # print(e) - # 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()) - def get_success_url(self): return self.object.callback_url # return reverse('pg:charge-request-view', kwargs={'pk': self.object.pk}) @method_decorator(csrf_exempt, name='dispatch') class ChargeConfirmView(UpdateView): - template_name = 'pg/charge-request.html' + template_name = 'pg/charge-confirm.html' form_class = ChargeRequestForm # pk_url_kwarg = 'uuid' slug_field = 'uuid' @@ -97,16 +76,11 @@ class ChargeConfirmView(UpdateView): def get(self, request, *args, **kwargs): print('get') - print(args) print(kwargs) - self.object = self.get_object() - charge_request: ChargeRequest = self.get_object() - charge_request.charge_wallet_balance() - charge_request.confirm_sale() - context = self.get_context_data(object=self.object) - messages.success(self.request, 'شارژ انجام شد') + context = self.get_context_data() + messages.info(self.request, 'در پردازش صفحه خطایی وجود دارد.') return self.render_to_response(context) @@ -118,13 +92,25 @@ class ChargeConfirmView(UpdateView): # post = - self.object = self.get_object() - charge_request: ChargeRequest = self.get_object() - charge_request.charge_wallet_balance() - charge_request.confirm_sale() - context = self.get_context_data(object=self.object) - messages.success(self.request, 'شارژ انجام شد') - return self.render_to_response(context) + if 'redirect-to-app' in request.POST: + return super().post(request, *args, **kwargs) + else: + self.object = self.get_object() + + # post = + if request.POST.get('status') == 0: + try: + charge_request: ChargeRequest = self.get_object() + charge_request.charge_wallet_balance() + charge_request.confirm_sale() + messages.success(self.request, 'شارژ انجام شد') + + except Exception as e: + print(e) + messages.success(self.request, str(e)) + + context = self.get_context_data(object=self.object) + return self.render_to_response(context) # def form_valid(self, form): @@ -152,6 +138,5 @@ class ChargeConfirmView(UpdateView): # # return HttpResponseRedirect(self.get_success_url()) - # def get_success_url(self): - # return self.object.callback_url - # return reverse('pg:charge-request-view', kwargs={'pk': self.object.pk}) + def get_success_url(self): + return self.object.callback_url diff --git a/main/settings.py b/main/settings.py index ae083ce..fa0e768 100644 --- a/main/settings.py +++ b/main/settings.py @@ -244,4 +244,6 @@ CACHES = { } } -PNA_CORPORATION_PIN = config('PNA_CORPORATION_PIN') \ No newline at end of file +PNA_CORPORATION_PIN = config('PNA_CORPORATION_PIN') +WALLET_BASE_PUBLIC_URL = config('WALLET_BASE_PUBLIC_URL') +IPG_BASE_PUBLIC_URL = config('IPG_BASE_PUBLIC_URL') diff --git a/static/image/icon.png b/static/image/icon.png new file mode 100644 index 0000000..8049773 Binary files /dev/null and b/static/image/icon.png differ diff --git a/static/image/pna.png b/static/image/pna.png new file mode 100644 index 0000000..dce30e9 Binary files /dev/null and b/static/image/pna.png differ diff --git a/templates/base.html b/templates/base.html index 7e8b4d0..b66d48b 100644 --- a/templates/base.html +++ b/templates/base.html @@ -63,14 +63,14 @@ -
-
-
- {% block page_action %} - {% endblock %} -
-
-
+{#
#} +{#
#} +{#
#} +{# {% block page_action %}#} +{# {% endblock %}#} +{#
#} +{#
#} +{#
#}
diff --git a/templates/pg/charge-confirm.html b/templates/pg/charge-confirm.html new file mode 100644 index 0000000..3e87bfc --- /dev/null +++ b/templates/pg/charge-confirm.html @@ -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 }}
+
+ {% csrf_token %} +
+
+ {#
#} + {#
#} + {{ form|crispy }} + {#
#} + {#
#} +
+
بازگشت به برنامه
+
+
+ +
+
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/pg/charge-request.html b/templates/pg/charge-request.html index 3fb3c2c..c6e7631 100644 --- a/templates/pg/charge-request.html +++ b/templates/pg/charge-request.html @@ -8,19 +8,24 @@ {% block content %} -مبلغ {{ object.amount }} ریال با وضعیت {{ object.get_state_display }}
+ مبلغ {{ object.amount }} ریال
{% csrf_token %}
-{#
#} -{#
#} - {{ form|crispy }} -{#
#} -{#
#} + {#
#} + {#
#} + {{ form|crispy }} + {#
#} + {#
#}
-
- +
پرداخت با:
+
+
+ +
diff --git a/utils/wallet_client.py b/utils/wallet_client.py index e5ae9bf..0762eaa 100644 --- a/utils/wallet_client.py +++ b/utils/wallet_client.py @@ -14,6 +14,7 @@ from gooyal_wallet_client.api.wallet import (wallet_api_application_deposit_crea wallet_api_application_withdraw_verify_retrieve) from gooyal_wallet_client.types import Response +from django.conf import Settings class ContentTypeChoices(models.IntegerChoices): IMAGE = 1, 'image' @@ -66,7 +67,7 @@ def log_response(response): def get_client(): access_token = login_as_client_credentials()['access_token'] - client = AuthenticatedClient(base_url="https://wallet.gooyal.com", token=access_token, + client = AuthenticatedClient(base_url=settings.WALLET_BASE_PUBLIC_URL, token=access_token, httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}}, ) return client