From fd6966575eaad50ef23c2bb7673663807dc7e9a9 Mon Sep 17 00:00:00 2001 From: David Webb Espiritu Date: Sat, 7 Feb 2026 02:54:59 +0800 Subject: [PATCH 1/2] chore: testing --- payments/templates/pages/stripe_checkout.py | 17 +++++++++++++++++ payments/utils/utils.py | 11 +++++++++++ 2 files changed, 28 insertions(+) diff --git a/payments/templates/pages/stripe_checkout.py b/payments/templates/pages/stripe_checkout.py index 7f4a30e0b..794cee4ef 100644 --- a/payments/templates/pages/stripe_checkout.py +++ b/payments/templates/pages/stripe_checkout.py @@ -32,6 +32,19 @@ def get_context(context): if not (set(expected_keys) - set(list(frappe.form_dict))): for key in expected_keys: context[key] = frappe.form_dict[key] + + # Check if payment already completed + if frappe.utils.check_payment_status( + context.reference_doctype, + context.reference_docname + ): + frappe.redirect_to_message( + _('Payment Completed'), + _('This payment request has already been processed'), + http_status_code=400 + ) + frappe.local.flags.redirect_location = frappe.local.response.location + raise frappe.Redirect gateway_controller = get_gateway_controller( context.reference_doctype, context.reference_docname, context.payment_gateway ) @@ -73,6 +86,10 @@ def get_header_image(doc, gateway_controller): def make_payment(stripe_token_id, data, reference_doctype=None, reference_docname=None, payment_gateway=None): data = json.loads(data) + # Check if payment already completed + if frappe.utils.check_payment_status(reference_doctype, reference_docname): + frappe.throw(_('This payment has already been completed')) + data.update({"stripe_token_id": stripe_token_id}) gateway_controller = get_gateway_controller(reference_doctype, reference_docname, payment_gateway) diff --git a/payments/utils/utils.py b/payments/utils/utils.py index 64e79a99d..79de007a3 100644 --- a/payments/utils/utils.py +++ b/payments/utils/utils.py @@ -26,6 +26,17 @@ def get_payment_gateway_controller(payment_gateway): frappe.throw(_("{0} Settings not found").format(payment_gateway)) +def check_payment_status(reference_doctype, reference_docname): + """Verify if payment request is already completed""" + try: + doc = frappe.get_doc(reference_doctype, reference_docname) + return doc.status in ['Paid'] + except frappe.DoesNotExistError: + frappe.throw(_("Payment Request not found")) + except Exception as e: + frappe.log_error(_("Payment status check failed"), e) + + @frappe.whitelist(allow_guest=True, xss_safe=True) def get_checkout_url(**kwargs): try: From 462f1ca87be08555339d7d5ae55267f117033548 Mon Sep 17 00:00:00 2001 From: David Webb Espiritu Date: Sat, 7 Feb 2026 04:33:09 +0800 Subject: [PATCH 2/2] fix: Import statement --- payments/templates/pages/stripe_checkout.py | 8 +++++--- payments/utils/__init__.py | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/payments/templates/pages/stripe_checkout.py b/payments/templates/pages/stripe_checkout.py index 794cee4ef..9b29c469c 100644 --- a/payments/templates/pages/stripe_checkout.py +++ b/payments/templates/pages/stripe_checkout.py @@ -5,6 +5,7 @@ import frappe from frappe import _ from frappe.utils import cint, fmt_money +from payments.utils import check_payment_status from payments.payment_gateways.doctype.stripe_settings.stripe_settings import ( get_gateway_controller, @@ -34,7 +35,7 @@ def get_context(context): context[key] = frappe.form_dict[key] # Check if payment already completed - if frappe.utils.check_payment_status( + if check_payment_status( context.reference_doctype, context.reference_docname ): @@ -45,6 +46,7 @@ def get_context(context): ) frappe.local.flags.redirect_location = frappe.local.response.location raise frappe.Redirect + gateway_controller = get_gateway_controller( context.reference_doctype, context.reference_docname, context.payment_gateway ) @@ -86,8 +88,8 @@ def get_header_image(doc, gateway_controller): def make_payment(stripe_token_id, data, reference_doctype=None, reference_docname=None, payment_gateway=None): data = json.loads(data) - # Check if payment already completed - if frappe.utils.check_payment_status(reference_doctype, reference_docname): + # Check if payment already completed Redundancy Safeguard + if check_payment_status(reference_doctype, reference_docname): frappe.throw(_('This payment has already been completed')) data.update({"stripe_token_id": stripe_token_id}) diff --git a/payments/utils/__init__.py b/payments/utils/__init__.py index 1a494cb7f..fed2abd5e 100644 --- a/payments/utils/__init__.py +++ b/payments/utils/__init__.py @@ -3,6 +3,7 @@ create_payment_gateway, delete_custom_fields, erpnext_app_import_guard, + check_payment_status, get_payment_gateway_controller, make_custom_fields, )