timeOut was set to > 0 * if synchronous mode=> timeOut ==0 * -- if InvalidPaymentMethod and asynchronous mode, the state= suspended ==> send an email * -- if InvalidPaymentMethod and synchronous mode: return to cart, redisplay wallet widget * -- AmazonRejected: if state == open, then retry authorization, else Declined * -- Processing failure: retry the request in 2 minutes ??? * -- * @return mixed */ function onNotificationUpdateOrderHistory($order, $payments) { $order_history = array(); $amazonState = ""; $reasonCode = ""; // get Old amazon State $lastPayment = end($payments); $previousAmazonState = $lastPayment->amazon_response_state; if (!$this->amazonData->isSetAuthorizationDetails()) { return false; } $authorizationDetails = $this->amazonData->getAuthorizationDetails(); if (!$authorizationDetails->isSetAuthorizationStatus()) { return false; } $authorizationStatus = $authorizationDetails->getAuthorizationStatus(); if (!$authorizationStatus->isSetState()) { return false; } $amazonState = $authorizationStatus->getState(); // In synchronous Mode, order history has been updated by the Authorization Response // Other notifications may be received, but they are more informative: MaxCapturesProcessed if the FULL amount Capture has been done if ($authorizationStatus->isSetReasonCode()) { $reasonCode = $authorizationStatus->getReasonCode(); } $order_history['customer_notified'] = 0; if ($amazonState != $previousAmazonState) { if ($amazonState == 'Open') { $order_history['order_status'] = $this->_currentMethod->status_authorization; $order_history['comments'] = vmText::_('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_OPEN'); } elseif ($amazonState == 'Declined') { $order_history['customer_notified'] = 1; if ($reasonCode == 'InvalidPaymentMethod') { if ($this->_currentMethod->soft_decline == 'soft_decline_enabled') { $order_history['comments'] = $this->getSoftDeclinedComment(); $order_history['order_status'] = $this->_currentMethod->status_orderconfirmed; } else { $order_history['comments'] = vmText::sprintf('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_INVALIDPAYMENTMETHOD', $reasonCode); $order_history['order_status'] = $this->_currentMethod->status_cancel; } } elseif ($reasonCode == 'AmazonRejected') { $order_history['customer_notified'] = 1; $order_history['order_status'] = $this->_currentMethod->status_cancel; $order_history['comments'] = vmText::sprintf('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_DECLINED', $reasonCode); } elseif ($reasonCode == 'TransactionTimedOut') { // TODO retry the authorization again $order_history['order_status'] = $this->_currentMethod->status_cancel; $order_history['comments'] = vmText::sprintf('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_DECLINED', $reasonCode); } } elseif ($amazonState == 'Pending') { $order_history['order_status'] = $this->_currentMethod->status_orderconfirmed; $order_history['comments'] = vmText::_('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_PENDING'); $order_history['customer_notified'] = 0; } elseif ($amazonState == 'Closed') { if ($reasonCode == 'MaxCapturesProcessed' and $this->isCaptureNow()) { $order_history['order_status'] = $this->_currentMethod->status_capture; $order_history['comments'] = vmText::_('VMPAYMENT_AMAZON_COMMENT_STATUS_CAPTURE_NOTIFICATION'); $order_history['customer_notified'] = 0; } else { $order_history['order_status'] = $this->_currentMethod->status_cancel; $order_history['comments'] = vmText::sprintf('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_CLOSED', $reasonCode); $order_history['customer_notified'] = 0; } } $orderModel = VmModel::getModel('orders'); $orderModel->updateStatusForOneOrder($order['details']['BT']->virtuemart_order_id, $order_history, false); } return $amazonState; } private function getSoftDeclinedComment() { if (!class_exists('VirtueMartModelVendor')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'vendor.php'); } $virtuemart_vendor_id = 1; $vendorModel = VmModel::getModel('vendor'); $vendor = $vendorModel->getVendor($virtuemart_vendor_id); $vendorModel->setId($virtuemart_vendor_id); $vendorFields = $vendorModel->getVendorAddressFields($virtuemart_vendor_id); $vendorEmail = $vendorFields['fields']['email']['value']; if (isset($vendorFields['fields']['phone_1']['value'])) { $vendorPhone = $vendorFields['fields']['phone_1']['value']; } else { $vendorPhone = ""; } return vmText::sprintf('VMPAYMENT_AMAZON_COMMENT_STATUS_AUTHORIZATION_INVALIDPAYMENTMETHOD_SOFT_DECLINED', $vendor->vendor_store_name, $vendorEmail, $vendorPhone); } private function isSynchronousMode() { if (($this->_currentMethod->erp_mode == "erp_mode_disabled" AND $this->_currentMethod->authorization_mode_erp_disabled == "automatic_synchronous") or ($this->_currentMethod->erp_mode == "erp_mode_enabled" AND $this->_currentMethod->authorization_mode_erp_enabled == "automatic_synchronous") ) { return true; } return false; } public function getStoreInternalData() { //$amazonInternalData = $this->getStoreResultParams(); $amazonInternalData = new stdClass(); if ($this->amazonData->isSetAuthorizationDetails()) { $authorizationDetails = $this->amazonData->getAuthorizationDetails(); if ($authorizationDetails->isSetAmazonAuthorizationId()) { $amazonInternalData->amazon_response_amazonAuthorizationId = $authorizationDetails->getAmazonAuthorizationId(); } if ($authorizationDetails->isSetAuthorizationStatus()) { $authorizationStatus = $authorizationDetails->getAuthorizationStatus(); if ($authorizationStatus->isSetState()) { $amazonInternalData->amazon_response_state = $authorizationStatus->getState(); } if ($authorizationStatus->isSetReasonCode()) { $amazonInternalData->amazon_response_reasonCode = $authorizationStatus->getReasonCode(); } if ($authorizationStatus->isSetReasonDescription()) { $amazonInternalData->amazon_response_reasonDescription = $authorizationStatus->getReasonDescription(); } } } return $amazonInternalData; } /** * move to Pending =>GetAuthorizationDetails, closeAuthorization * move to Open => GetAuthorizationDetails, capture, closeAuthorization * move to Declined => GetAuthorizationDetails * move to Closed => GetAuthorizationDetails * @param $order * @param $payments * @param $amazonState * @return bool|string */ public function onNotificationNextOperation($order, $payments, $amazonState) { $getAuthorizationDetailsState = array('Pending', 'Open', 'Closed'); $cancelPaymentState = array('Declined'); if (in_array($amazonState, $getAuthorizationDetailsState)) { return 'onNotificationGetAuthorizationDetails'; } elseif (in_array($amazonState, $cancelPaymentState)) { return 'cancelPayment'; } return false; } public function getReferenceId() { if ($this->amazonData->isSetAuthorizationDetails()) { $authorizationDetails = $this->amazonData->getAuthorizationDetails(); if ($authorizationDetails->isSetAuthorizationReferenceId()) { return $authorizationDetails->getAuthorizationReferenceId(); } } return NULL; } public function getAmazonId() { if ($this->amazonData->isSetAuthorizationDetails()) { $authorizationDetails = $this->amazonData->getAuthorizationDetails(); if ($authorizationDetails->isSetAmazonAuthorizationId()) { return $authorizationDetails->getAmazonAuthorizationId(); } } return NULL; } public function isCaptureNow() { $authorizationDetails = $this->amazonData->getAuthorizationDetails(); if ($authorizationDetails->isSetCaptureNow()) { return $authorizationDetails->getCaptureNow(); } return false; } public function getAmazonAuthorizationId() { return $this->amazonData->getAuthorizationDetails()->getAmazonAuthorizationId(); } public function getContents() { $contents = $this->tableStart("Authorization Notification"); if ($this->amazonData->isSetAuthorizationDetails()) { $contents .= $this->getRowFirstCol("AuthorizeDetails"); $authorizationDetails = $this->amazonData->getAuthorizationDetails(); if ($authorizationDetails->isSetAmazonAuthorizationId()) { $contents .= $this->getRow("AmazonAuthorizationId: ", $authorizationDetails->getAmazonAuthorizationId()); } if ($authorizationDetails->isSetAuthorizationReferenceId()) { $contents .= $this->getRow("AuthorizationReferenceId: ", $authorizationDetails->getAuthorizationReferenceId()); } if ($authorizationDetails->isSetAuthorizationAmount()) { $more = ''; $authorizationAmount = $authorizationDetails->getAuthorizationAmount(); if ($authorizationAmount->isSetAmount()) { $more .= "Amount: " . $authorizationAmount->getAmount() . "
"; } if ($authorizationAmount->isSetCurrencyCode()) { $more .= "CurrencyCode: " . $authorizationAmount->getCurrencyCode() . "
"; } $contents .= $this->getRow("AuthorizationAmount: ", $more); } if ($authorizationDetails->isSetCapturedAmount()) { $more = ''; $capturedAmount = $authorizationDetails->getCapturedAmount(); if ($capturedAmount->isSetAmount()) { $more .= "Amount: " . $capturedAmount->getAmount() . "
"; } if ($capturedAmount->isSetCurrencyCode()) { $more .= "CurrencyCode: " . $capturedAmount->getCurrencyCode() . "
"; } $contents .= $this->getRow("CapturedAmount: ", $more); } if ($authorizationDetails->isSetAuthorizationFee()) { $more = ''; $authorizationFee = $authorizationDetails->getAuthorizationFee(); if ($authorizationFee->isSetAmount()) { $more .= "Amount: " . $authorizationFee->getAmount() . "
"; } if ($authorizationFee->isSetCurrencyCode()) { $more .= "CurrencyCode: " . $authorizationFee->getCurrencyCode() . "
"; } $contents .= $this->getRow("AuthorizationFee: ", $more); } if ($authorizationDetails->isSetIdList()) { $idList = $authorizationDetails->getIdList(); $memberList = $idList->getId(); $more = ''; foreach ($memberList as $member) { $more .= "
member: " . $member; } $contents .= $this->getRow("IdList: ", $more); } if ($authorizationDetails->isSetCreationTimestamp()) { $contents .= $this->getRow("CreationTimestamp: ", $authorizationDetails->getCreationTimestamp()); } if ($authorizationDetails->isSetExpirationTimestamp()) { $contents .= $this->getRow("ExpirationTimestamp: ", $authorizationDetails->getExpirationTimestamp()); } if ($authorizationDetails->isSetAuthorizationStatus()) { $authorizationStatus = $authorizationDetails->getAuthorizationStatus(); $more = ''; if ($authorizationStatus->isSetState()) { $more .= "State: " . $authorizationStatus->getState() . "
"; } if ($authorizationStatus->isSetLastUpdateTimestamp()) { $more .= "LastUpdateTimestamp: " . $authorizationStatus->getLastUpdateTimestamp() . "
"; } if ($authorizationStatus->isSetReasonCode()) { $more .= "ReasonCode: " . $authorizationStatus->getReasonCode() . "
"; } if ($authorizationStatus->isSetReasonDescription()) { $more .= "ReasonDescription: " . $authorizationStatus->getReasonDescription() . "
"; } $contents .= $this->getRow("AuthorizationStatus", $more); } if ($authorizationDetails->isSetOrderItemCategories()) { $orderItemCategories = $authorizationDetails->getOrderItemCategories(); $orderItemCategoryList = $orderItemCategories->getOrderItemCategory(); $more = ''; foreach ($orderItemCategoryList as $orderItemCategory) { $more .= "OrderItemCategory: " . $orderItemCategory . "
"; } $contents .= $this->getRow("OrderItemCategories", $more); } if ($authorizationDetails->isSetCaptureNow()) { $contents .= $this->getRow("CaptureNow", $authorizationDetails->getCaptureNow()); } if ($authorizationDetails->isSetSoftDescriptor()) { $contents .= $this->getRow("SoftDescriptor", $authorizationDetails->getSoftDescriptor()); } } $contents .= $this->tableEnd(); return $contents; } }