What is the difference between these two options. on back end they give different outputs and the Credit Card (Authorize.net) does not use 3 digits verification number.
Magento 1.7 – Credit Card (Authorize.net) vs Credit Card (Saved)
magento-1.7
Related Solutions
I'll give it a shot. Let's take them one at a time:
Method 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
above is loaded from the class Mage_Sales_Model_Convert_Order
, which uses a core helper called copyFieldset
to copy order details into a shipment object. $order has to be of type array or Varien_Object
.
This method is actually at the core of Method 3, as it uses Mage::getModel('sales/convert_order')
in its constructor call.
Key differentiator of this method - it can take an array or an object $order
and generate a basic $shipment
object. It is a lower-level method used exclusively by the methods you put forth in Method 2, Method 3.
Method 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
This seems to be the most popular way in Magento's Core of generating a shipment as it is used in both Shipment and Invoice controllers. $order
is used as a constructor argument to the instantiation of Mage_Sales_Model_Service_Order
, setting it as a protected property on the object.
You're then calling prepareShipment
and passing a quantity. As this method uses the converter class from Method 1, you needn't specify more details such as order items pass item shipment qty details in the prepareShipment
argument, called here with $this->_getItemQtys
. To use this on your own context, all you need to do is pass the quantity of items in an array with the following format:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Key differentiator of this method - it gives you back a $shipment object, but with all items converted on it. It's plug-and-play.
Method 3
I could not find evidence of using this method in the Core. It looks like a hack, to be honest. Here's the method:
$itemQty = $order->getItemsCollection()->count();
$shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($itemQty);
$shipment = new Mage_Sales_Model_Order_Shipment_Api();
$shipmentId = $shipment->create($orderId);
Step 1 is exactly the same as Method 2 above. No difference. However, you get back a $shipment
object, which is replaced by a direct insantiation of Mage_Sales_Model_Order_Shipment_Api
. This is non-standard. The best-practice way of getting a shipment Api object would be to call Mage::getModel('sales/order_shipment_api')
.
Next, it uses that overwritten, new Shipment API object to create a shipment from an $orderId
variable that hasn't been defined in your code. Again, this seems like a workaround.
Looking at Mage_Sales_Model_Order_Shipment_Api::create()
, it seems like a one-stop-shop for generating a shipment as the most basic details needed to create the shipment is only an order increment_id
.
This is a hack that shouldn't be used by any module or extension. This API is meant to be consumed by features exposed via XML RPC / SOAP API requests and is intentionally basic to eliminate multiple step API requests.
Eventually Method 3 gets to the nitty-gritty, though, and via a call to Mage_Sales_Model_Order, it calls prepareShipment
, which is a higher-order abstraction for the familiar Method 2 above:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Key differentiator here - if you need a shipment, don't mind hacks, and only have an increment_id - use this method. Also useful information if you prefer to handle this via the SOAP API.
I hope that helps.
The code under Mage_Catalog_Block_Product_Abstract
has a very useful comment.
/**
* Retrieve url for add product to cart
* Will return product view page URL if product has required options
*
* @param Mage_Catalog_Model_Product $product
* @param array $additional
* @return string
*/
public function getAddToCartUrl($product, $additional = array())
{
if ($product->getTypeInstance(true)->hasRequiredOptions($product)) {
if (!isset($additional['_escape'])) {
$additional['_escape'] = true;
}
if (!isset($additional['_query'])) {
$additional['_query'] = array();
}
$additional['_query']['options'] = 'cart';
return $this->getProductUrl($product, $additional);
}
return $this->helper('checkout/cart')->getAddUrl($product, $additional);
}
The difference is that the Mage_Catalog_Block_Product_Abstract::getAddToCartUrl
will set the url as the product view page if the product has required options, otherwise it will just return Mage_Checkout_Helper_Cart::getAddUrl
.
The getAddToCartUrl
can be used when you are not on the product view page, say for the wishlist page. So that you do not get an error when the user tries to add a product to the cart that has required options.
Best Answer
If you do not have a payment gateway(like authorize.net for example), but still want to accept Credit Cards for processing offline, you can capture the credit card information using the Saved Credit Card payment method.
When the customer selects this method from the payment method list, they will be required to enter the Name on Card, select the Credit Card Type, enter the Credit Card Number, and select the Expiration Date. If enabled, they will also be required to enter the Card Verification Number. You would than have to process these cards manually, like if you had a credit card processing machine on location.
“Saved Credit Card” Saves the credit card information but then you have to take it and manually run it through your credit card processor. Magento does nothing with it
The automated way is to use authorize.net (or other methods) which sends the credit card info to authorize.net and does the approval process for you.