/**
  * Authorizes payment.
  *
  * @param OrderPaymentInterface $payment
  * @param bool $isOnline
  * @param string|float $amount
  * @return OrderPaymentInterface
  */
 public function authorize(OrderPaymentInterface $payment, $isOnline, $amount)
 {
     // check for authorization amount to be equal to grand total
     /**
      * @var $payment Payment
      */
     $payment->setShouldCloseParentTransaction(false);
     $isSameCurrency = $payment->isSameCurrency();
     if (!$isSameCurrency || !$payment->isCaptureFinal($amount)) {
         $payment->setIsFraudDetected(true);
     }
     // update totals
     $amount = $payment->formatAmount($amount, true);
     $payment->setBaseAmountAuthorized($amount);
     // do authorization
     $order = $payment->getOrder();
     if ($isOnline) {
         // invoke authorization on gateway
         $method = $payment->getMethodInstance();
         $method->setStore($order->getStoreId());
         $method->authorize($payment, $amount);
     }
     $message = $this->stateCommand->execute($payment, $amount, $order);
     // update transactions, order state and add comments
     $transaction = $payment->addTransaction(Transaction::TYPE_AUTH);
     $message = $payment->prependMessage($message);
     $payment->addTransactionCommentsToOrder($transaction, $message);
     return $payment;
 }