diff --git a/payment/payment.classes.inc b/payment/payment.classes.inc
index e60126d..a60a528 100644
--- a/payment/payment.classes.inc
+++ b/payment/payment.classes.inc
@@ -757,8 +757,17 @@ class PaymentMethodController {
    * @throws PaymentValidationException
    */
   function validate(Payment $payment, PaymentMethod $payment_method, $strict) {
+    if (!$payment->currency_code) {
+      throw new PaymentValidationMissingCurrencyException(t('The payment has no currency set.'));
+    }
+
     $currencies = $payment_method->controller->currencies;
 
+    // Confirm the payment's currency is supported.
+    if (!empty($this->currencies) && !isset($this->currencies[$payment->currency_code])) {
+      throw new PaymentValidationUnsupportedCurrencyException(t('The currency is not supported by this payment method.'));
+    }
+
     // Confirm the payment amount is higher than the supported minimum.
     $minimum = isset($currencies[$payment->currency_code]['minimum']) ? $currencies[$payment->currency_code]['minimum'] : PAYMENT_MINIMUM_AMOUNT;
     if ($payment->totalAmount(TRUE) < $minimum) {
@@ -773,11 +782,6 @@ class PaymentMethodController {
         '!maximum' => payment_amount_human_readable($currencies[$payment->currency_code]['maximum'], $payment->currency_code),
       )));
     }
-
-    // Confirm the payment's currency is supported.
-    if (!empty($this->currencies) && !isset($this->currencies[$payment->currency_code])) {
-      throw new PaymentValidationUnsupportedCurrencyException(t('The currency is not supported by this payment method.'));
-    }
   }
 }
 
@@ -1036,6 +1040,11 @@ class PaymentValidationAmountBelowMinimumException extends PaymentValidationExce
 class PaymentValidationAmountExceedsMaximumException extends PaymentValidationException {}
 
 /**
+ * Exception thrown if a payment has no currency set.
+ */
+class PaymentValidationMissingCurrencyException extends PaymentValidationException {}
+  
+/**
  * Exception thrown if a payment uses a currency that is unsupported by a
  * payment method.
  */
diff --git a/payment/tests/payment.test b/payment/tests/payment.test
index 0b65dbb..92fd2ca 100644
--- a/payment/tests/payment.test
+++ b/payment/tests/payment.test
@@ -258,10 +258,23 @@ class PaymentValidationTest extends DrupalWebTestCase {
       'controller' => payment_method_controller_load('PaymentMethodBasicController'),
     ));
     $payment = new Payment(array(
-      'currency_code' => 'EUR',
+      'currency_code' => '',
       'method' => $payment_method,
     ));
 
+    // Test that a payment without a currency code set invalidates.
+    $valid = TRUE;
+    try {
+      $payment->method->validate($payment);
+    }
+    // An exception was thrown during validation.
+    catch (PaymentValidationMissingCurrencyException $e) {
+      $valid = FALSE;
+    }
+    $this->assertFalse($valid, 'PaymentMethodController::validate() invalidates a payment that has no currency set.');
+
+    $payment->currency_code = 'EUR';
+
     // Test that a payment with a total amount below PAYMENT_MINIMUM_AMOUNT
     // invalidates.
     $valid = TRUE;
