/** * * @param string $message * @param int $code * @throws Creativestyle_CheckoutByAmazon_Exception */ public function throwException($message, $code = 0, $params = array()) { $exception = Mage::exception('Creativestyle_CheckoutByAmazon', $message, $code); if (!$this->isExceptionLoggingLocked()) { Creativestyle_CheckoutByAmazon_Model_Logger::logException($message, $code ? $code : 0, $exception->getTraceAsString(), isset($params['area']) ? $params['area'] : 'General', isset($params['request_id']) ? $params['request_id'] : null, isset($params['orders']) ? $params['orders'] : null); } throw $exception; }
public function saveOrderAction() { if ($this->_expireAjax()) { return; } $result = array(); try { Mage::helper('checkoutbyamazon')->lockExceptionLogging(); if ($requiredAgreements = Mage::helper('checkout')->getRequiredAgreementIds()) { $postedAgreements = array_keys($this->getRequest()->getPost('agreement', array())); if ($diff = array_diff($requiredAgreements, $postedAgreements)) { $result['success'] = false; $result['error'] = true; $result['error_messages'] = $this->__('Please agree to all Terms and Conditions before placing the order.'); $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); return; } } Mage::getSingleton('customer/session')->getCustomer()->setId(null)->setGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID)->setEmail($this->_getOnepage()->getQuote()->getBillingAddress()->getEmail()); $this->_getOnepage()->getQuote()->getPayment()->importData($this->_getPaymentMethod()); $this->_getOnepage()->getQuote()->setCustomerIsGuest(true)->save(); $this->_getOnepage()->saveOrder(); $lastOrderId = $this->_getOnepage()->getCheckout()->getLastOrderId(); $order = Mage::getModel('sales/order')->load($lastOrderId); // unsuccesful order save if (!$order->getId()) { Mage::helper('checkoutbyamazon')->throwException('Cannot load order with given ID', 0, array('area' => 'Inline Checkout')); } Mage::helper('checkoutbyamazon')->setAmazonProcessingOrders($order); $purchaseContractId = $this->getRequest()->getParam('purchaseContractId', null); $itemList = Mage::getModel('checkoutbyamazon/api_model_checkout_itemList'); foreach ($order->getItemsCollection() as $item) { $productId = $this->_getProductId($item); if (!$productId) { continue; } $product = Mage::getModel('catalog/product')->load($productId); $itemUnitPrice = $item->getBasePriceInclTax(); if (!$itemUnitPrice) { $itemUnitPrice = ($item->getBaseRowTotal() + $item->getBaseTaxAmount()) / $item->getQtyOrdered(); } $amazonItem = Mage::getModel('checkoutbyamazon/api_model_checkout_purchaseItem', array('MerchantItemId' => $item->getId(), 'SKU' => Mage::helper('checkoutbyamazon')->sanitizeSku($item->getSku()), 'Title' => $item->getName(), 'UnitPrice' => array('Amount' => Mage::helper('checkoutbyamazon')->sanitizePrice($itemUnitPrice)), 'Quantity' => round($item->getQtyOrdered()))); $amazonItem->setItemTax($this->_getAmazonPrice($item->getBaseTaxAmount() / $item->getQtyOrdered())); $amazonItem->setItemShipping($this->_getAmazonPrice(0)); $itemList->addItem($amazonItem); unset($product); } $amazonCharges = Mage::getModel('checkoutbyamazon/api_model_checkout_charges'); if (abs($order->getBaseDiscountAmount()) > 0) { $amazonPromotion = Mage::getModel('checkoutbyamazon/api_model_checkout_promotion', array('PromotionId' => trim($order->getCouponCode()) ? trim($order->getCouponCode()) : Mage::helper('checkoutbyamazon')->__('Discount'), 'Description' => trim($order->getDiscountDescription()) ? trim($order->getDiscountDescription()) : Mage::helper('checkoutbyamazon')->__('Discount'), 'Discount' => array('Amount' => abs($order->getBaseDiscountAmount())))); $promotionList = Mage::getModel('checkoutbyamazon/api_model_checkout_promotionList'); $promotionList->setPromotion(array($amazonPromotion)); $amazonCharges->setPromotions($promotionList); } $amazonCharges->setTax($this->_getAmazonPrice($order->getBaseTaxAmount())); $amazonCharges->setShipping($this->_getAmazonPrice($order->getBaseShippingAmount() + $order->getBaseShippingTaxAmount())); // send items data to Amazon $setItemsResult = $this->_getAmazonCheckoutApi()->setItems($purchaseContractId, $itemList); if (!$setItemsResult) { Mage::helper('checkoutbyamazon')->throwException('Error when performing SetItems call', 0, array('area' => 'Inline Checkout')); } $setContractChargesResult = $this->_getAmazonCheckoutApi()->setContractCharges($purchaseContractId, $amazonCharges); if (!$setContractChargesResult) { Mage::helper('checkoutbyamazon')->throwException('Error when performing SetContractCharges call', 0, array('area' => 'Inline Checkout')); } $amazonOrderIdList = $this->_getAmazonCheckoutApi()->completeOrder($purchaseContractId); if (!is_null($amazonOrderIdList)) { if (is_array($amazonOrderIdList)) { $amazonOrderId = implode(',', $amazonOrderIdList); } else { $amazonOrderId = $amazonOrderIdList; } $order->getPayment()->setLastTransId($amazonOrderId)->save(); } else { Mage::helper('checkoutbyamazon')->throwException('Error when performing CompletePurchaseContract call', 0, array('area' => 'Inline Checkout')); } $this->_getOnepage()->getCheckout()->setAmazonPurchaseContractId(null); $result['success'] = true; $result['error'] = false; Mage::helper('checkoutbyamazon')->unsetAmazonProcessingOrders(); Mage::helper('checkoutbyamazon')->unlockExceptionLogging(); } catch (Mage_Core_Exception $e) { Mage::helper('checkoutbyamazon')->unlockExceptionLogging(); if (isset($order) && is_object($order) && is_callable(array($order, 'getId')) && $order->getId()) { $order->cancel()->save(); } Creativestyle_CheckoutByAmazon_Model_Logger::logException($e->getMessage(), $e->getCode(), $e->getTraceAsString(), 'Inline Checkout', null, isset($order) && is_object($order) && is_callable(array($order, 'getId')) && $order->getId() ? $order->getId() : null); $result['success'] = false; $result['error'] = true; $result['error_messages'] = $e->getMessage(); if ($gotoSection = $this->_getOnepage()->getCheckout()->getGotoSection()) { $result['goto_section'] = $gotoSection; $this->_getOnepage()->getCheckout()->setGotoSection(null); } if ($updateSection = $this->_getOnepage()->getCheckout()->getUpdateSection()) { if (isset($this->_sectionUpdateFunctions[$updateSection])) { $updateSectionFunction = $this->_sectionUpdateFunctions[$updateSection]; $result['update_section'] = array('name' => $updateSection, 'html' => $this->{$updateSectionFunction}()); } $this->_getOnepage()->getCheckout()->setUpdateSection(null); } $this->_getOnepage()->getQuote()->save(); } catch (Exception $e) { Mage::helper('checkoutbyamazon')->unlockExceptionLogging(); if (isset($order) && is_object($order) && is_callable(array($order, 'getId')) && $order->getId()) { $order->cancel()->save(); } Creativestyle_CheckoutByAmazon_Model_Logger::logException($e->getMessage(), $e->getCode(), $e->getTraceAsString(), 'Inline Checkout', null, isset($order) && is_object($order) && is_callable(array($order, 'getId')) && $order->getId() ? $order->getId() : null); $result['success'] = false; $result['error'] = true; $result['error_messages'] = Mage::helper('checkout')->__('There was an error processing your order. Please contact us or try again later.'); $this->_getOnepage()->getQuote()->save(); } $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result)); }
public function sendRefundNotify($payment) { $result = null; $order = $payment->getOrder(); $creditmemo = $payment->getCreditmemo(); if ($this->_isAmazonPaymentMethod($order->getPayment()->getMethod()) && $order->getPayment()->getLastTransId()) { $filePath = $this->_queueDir['refund'] . DS . $this->_getTimestamp() . '_order_' . $order->getIncrementId() . '.xml'; $envelope = new SimpleXMLElement('<AmazonEnvelope></AmazonEnvelope>'); $envelope->Header->DocumentVersion = '1.01'; $envelope->Header->MerchantIdentifier = self::getConfigData('merchant_id'); $envelope->MessageType = 'OrderAdjustment'; $envelope->Message[0]->MessageID = 1; $envelope->Message[0]->OrderAdjustment->AmazonOrderID = $payment->getLastTransId(); $envelope->Message[0]->OrderAdjustment->MerchantOrderID = $order->getIncrementId(); $i = 0; foreach ($creditmemo->getAllItems() as $item) { $j = 0; $envelope->Message[0]->OrderAdjustment->AdjustedItem[$i]->MerchantOrderItemID = $item->getId(); $envelope->Message[0]->OrderAdjustment->AdjustedItem[$i]->AdjustmentReason = Creativestyle_CheckoutByAmazon_Model_Api_Model_Marketplace_Feeds_Abstract::ADJUSTMENT_REASON_CUSTOMER_RETURN; $envelope->Message[0]->OrderAdjustment->AdjustedItem[$i]->ItemPriceAdjustments->Component[$j]->Type = 'Principal'; $principalAmount = $envelope->Message[0]->OrderAdjustment->AdjustedItem[$i]->ItemPriceAdjustments->Component[$j]->addChild('Amount', Mage::helper('checkoutbyamazon')->sanitizePrice($item->getBaseRowTotalInclTax() - $item->getBaseDiscountAmount())); $principalAmount->addAttribute('currency', $creditmemo->getBaseCurrencyCode()); if (!$i) { if ($creditmemo->getBaseShippingAmount() > 0) { $envelope->Message[0]->OrderAdjustment->AdjustedItem[$i]->ItemPriceAdjustments->Component[++$j]->Type = 'Shipping'; $shippingAmount = $envelope->Message[0]->OrderAdjustment->AdjustedItem[$i]->ItemPriceAdjustments->Component[$j]->addChild('Amount', Mage::helper('checkoutbyamazon')->sanitizePrice($creditmemo->getBaseShippingAmount())); $shippingAmount->addAttribute('currency', $creditmemo->getBaseCurrencyCode()); } } $i++; } $fileSaveHandle = fopen($filePath, 'a'); fwrite($fileSaveHandle, trim($envelope->asXML())); fclose($fileSaveHandle); if (!self::getConfigData('feed_batching')) { $result = $this->_submitFeed(Creativestyle_CheckoutByAmazon_Model_Api_Model_Marketplace_Feeds_Abstract::FEED_TYPE_POST_PAYMENT_ADJUSTMENT_DATA, $filePath); Creativestyle_CheckoutByAmazon_Model_Logger::logFeed(Creativestyle_CheckoutByAmazon_Model_Api_Model_Marketplace_Feeds_Abstract::FEED_TYPE_POST_PAYMENT_ADJUSTMENT_DATA, $result, $order, trim($envelope->asXML()), $order->getStore()->getId()); } } return $result; }
public function logApiCall($observer) { $requestMethod = 'GET'; $host = $observer->getEvent()->getHost(); $action = $observer->getEvent()->getAction(); $headers = $observer->getEvent()->getHeaders(); $get = $observer->getEvent()->getGet(); $post = $observer->getEvent()->getPost(); $file = $observer->getEvent()->getFile(); $responseCode = $observer->getEvent()->getResponseCode(); $response = $observer->getEvent()->getResponse(); if ($file) { $requestMethod = 'FILE'; } elseif ($post) { $requestMethod = 'POST'; } Creativestyle_CheckoutByAmazon_Model_Logger::logApiCall($host, $action, null, $requestMethod, $headers, $get, $post, $file, $responseCode, $response); return $this; }
public function iopnAction() { if (Mage::helper('checkoutbyamazon')->getConfigData('iopn_active')) { $notificationType = $this->getRequest()->getPost('NotificationType', null); try { $params = $this->_getIopnRequestParams(); switch ($notificationType) { case 'NewOrderNotification': $result = Mage::getModel('checkoutbyamazon/api_iopn')->newOrderNotification($params); if (isset($result['code']) && $result['code'] == 200) { $order = $result['order']; $this->_getAmazonManager()->newOrder($order); $amazonOrderId = $order->issetAmazonOrderID() ? $order->getAmazonOrderID() : null; Creativestyle_CheckoutByAmazon_Model_Logger::logIopn($notificationType, isset($params['UUID']) ? $params['UUID'] : '', $amazonOrderId ? $this->_getOrderId($amazonOrderId) : null, isset($params['NotificationData']) ? $params['NotificationData'] : '', 200); return $this->_sendResponse(200); } else { Mage::helper('checkoutbyamazon')->throwException(isset($result['message']) ? $result['message'] : 'Internal error', isset($result['code']) ? $result['code'] : 500, array('area' => 'Amazon IOPN')); } break; case 'OrderCancelledNotification': $result = Mage::getModel('checkoutbyamazon/api_iopn')->orderCancelledNotification($params); if (isset($result['code']) && $result['code'] == 200) { $order = $result['order']; $this->_getAmazonManager()->cancelOrder($order); $amazonOrderId = $order->issetAmazonOrderID() ? $order->getAmazonOrderID() : null; Creativestyle_CheckoutByAmazon_Model_Logger::logIopn($notificationType, isset($params['UUID']) ? $params['UUID'] : '', $amazonOrderId ? $this->_getOrderId($amazonOrderId) : null, isset($params['NotificationData']) ? $params['NotificationData'] : '', 200); return $this->_sendResponse(200); } else { Mage::helper('checkoutbyamazon')->throwException(isset($result['message']) ? $result['message'] : 'Internal error', isset($result['code']) ? $result['code'] : 500, array('area' => 'Amazon IOPN')); } break; case 'OrderReadyToShipNotification': $result = Mage::getModel('checkoutbyamazon/api_iopn')->orderReadyToShipNotification($params); if (isset($result['code']) && $result['code'] == 200) { $order = $result['order']; $this->_getAmazonManager()->readyToShipOrder($order); $amazonOrderId = $order->issetAmazonOrderID() ? $order->getAmazonOrderID() : null; Creativestyle_CheckoutByAmazon_Model_Logger::logIopn($notificationType, isset($params['UUID']) ? $params['UUID'] : '', $amazonOrderId ? $this->_getOrderId($amazonOrderId) : null, isset($params['NotificationData']) ? $params['NotificationData'] : '', 200); return $this->_sendResponse(200); } else { Mage::helper('checkoutbyamazon')->throwException(isset($result['message']) ? $result['message'] : 'Internal error', isset($result['code']) ? $result['code'] : 500, array('area' => 'Amazon IOPN')); } break; default: $this->norouteAction(); return; } } catch (Exception $e) { $amazonOrderId = null; if (isset($result['order']) && is_object($result['order'])) { $order = $result['order']; $amazonOrderId = $order->issetAmazonOrderID() ? $order->getAmazonOrderID() : null; } Creativestyle_CheckoutByAmazon_Model_Logger::logIopn($notificationType, isset($params['UUID']) ? $params['UUID'] : '', $amazonOrderId ? $this->_getOrderId($amazonOrderId) : null, isset($params['NotificationData']) ? $params['NotificationData'] : '', $e->getCode()); if (!$e instanceof Creativestyle_CheckoutByAmazon_Exception) { Creativestyle_CheckoutByAmazon_Model_Logger::logException($e->getMessage(), $e->getCode(), $e->getTraceAsString(), 'Amazon IOPN', isset($params['UUID']) ? $params['UUID'] : '', isset($result['order']) ? $this->_getOrderId($result['order']) : null); } $this->_sendResponse($e->getCode(), $e->getMessage()); } } else { $this->norouteAction(); return; } }