Commit f409cf0d by Marko Jevtić Committed by GitHub

Merge pull request #1025 from edx/mjevtic/SOL-1955

[SOL-1955] Add interstitial for CyberSource payments
parents 80141cec 9d1f8188
import json import json
from django.conf import settings
from django.core import mail from django.core import mail
import httpretty import httpretty
from oscar.test import factories from oscar.test import factories
...@@ -11,6 +10,7 @@ from ecommerce.core.tests import toggle_switch ...@@ -11,6 +10,7 @@ from ecommerce.core.tests import toggle_switch
from ecommerce.courses.tests.factories import CourseFactory from ecommerce.courses.tests.factories import CourseFactory
from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin
from ecommerce.extensions.checkout.signals import send_course_purchase_email from ecommerce.extensions.checkout.signals import send_course_purchase_email
from ecommerce.extensions.checkout.utils import get_receipt_page_url
from ecommerce.tests.testcases import TestCase from ecommerce.tests.testcases import TestCase
LOGGER_NAME = 'ecommerce.extensions.checkout.signals' LOGGER_NAME = 'ecommerce.extensions.checkout.signals'
...@@ -89,8 +89,9 @@ class SignalTests(CourseCatalogTestMixin, TestCase): ...@@ -89,8 +89,9 @@ class SignalTests(CourseCatalogTestMixin, TestCase):
credit_hours=2, credit_hours=2,
credit_provider_name=credit_provider_name, credit_provider_name=credit_provider_name,
platform_name=self.site.name, platform_name=self.site.name,
receipt_url=self.site.siteconfiguration.build_ecommerce_url( receipt_url=get_receipt_page_url(
'{}?order_number={}'.format(settings.RECEIPT_PAGE_PATH, order.number) order_number=order.number,
site_configuration=order.site.siteconfiguration
) )
) )
) )
......
...@@ -39,3 +39,8 @@ class PCIViolation(PaymentError): ...@@ -39,3 +39,8 @@ class PCIViolation(PaymentError):
If we are raising this exception BAD things are happening, and the service MUST be taken offline IMMEDIATELY! If we are raising this exception BAD things are happening, and the service MUST be taken offline IMMEDIATELY!
""" """
pass pass
class InvalidBasketError(PaymentError):
""" Payment was made for an invalid basket. """
pass
...@@ -7,6 +7,7 @@ import uuid ...@@ -7,6 +7,7 @@ import uuid
from decimal import Decimal from decimal import Decimal
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse
from oscar.apps.payment.exceptions import UserCancelled, GatewayError, TransactionDeclined from oscar.apps.payment.exceptions import UserCancelled, GatewayError, TransactionDeclined
from oscar.core.loading import get_model from oscar.core.loading import get_model
from suds.client import Client from suds.client import Client
...@@ -15,7 +16,6 @@ from suds.wsse import Security, UsernameToken ...@@ -15,7 +16,6 @@ from suds.wsse import Security, UsernameToken
from ecommerce.core.constants import ISO_8601_FORMAT from ecommerce.core.constants import ISO_8601_FORMAT
from ecommerce.core.url_utils import get_ecommerce_url from ecommerce.core.url_utils import get_ecommerce_url
from ecommerce.extensions.checkout.utils import get_receipt_page_url
from ecommerce.extensions.payment.constants import CYBERSOURCE_CARD_TYPE_MAP from ecommerce.extensions.payment.constants import CYBERSOURCE_CARD_TYPE_MAP
from ecommerce.extensions.payment.exceptions import ( from ecommerce.extensions.payment.exceptions import (
InvalidSignatureError, InvalidCybersourceDecision, PartialAuthorizationError, PCIViolation, InvalidSignatureError, InvalidCybersourceDecision, PartialAuthorizationError, PCIViolation,
...@@ -152,9 +152,8 @@ class Cybersource(BasePaymentProcessor): ...@@ -152,9 +152,8 @@ class Cybersource(BasePaymentProcessor):
'amount': str(basket.total_incl_tax), 'amount': str(basket.total_incl_tax),
'currency': basket.currency, 'currency': basket.currency,
'consumer_id': basket.owner.username, 'consumer_id': basket.owner.username,
'override_custom_receipt_page': get_receipt_page_url( 'override_custom_receipt_page': site.siteconfiguration.build_ecommerce_url(
order_number=basket.order_number, reverse('cybersource_redirect')
site_configuration=site.siteconfiguration
), ),
'override_custom_cancel_page': self.cancel_page_url, 'override_custom_cancel_page': self.cancel_page_url,
} }
......
...@@ -171,8 +171,11 @@ class PaypalTests(PaypalMixin, PaymentProcessorTestCaseMixin, TestCase): ...@@ -171,8 +171,11 @@ class PaypalTests(PaypalMixin, PaymentProcessorTestCaseMixin, TestCase):
""" """
Ensures that when the otto_receipt_page waffle switch is enabled, the processor uses the new receipt page. Ensures that when the otto_receipt_page waffle switch is enabled, the processor uses the new receipt page.
""" """
self.toggle_ecommerce_receipt_page(True) self.site.siteconfiguration.enable_otto_receipt_page = True
assert self._get_receipt_url() == self.site.siteconfiguration.build_ecommerce_url(settings.RECEIPT_PAGE_PATH) self.assertEqual(
self._get_receipt_url(),
self.site.siteconfiguration.build_ecommerce_url(settings.RECEIPT_PAGE_PATH)
)
def test_switch_disabled_lms_url(self): def test_switch_disabled_lms_url(self):
""" """
......
""" Payment-related URLs """ """ Payment-related URLs """
from django.conf.urls import url from django.conf.urls import url
from ecommerce.extensions.payment.views.cybersource import CybersourceNotifyView, CybersourceSubmitView from ecommerce.extensions.payment.views import cybersource, PaymentFailedView
from ecommerce.extensions.payment.views.paypal import PaypalPaymentExecutionView, PaypalProfileAdminView from ecommerce.extensions.payment.views.paypal import PaypalPaymentExecutionView, PaypalProfileAdminView
urlpatterns = [ urlpatterns = [
url(r'^cybersource/notify/$', CybersourceNotifyView.as_view(), name='cybersource_notify'), url(r'^cybersource/notify/$', cybersource.CybersourceNotifyView.as_view(), name='cybersource_notify'),
url(r'^cybersource/submit/$', CybersourceSubmitView.as_view(), name='cybersource_submit'), url(r'^cybersource/redirect/$', cybersource.CybersourceInterstitialView.as_view(), name='cybersource_redirect'),
url(r'^cybersource/submit/$', cybersource.CybersourceSubmitView.as_view(), name='cybersource_submit'),
url(r'^error/$', PaymentFailedView.as_view(), name='payment_error'),
url(r'^paypal/execute/$', PaypalPaymentExecutionView.as_view(), name='paypal_execute'), url(r'^paypal/execute/$', PaypalPaymentExecutionView.as_view(), name='paypal_execute'),
url(r'^paypal/profiles/$', PaypalProfileAdminView.as_view(), name='paypal_profiles'), url(r'^paypal/profiles/$', PaypalProfileAdminView.as_view(), name='paypal_profiles'),
] ]
from django.core.urlresolvers import reverse
from django.views.generic import TemplateView
class PaymentFailedView(TemplateView):
template_name = 'checkout/payment_error.html'
def get_context_data(self, **kwargs):
context = super(PaymentFailedView, self).get_context_data(**kwargs)
context.update({
'basket_url': reverse('basket:summary'),
'payment_support_email': self.request.site.siteconfiguration.payment_support_email
})
return context
{% extends 'edx/base.html' %}
{% load i18n %}
{% load staticfiles %}
{% block title %}
{% trans "Payment Failed" %}
{% endblock title %}
{% block navbar %}
{% include 'edx/partials/_student_navbar.html' %}
{% endblock navbar %}
{% block content %}
<div class="container content-wrapper receipt-cancel-error">
<h1>{% trans "Payment Failed" %}</h1>
<p>
{% blocktrans %}
A system error occurred while processing your payment. <strong>You have not been charged.</strong>
{% endblocktrans %}</p>
<p>
{% with "<a class='nav-link' href='mailto:"|add:payment_support_email|add:"'>"|safe as start_link %}
{% blocktrans with end_link="</a>"|safe %}
Please wait a few minutes and then try again. For help, contact {{ start_link }}{{ payment_support_email }}{{ end_link }}.
{% endblocktrans %}
{% endwith %}
</p>
<p>
{% with "<a class='nav-link' href='|add:basket_url|add:'>"|safe as start_link %}
{% blocktrans with end_link="</a>"|safe %}
To try again, visit the {{ start_link }}basket page{{ end_link }}.
{% endblocktrans %}
{% endwith %}
</p>
</div>
{% endblock content %}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment