public static function authorize(AmzPayments $amz_payments, $service, $order_ref, $amount, $currency_code = 'EUR', $timeout = 1440, $comment = '')
 {
     if ($currency_code == '0') {
         $currency_code = 'EUR';
     }
     $authorize_request = new OffAmazonPaymentsService_Model_AuthorizeRequest();
     $authorize_request->setAmazonOrderReferenceId($order_ref);
     $authorize_request->setSellerId($amz_payments->merchant_id);
     $authorize_request->setTransactionTimeout($timeout);
     $authorize_request->setSoftDescriptor($comment);
     if ($amz_payments->capture_mode == 'after_auth') {
         $authorize_request->setCaptureNow(true);
     }
     if ($amz_payments->provocation == 'hard_decline' && $amz_payments->environment == 'SANDBOX') {
         $authorize_request->setSellerAuthorizationNote('{"SandboxSimulation": {"State":"Declined", "ReasonCode":"AmazonRejected"}}');
     }
     if ($amz_payments->provocation == 'soft_decline' && $amz_payments->environment == 'SANDBOX') {
         Context::getContext()->cookie->setHadErrorNowWallet = 1;
         $authorize_request->setSellerAuthorizationNote('{"SandboxSimulation": {"State":"Declined", "ReasonCode":"InvalidPaymentMethod", "PaymentMethodUpdateTimeInMins":2}}');
     }
     $authorize_request->setAuthorizationReferenceId(self::getNextAuthRef($order_ref));
     $authorize_request->setAuthorizationAmount(new OffAmazonPaymentsService_Model_Price());
     $authorize_request->getAuthorizationAmount()->setAmount($amount);
     $authorize_request->getAuthorizationAmount()->setCurrencyCode($currency_code);
     try {
         $response = $service->authorize($authorize_request);
         $details = $response->getAuthorizeResult()->getAuthorizationDetails();
         $sql_arr = array('amz_tx_order_reference' => pSQL($order_ref), 'amz_tx_type' => 'auth', 'amz_tx_time' => pSQL(time()), 'amz_tx_expiration' => pSQL(strtotime($details->getExpirationTimestamp())), 'amz_tx_amount' => pSQL($amount), 'amz_tx_status' => pSQL($details->getAuthorizationStatus()->getState()), 'amz_tx_reference' => pSQL($details->getAuthorizationReferenceId()), 'amz_tx_amz_id' => pSQL($details->getAmazonAuthorizationId()), 'amz_tx_last_change' => pSQL(time()), 'amz_tx_last_update' => pSQL(time()));
         Db::getInstance()->insert('amz_transactions', $sql_arr);
     } catch (OffAmazonPaymentsService_Exception $e) {
         echo 'ERROR: ' . $e->getMessage();
     }
     return $response;
 }
Example #2
0
	/**
	 * @param $client
	 * @param $cart
	 * @param $order
	 */
	private function getAuthorization ($client, $cart, $order, $redirect = true) {
		$shouldRetry = false;
		$retries = 0;

		$this->loadAmazonClass('OffAmazonPaymentsService_Model_AuthorizeRequest');
		$this->loadAmazonClass('OffAmazonPaymentsService_Model_Price');
		$this->loadHelperClass('amazonHelperAuthorizeResponse');
		do {
			$authorizeRequest = new OffAmazonPaymentsService_Model_AuthorizeRequest();
			$authorizeRequest->setAmazonOrderReferenceId($this->_amazonOrderReferenceId);
			$authorizeRequest->setSellerId($this->_currentMethod->sellerId);

			$authorizeRequest->setAuthorizationReferenceId($this->_order_number);
			$authorizeRequest->setSellerAuthorizationNote($this->getSellerAuthorizationNote());
			$authorizeRequest->setTransactionTimeout($this->getAuthorizationTransactionTimeout());
			// directly do the capture without the need to call the Capture Request
			if ($this->isCaptureImmediate($cart)) {
				$authorizeRequest->setCaptureNow(true);
			} else {
				$authorizeRequest->setCaptureNow(false);
			}
			$authorizeRequest->setAuthorizationAmount(new OffAmazonPaymentsService_Model_Price());

			$authorizeRequest->getAuthorizationAmount()->setAmount($this->getTotalInPaymentCurrency($client, $this->_amount, $this->getCurrencyId($client)));
			$authorizeRequest->getAuthorizationAmount()->setCurrencyCode($this->getCurrencyCode3($client));

			try {
				$authorizeResponse = $client->authorize($authorizeRequest);
				$amazonAuthorizationId = $authorizeResponse->getAuthorizeResult()->getAuthorizationDetails()->getAmazonAuthorizationId();
				//$this->debugLog("ERREUR<pre>" . var_export($authorizeRequest, true) . "</pre>", __FUNCTION__, 'debug');
				//$this->debugLog("ERREUR<pre>" . var_export($authorizeResponse, true) . "</pre>", __FUNCTION__, 'debug');

			} catch (Exception $e) {
				$msg = "An exception was thrown when trying to do the authorization:" . $e->getMessage() . "\n" . $e->getTraceAsString();
				while ($e = $e->getPrevious()) {
					$msg .= ("Caused by: " . $e->getMessage() . "\n" . $e->getTraceAsString() . "");
					$msg .= "\n";
				}
				if ($redirect) {
					$cart->setOutOfCheckout();
					$this->debugLog($msg, __FUNCTION__ . " Exception", 'error');

					$this->amazonError(__FUNCTION__ . ' ' . $msg);
					$this->redirectToCart(vmText::_('VMPAYMENT_AMAZON_SELECT_ANOTHER_PAYMENT'), true);
				}

				return false;
			}
			if ($authorizationDetails =$this->getAuthorizeDetailsFromAuthorizeResponse($authorizeResponse)) {
				$this->updateAuthorizeBillingAddressInOrder($authorizationDetails, $order);
			}


			$amazonHelperAuthorizeResponse = new amazonHelperAuthorizeResponse($authorizeResponse, $this->_currentMethod);
			$amazonState = $amazonHelperAuthorizeResponse->onResponseUpdateOrderHistory($order);

			$storeInternalData = $amazonHelperAuthorizeResponse->getStoreInternalData();
			$this->storeAmazonInternalData($order, $authorizeRequest, $authorizeResponse, NULL, $this->renderPluginName($this->_currentMethod), $storeInternalData);

			$reasonCode = $authorizeResponse->getAuthorizeResult()->getAuthorizationDetails()->getAuthorizationStatus()->getReasonCode();
			if ($redirect) {
				if ($amazonState == 'Declined' && $reasonCode == 'InvalidPaymentMethod' && $this->_currentMethod->soft_decline) {
					$this->incrementRetryInvalidPaymentMethodInSession();
					return false;

				} elseif (($amazonState == 'Open' && $reasonCode == 'AmazonRejected') or ($amazonState == 'Declined' && $reasonCode == 'TransactionTimedOut')) {
					if ($retries < 2) {
						$shouldRetry = true;
						$retries++;
					} else {
						$cart->setOutOfCheckout();
						$this->leaveAmazonCheckout();
						$this->redirectToCart(vmText::_('VMPAYMENT_AMAZON_SELECT_ANOTHER_PAYMENT'), true);
					}

				} elseif ($amazonState == 'Declined') {
					$cart->setOutOfCheckout();
					$this->leaveAmazonCheckout();
					$this->redirectToCart(vmText::_('VMPAYMENT_AMAZON_SELECT_ANOTHER_PAYMENT'), true);
				}
			}

		} while ($shouldRetry and $redirect);


		return $amazonAuthorizationId;
	}