diff --git a/js/commmerce_authnet.form.js b/js/commmerce_authnet.form.js
index f6dec8f..b751c87 100644
--- a/js/commmerce_authnet.form.js
+++ b/js/commmerce_authnet.form.js
@@ -1,6 +1,6 @@
 /**
  * @file
- * Javascript to generate Stripe token in PCI-compliant way.
+ * Javascript to generate Authorize.Net token in PCI-compliant way.
  */
 
 (function ($, Drupal, drupalSettings) {
@@ -8,7 +8,7 @@
   'use strict';
 
   /**
-   * Attaches the coomerceAuthorizwNet behavior.
+   * Attaches the commerceAuthorizeNetForm behavior.
    * @type {{attach: Drupal.behaviors.commerceAuthorizeNetForm.attach}}
    */
   Drupal.behaviors.commerceAuthorizeNetForm = {
@@ -95,14 +95,10 @@
       var responseHandler = function (response) {
         if (response.messages.resultCode === 'Error') {
           for (var i = 0; i < response.messages.message.length; i++) {
-            console.log(response.messages.message[i].code + ': ' + response.messages.message[i].text);
+            errorDisplay(response.messages.message[i].text);
           }
-          alert('acceptJS library error!');
-          event.preventDefault();
         }
         else {
-          console.log(response);
-          console.log(response.opaqueData);
           processTransactionDataFromAnet(response.opaqueData);
         }
       };
@@ -115,8 +111,8 @@
         $('.accept-js-data-month', $form).val(expiration.month);
         $('.accept-js-data-year', $form).val(expiration.year);
 
-        // Clear out the values so they don't get posted to Drupal. They would never be used, but for PCI complaince
-        // we should never send them at all.
+        // Clear out the values so they don't get posted to Drupal. They would
+        // never be used, but for PCI compliance we should never send them.
         $('#credit-card-number').val('');
         $('#expiration-month').val('');
         $('#expiration-year').val('');
@@ -126,6 +122,17 @@
         $form.get(0).submit();
       };
 
+      // Helper for displaying the error messages within the form.
+      var errorDisplay = function (error_message) {
+        // Display the message error in the payment form.
+        var errors = $form.find('#payment-errors');
+        errors.html(Drupal.theme('commerceAuthorizeNetError', error_message));
+        $('html, body').animate({ scrollTop: errors.offset().top });
+
+        // Allow the customer to re-submit the form.
+        $form.find('button').prop('disabled', false);
+      };
+
       // Form submit
       $form.on('submit', function (event) {
         // Disable the submit button to prevent repeated clicks.
diff --git a/src/PluginForm/AuthorizeNet/PaymentMethodAddForm.php b/src/PluginForm/AuthorizeNet/PaymentMethodAddForm.php
index 5618e56..1194909 100644
--- a/src/PluginForm/AuthorizeNet/PaymentMethodAddForm.php
+++ b/src/PluginForm/AuthorizeNet/PaymentMethodAddForm.php
@@ -79,6 +79,13 @@ class PaymentMethodAddForm extends BasePaymentMethodAddForm {
       '#markup' => '<div id="cvv-element" class="accept-js-form-element"></div>',
     ];
 
+    // To display validation errors.
+    $element['payment_errors'] = [
+      '#type' => 'markup',
+      '#markup' => '<div id="payment-errors"></div>',
+      '#weight' => -200,
+    ];
+
     // Populated by the JS library after receiving a response from AuthorizeNet.
     $element['data_descriptor'] = [
       '#type' => 'hidden',
