Git Product home page Git Product logo

ecommerce-plugin-paygate's Introduction

PayGate payment processor for Open edX

This is a placeholder payment processor for the Ecommerce application from Open edX.

This plugin was bootstraped by eduNEXT and implemented by the NAU FCCN team to work specifically with the Tutor Open edX distribution. The following installation instructions should work wit the tutor-ecommerce plugin, but there is no reason to believe that it shouldn't also work with the Open edX native installation.

This guide is based in the openedx-saferpay README.

Other projects that this project receive inspiration: - https://github.com/epfl-cede/openedx-saferpay - https://github.com/nelc/ecommerce-hyperpay - https://github.com/eduNEXT/ecommerce-extensions/tree/ee25624582c8e42b7eb998fda54358a7025c2dce/ecommerce_extensions/payment/processors - https://github.com/open-craft/ecommerce-paytabs

Tutor

Install the following version of tutor-ecommerce as it contains special code to avoid the usage of discovery service for development purposes:

pip install git+https://github.com/eduNEXT/tutor-ecommerce@nau/v14.0.1#egg=tutor-ecommerce==v14.0.1

Make sure that the ecommerce plugin is enabled:

tutor plugins enable ecommerce

Make sure that the discovery and mfe plugins are disabled:

tutor plugins disable mfe
tutor plugins disable discovery

Add the PayGate payment processor to the Docker image:

tutor config save \
    --set 'ECOMMERCE_EXTRA_PIP_REQUIREMENTS=["https://github.com/fccn/ecommerce-plugin-paygate"]'
tutor images build ecommerce

Then configure your Ecommerce instance to use the PayGate payment processor:

tutor config save --set 'ECOMMERCE_ENABLED_PAYMENT_PROCESSORS=["paygate"]'
tutor config save --set 'ECOMMERCE_EXTRA_PAYMENT_PROCESSOR_CLASSES=["paygate.processor.PayGate"]'
tutor config save --set 'ECOMMERCE_EXTRA_PAYMENT_PROCESSOR_URLS={"paygate": "paygate.urls"}'

Save your PayGate credentials to paygate.yml:

$ cat paygate.yml
paygate:
    access_token: PwdX_XXXX_YYYY
    merchant_code: NAU
    api_checkout_url: https://lab.optimistic.blue/paygateWS/api/CheckOut
    api_checkout_req_timeout_sec: 10 # optional
    api_back_search_transactions: https://lab.optimistic.blue/paygateWS/api/BackOfficeSearchTransactions
    api_back_search_transactions_timeout_seconds: 10 # optional
    api_basic_auth_user: username
    api_basic_auth_pass: password
    cancel_checkout_path: /checkout/cancel-checkout/ # optional
    error_path: /checkout/error/ # optional
    title: PayGate # optional
    payment_types: ["VISA", "MASTERCARD", "AMEX", "PAYPAL", "MBWAY", "REFMB", "DUC"]
$ tutor config save --set "ECOMMERCE_PAYMENT_PROCESSORS=$(cat paygate.yml)"

The `cancel_checkout_path` and `error_path` are optional.

Run initialization scripts:

tutor local quickstart

Enable the PayGate payment backend:

tutor local run ecommerce ./manage.py waffle_switch --create payment_processor_active_paygate on

All payments will then proceed through the PayGate payment processor.

Devstack

Next, it is described the instructions to run the development environmen using the Open edX Devstack.

If you are using some internal FCCN IaaS VM, please use FCCN forked Devstack for that Open edX release.

Troubleshooting

If the service frontend-app-payment didn't start and has this on the docker logs:

sh: 1: fedx-scripts: not found

The reason was because the npm install were raising some error:

Invalid tag name ">=^16.0.0" of package "react@>=^16.0.0": Tags may not have any characters that encodeURIComponent encodes.

To fix run this inside the container:

npm install --legacy-peer-deps

Configuration

To develop using the devstack edit the ecommerce/settings/private.py file add change to:

PAYMENT_PROCESSOR_CONFIG = {
    "edx": {
        "paygate": {
            "access_token": 'PwdX_XXXX_YYYY',
            "merchant_code": "NAU",
            "api_checkout_url": 'https://lab.optimistic.blue/paygateWS/api/CheckOut',
            "api_basic_auth_user": "NAU",
            "api_basic_auth_pass": "APassword",
            "payment_types": ["VISA", "MASTERCARD", "AMEX", "PAYPAL", "MBWAY", "REFMB", "DUC"]
        }
    }
}
PAYMENT_PROCESSORS = ("paygate.processors.PayGate",)
EXTRA_PAYMENT_PROCESSOR_URLS = {"paygate": "paygate.urls"}
OSCAR_DEFAULT_CURRENCY = 'EUR'

LANGUAGE_CODE = "pt"
from django.utils.translation import ugettext_lazy as _
LANGUAGES = (
    ('pt-pt', _('Português')),
    ('en', _('English')),
)
LOGO_URL = "https://lms.nau.edu.pt/static/nau-basic/images/nau_azul.svg"

# Use custom tax strategy
NAU_EXTENSION_OSCAR_STRATEGY_CLASS = "ecommerce_plugin_paygate.strategy.DefaultStrategy"

# Configure tax as 23% used in Portugal
NAU_EXTENSION_TAX_RATE = "0.298701299" # = 0.23/0.77

Clone the repository https://github.com/fccn/ecommerce-plugin-paygate to the src folder of the devstack (the parent src folder of the devstack folder)

Install this plugin inside the ecommerce container:

make dev.shell.ecommerce
pip install -e /edx/src/ecommerce-plugin-paygate

Restart ecommerce application:

make dev.restart-container.ecommerce

On the Open edX Ecommerce user interface it is need to activate the PayGate payment processor. To activate the paygate add switch with the name payment_processor_active_paygate on http://localhost:18130/admin/waffle/switch/.

On ecommerce Django admin site configuration, http://localhost:18130/admin/core/siteconfiguration/1/change/ - disable Microfrontend for Basket Page - replace payment processors from cybersource,paypal to paygate

To run the tests and linting inside the Ecommerce container using Devstack run::
make -C /edx/src/ecommerce-plugin-paygate/ test lint

Callbacks

There are different callbacks that the PayGate uses. The success, cancel and failure callbacks are used to redirect the user after he has payed with success, has cancel the payment inside the PayGate user interface or some error has been raised.

Additionally, there is also a server-to-server callback, the PayGate calls the Ecommerce informing that some payment reference has been payed.

Example of the server callback, change the payment_ref with your basked identification:

curl -d '{"statusCode":"C", "success":"true", "MerchantCode":"NAUFCCN", "returnCode":"ABCDEFGHI", "shortMsg":"Opera%C3%A7%C3%A3o%20bem%20sucedida", "name": "edx", "is_paid": "true", "paymentValue": "1.00", "payment_ref": "EDX-100019"}' -H "Content-Type: application/json" -X POST http://localhost:18130/payment/paygate/callback/server/

VSCode

To make the isort work properly inside the Visual Studio Code, you should add this to your Workspace settings JSON:

"isort.args":["--settings-file", "<path to ecommerce project on host>/.isort.cfg"],

License

This work is licensed under the terms of the GNU Affero General Public License (AGPL).

ecommerce-plugin-paygate's People

Contributors

deimerm avatar igobranco avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ecommerce-plugin-paygate's Issues

IntegrityError in Ecommerce PayGate plugin logs

2024-04-18T11:13:22.376487270+01:00 2024-04-18 10:13:22,374 ERROR 7 [ecommerce.extensions.checkout.mixins] /openedx/ecommerce/./ecommerce/extensions/checkout/mixins.py:321 - Order Failure: Paygate payment was received, but an order for basket [45] could not be placed.
2024-04-18T11:13:22.376537143+01:00 Traceback (most recent call last):
2024-04-18T11:13:22.376558610+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 73, in execute
2024-04-18T11:13:22.376574957+01:00     return self.cursor.execute(query, args)
2024-04-18T11:13:22.376589596+01:00   File "/openedx/venv/lib/python3.8/site-packages/MySQLdb/cursors.py", line 209, in execute
2024-04-18T11:13:22.376620542+01:00     res = self._query(query)
2024-04-18T11:13:22.376633159+01:00   File "/openedx/venv/lib/python3.8/site-packages/MySQLdb/cursors.py", line 315, in _query
2024-04-18T11:13:22.376639972+01:00     db.query(q)
2024-04-18T11:13:22.376649166+01:00   File "/openedx/venv/lib/python3.8/site-packages/MySQLdb/connections.py", line 239, in query
2024-04-18T11:13:22.376661779+01:00     _mysql.connection.query(self, query)
2024-04-18T11:13:22.376673976+01:00 MySQLdb._exceptions.OperationalError: (1048, "Column 'label' cannot be null")
2024-04-18T11:13:22.376690315+01:00
2024-04-18T11:13:22.376699505+01:00 During handling of the above exception, another exception occurred:
2024-04-18T11:13:22.376710545+01:00
2024-04-18T11:13:22.376729291+01:00 Traceback (most recent call last):
2024-04-18T11:13:22.376761235+01:00   File "/openedx/ecommerce/./ecommerce/extensions/checkout/mixins.py", line 71, in create_order
2024-04-18T11:13:22.376774498+01:00     order = self.handle_order_placement(
2024-04-18T11:13:22.376787734+01:00   File "/openedx/ecommerce/./ecommerce/extensions/checkout/mixins.py", line 182, in handle_order_placement
2024-04-18T11:13:22.376798741+01:00     order = self.place_order(
2024-04-18T11:13:22.376809527+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/checkout/mixins.py", line 150, in place_order
2024-04-18T11:13:22.376821181+01:00     self.save_payment_details(order)
2024-04-18T11:13:22.376832444+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/checkout/mixins.py", line 204, in save_payment_details
2024-04-18T11:13:22.376845964+01:00     self.save_payment_sources(order)
2024-04-18T11:13:22.376857564+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/checkout/mixins.py", line 230, in save_payment_sources
2024-04-18T11:13:22.376868414+01:00     source.save()
2024-04-18T11:13:22.376882573+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/payment/abstract_models.py", line 123, in save
2024-04-18T11:13:22.376894200+01:00     super().save(*args, **kwargs)
2024-04-18T11:13:22.376906546+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 739, in save
2024-04-18T11:13:22.376917350+01:00     self.save_base(using=using, force_insert=force_insert,
2024-04-18T11:13:22.376931316+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 776, in save_base
2024-04-18T11:13:22.376944180+01:00     updated = self._save_table(
2024-04-18T11:13:22.376957656+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 881, in _save_table
2024-04-18T11:13:22.376968780+01:00     results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
2024-04-18T11:13:22.376981892+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 919, in _do_insert
2024-04-18T11:13:22.376993379+01:00     return manager._insert(
2024-04-18T11:13:22.377003652+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
2024-04-18T11:13:22.377014795+01:00     return getattr(self.get_queryset(), name)(*args, **kwargs)
2024-04-18T11:13:22.377025995+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/query.py", line 1270, in _insert
2024-04-18T11:13:22.377036019+01:00     return query.get_compiler(using=using).execute_sql(returning_fields)
2024-04-18T11:13:22.377049009+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1416, in execute_sql
2024-04-18T11:13:22.377064889+01:00     cursor.execute(sql, params)
2024-04-18T11:13:22.377077278+01:00   File "/openedx/venv/lib/python3.8/site-packages/sentry_sdk/integrations/django/__init__.py", line 641, in execute
2024-04-18T11:13:22.377087738+01:00     result = real_execute(self, sql, params)
2024-04-18T11:13:22.377101174+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
2024-04-18T11:13:22.377111988+01:00     return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
2024-04-18T11:13:22.377122938+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
2024-04-18T11:13:22.377134282+01:00     return executor(sql, params, many, context)
2024-04-18T11:13:22.377154814+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
2024-04-18T11:13:22.377165498+01:00     return self.cursor.execute(sql, params)
2024-04-18T11:13:22.377177101+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 78, in execute
2024-04-18T11:13:22.377190357+01:00     raise IntegrityError(*tuple(e.args))
2024-04-18T11:13:22.377201683+01:00 django.db.utils.IntegrityError: (1048, "Column 'label' cannot be null")
2024-04-18T11:13:22.434425744+01:00 2024-04-18 10:13:22,429 ERROR 7 [paygate.views] /openedx/venv/lib/python3.8/site-packages/paygate/views.py:195 - PayGate server callback error while creating order for basket [45]
2024-04-18T11:13:22.434498387+01:00 Traceback (most recent call last):
2024-04-18T11:13:22.434516643+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 73, in execute
2024-04-18T11:13:22.434530907+01:00     return self.cursor.execute(query, args)
2024-04-18T11:13:22.434543416+01:00   File "/openedx/venv/lib/python3.8/site-packages/MySQLdb/cursors.py", line 209, in execute
2024-04-18T11:13:22.434561146+01:00     res = self._query(query)
2024-04-18T11:13:22.434573546+01:00   File "/openedx/venv/lib/python3.8/site-packages/MySQLdb/cursors.py", line 315, in _query
2024-04-18T11:13:22.434585946+01:00     db.query(q)
2024-04-18T11:13:22.434598312+01:00   File "/openedx/venv/lib/python3.8/site-packages/MySQLdb/connections.py", line 239, in query
2024-04-18T11:13:22.434892776+01:00     _mysql.connection.query(self, query)
2024-04-18T11:13:22.434906880+01:00 MySQLdb._exceptions.OperationalError: (1048, "Column 'label' cannot be null")
2024-04-18T11:13:22.434924056+01:00
2024-04-18T11:13:22.434936042+01:00 During handling of the above exception, another exception occurred:
2024-04-18T11:13:22.434950189+01:00
2024-04-18T11:13:22.434961569+01:00 Traceback (most recent call last):
2024-04-18T11:13:22.434973525+01:00   File "/openedx/venv/lib/python3.8/site-packages/paygate/views.py", line 193, in post
2024-04-18T11:13:22.434984955+01:00     order = self.create_order(request, basket)
2024-04-18T11:13:22.434996065+01:00   File "/openedx/ecommerce/./ecommerce/extensions/checkout/mixins.py", line 71, in create_order
2024-04-18T11:13:22.435007712+01:00     order = self.handle_order_placement(
2024-04-18T11:13:22.435018845+01:00   File "/openedx/ecommerce/./ecommerce/extensions/checkout/mixins.py", line 182, in handle_order_placement
2024-04-18T11:13:22.435030534+01:00     order = self.place_order(
2024-04-18T11:13:22.435041861+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/checkout/mixins.py", line 150, in place_order
2024-04-18T11:13:22.435052354+01:00     self.save_payment_details(order)
2024-04-18T11:13:22.435062324+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/checkout/mixins.py", line 204, in save_payment_details
2024-04-18T11:13:22.435076634+01:00     self.save_payment_sources(order)
2024-04-18T11:13:22.435087464+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/checkout/mixins.py", line 230, in save_payment_sources
2024-04-18T11:13:22.435098452+01:00     source.save()
2024-04-18T11:13:22.435109662+01:00   File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/payment/abstract_models.py", line 123, in save
2024-04-18T11:13:22.435121814+01:00     super().save(*args, **kwargs)
2024-04-18T11:13:22.435132437+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 739, in save
2024-04-18T11:13:22.435143751+01:00     self.save_base(using=using, force_insert=force_insert,
2024-04-18T11:13:22.435158727+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 776, in save_base
2024-04-18T11:13:22.435170723+01:00     updated = self._save_table(
2024-04-18T11:13:22.435182603+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 881, in _save_table
2024-04-18T11:13:22.435196351+01:00     results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
2024-04-18T11:13:22.435208851+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 919, in _do_insert
2024-04-18T11:13:22.435224407+01:00     return manager._insert(
2024-04-18T11:13:22.435238366+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
2024-04-18T11:13:22.435251100+01:00     return getattr(self.get_queryset(), name)(*args, **kwargs)
2024-04-18T11:13:22.435262936+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/query.py", line 1270, in _insert
2024-04-18T11:13:22.435273870+01:00     return query.get_compiler(using=using).execute_sql(returning_fields)
2024-04-18T11:13:22.435285866+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1416, in execute_sql
2024-04-18T11:13:22.435296776+01:00     cursor.execute(sql, params)
2024-04-18T11:13:22.435308326+01:00   File "/openedx/venv/lib/python3.8/site-packages/sentry_sdk/integrations/django/__init__.py", line 641, in execute
2024-04-18T11:13:22.435318710+01:00     result = real_execute(self, sql, params)
2024-04-18T11:13:22.435329622+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
2024-04-18T11:13:22.435349189+01:00     return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
2024-04-18T11:13:22.435362809+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
2024-04-18T11:13:22.435375385+01:00     return executor(sql, params, many, context)
2024-04-18T11:13:22.435386589+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
2024-04-18T11:13:22.435397375+01:00     return self.cursor.execute(sql, params)
2024-04-18T11:13:22.435437078+01:00   File "/openedx/venv/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 78, in execute
2024-04-18T11:13:22.435448511+01:00     raise IntegrityError(*tuple(e.args))
2024-04-18T11:13:22.435460064+01:00 django.db.utils.IntegrityError: (1048, "Column 'label' cannot be null")

Paygate integration logging error

Error during logging a message on Paygate.

2024-01-25 09:02:58,103 INFO 11 [paygate.processors] /openedx/venv/lib/python3.8/site-packages/paygate/processors.py:531 - PayGate calling 'https://lab.optimistic.blue/paygateWS/api/CheckOut' with payload {'ACCESS_TOKEN': 'd031063d-5bee-44ec-b351-XXXXXX', 'MERCHANT_CODE': 'XXXX', 'IS_RECURRENT': False, 'CLIENT_NAME': 'XXXXX', 'EMAIL': '[email protected]', 'LANGUAGE': 'pt', 'PAYMENT_REF': 'OPENEDX-100029', 'TRANSACTION_DESC': "Seat in Ivo's Sandbox with verified certificate", 'CURRENCY': 'EUR', 'TOTAL_AMOUNT': Decimal('1.00'), 'PAYMENT_TYPES': ['VISA', 'MASTERCARD', 'PAYPAL', 'MBWAY', 'REFMB'], 'CALLBACK_SUCCESS_URL': 'https://ecommerce.dev.nau.fccn.pt/payment/paygate/callback/success/', 'CALLBACK_CANCEL_URL': 'https://ecommerce.dev.nau.fccn.pt/payment/paygate/callback/cancel/', 'CALLBACK_FAILURE_URL': 'https://ecommerce.dev.nau.fccn.pt/payment/paygate/callback/failure/', 'CALLBACK_SERVER_URL': 'https://ecommerce.dev.nau.fccn.pt/payment/paygate/callback/server/', 'CALLBACK_SERVER_PARMS': [{'key': 'course_id', 'value': 'course-v1:FCT+IVOSAND+2021_T2'}]}
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.8/logging/__init__.py", line 1085, in emit
    msg = self.format(record)
  File "/usr/lib/python3.8/logging/__init__.py", line 929, in format
    return fmt.format(record)
  File "/usr/lib/python3.8/logging/__init__.py", line 668, in format
    record.message = record.getMessage()
  File "/usr/lib/python3.8/logging/__init__.py", line 373, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not NoneType
Call stack:
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/wsgi.py", line 133, in __call__
    response = self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 130, in get_response
    response = self._middleware_chain(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/edx_django_utils/monitoring/internal/middleware.py", line 41, in __call__
    response = self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/oscar/apps/basket/middleware.py", line 61, in __call__
    response = self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/crum/__init__.py", line 97, in __call__
    response = self.get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/openedx/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/openedx/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/openedx/venv/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/openedx/ecommerce/./ecommerce/extensions/api/v2/views/checkout.py", line 60, in post
    parameters = payment_processor.get_transaction_parameters(basket, request=request)
  File "/openedx/venv/lib/python3.8/site-packages/paygate/processors.py", line 351, in get_transaction_parameters
    logger.info(
Message: 'PayGate payment: basket=%d obtained paygate payment id=%d'
Arguments: (29, None)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.