diff --git a/js/commerce_authnet.form.js b/js/commerce_authnet.form.js
index 2a5b074..7a5dec5 100644
--- a/js/commerce_authnet.form.js
+++ b/js/commerce_authnet.form.js
@@ -23,15 +23,24 @@
 
       // AcceptJS hijacks all submit buttons for this form. Simulate the back
       // button to make sure back submit still works.
-      $('.checkout-cancel, .checkout-back').bind('mousedown, click', function(e) {
+      $('.checkout-cancel, .checkout-back').bind('mousedown, click', function (e) {
         e.preventDefault();
         window.history.back();
       });
+
+      $('.acceptjs-form input').bind('invalid', function (e) {
+          // commerce_checkout.js duplicates the input button on submit, hides
+          // one of them, and disables the other.  We need to re-enable the
+          // disabled one.
+          $form.find('input[disabled=disabled]').prop('disabled', false);
+        }
+      );
     },
     detach: function (context, settings) {
       var $form = $('.acceptjs-form').closest('form');
       $form.removeOnce('acceptjs-processed');
       $form.unbind('submit.authnet');
+      $('.acceptjs-form input').unbind('invalid');
     }
   };
   Drupal.commerceAuthorizeNet = {
@@ -41,10 +50,13 @@
       // 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 });
+      $('html, body').animate({scrollTop: errors.offset().top});
 
       // Allow the customer to re-submit the form.
       $form.find('button').prop('disabled', false);
+      // If they aren't using 'button' but instead have input submit, clear that
+      // elements disabled stat as well.
+      $form.find('input[type=submit]:disabled').prop('disabled', false);
     }
   };
 
