i am trying to enable shipping method, update the shipping costs and enable payment methods based on a condition through an observer. I was able to add a field to the checkout page to check for the condition but i am not sure how do i enable/disable shipping methods and payment methods and update the shipping costs? Could some one provide a code snippet to perform this or point me in the right direction? Thanks.
You can override the shipping and payment methods isAvailable() or isActive() methods to meet your conditions and show the availability or change the price of shipping method. If you need to add a payment method fee then you need to implement a total object for a payment method.
However in checkout/onepage the process is address > shipping > payment and if you change your conditions on last step then you ideally need a user confirmation to change the choices he has made in previous steps.
Related
Am creating a module to add an additional payment system to Magento after creating the module. It is appearing in the admin panel and I have enabled it, but it is showing no payment method.
So payment methods are shown on the checkout page after they pass the function Mage_Checkout_Block_Onepage_Payment_Methods::_canUseMethod now this function basically checks if the method itself is setup and if it is valid against the current quote via two calls.
The payment methods own function canUseCheckout. Now since you are creating your own method I dont know what you function here looks like but I guess it would not be too complex to debug by yourself.
The payment forms Mage_Payment_Block_Form_Container::_canUseMethod. Now what this function does is check the payment method against the country, currency and quote total.
With the following
return $method->isApplicableToQuote($this->getQuote(), Mage_Payment_Model_Method_Abstract::CHECK_USE_FOR_COUNTRY
| Mage_Payment_Model_Method_Abstract::CHECK_USE_FOR_CURRENCY
| Mage_Payment_Model_Method_Abstract::CHECK_ORDER_TOTAL_MIN_MAX
);
Now if your payment method does not override anything here then it simply checks the config values of min_order_total, max_order_total, specificcountry and if you have any special currency checks.
We are using braintree's dropin UI to help save time in having to create custom payment entry pages. What is hard to understand is why you can only add new payment method and not remove. I understand being able to add, but if there was a problem with a given payment method (later on). It is there forever because the customer cannot remove a payment method. I guess the only way to remove a payment method, is for us write a custom UI (thus defeating the purpose of using the dropin UI to begin with). Is there no way for a customer to remove a payment method using the dropin UI?
Braintree's DropIn UI doesn't allow users to remove or update saved payment method.
But there's a way to do that. For example, if you have a customer profile page where they can manage their settings, you can simply add a menu that shows all the payment methods associated with the customer.
To do this, you can simply use some Braintree functions which are explained here: https://developers.braintreepayments.com/guides/payment-methods/php
The idea is to get all the payment method associated with the customer using something like:
$customer = Braintree_Customer::find('a_customer_id');
$customer->paymentMethods // array of Braintree_PaymentMethod instances
It will return an object for all the payment methods. Then you can check the response of that object from the same page by clicking the specific payment method type here (credit card, paypal...)
Once you have these values, you can display them in a table for example, and add a simply button or whatever you want to delete that payment method.
To do this, you can use the following function passing the TOKEN as an argument
$result = Braintree_PaymentMethod::delete('the_token');
/*(token is a value of the object that comes from $customer->paymentMethods*/
Finally, you can check the response controlling the value of $result (true or false)
Hope this helps.
The ability to delete vaulted payment methods using the Braintree drop-in UI has been added around August 7, 2018 and is available in braintree-web-drop-in 1.12.0+. This feature is now listed in their documentation:
Name: vaultManager
Type: boolean
Attributes: optional
Default: false
Description:
Whether or not to allow a customer to delete saved payment methods when used with a client token with a customer id. Note: Deleting a payment method from Drop-in will permanently delete the payment method, so this option is not recomended for merchants using Braintree's recurring billing system. This feature is not supported in Internet Explorer 9.
To enable the "Vault Manager" (the ability to delete vaulted payment methods), set vaultManager: true when creating the drop-in:
braintree.dropin.create({
authorization: 'CLIENT_AUTHORIZATION',
vaultManager: true,
/* your other braintree options */
})
I am writing a custom shipping rates module, and I can’t seem to figure out how to get the estimate shipping zipcode… I know how to get the zipcode once the order has been created, but not for the estimate shipping portion of the checkout process
Any input is greatly appreciated!
Jeff
Whole information about the customer's cart is kept in Mage_Sales_Model_Quote model until placing an order. So you can get the Shipping Address model from the Quote. And from Shipping Address model you can get the zip code, which is called a 'post code' there. Thus, the only thing you initially need is to get Quote for the customer.
The Quote can be got in different ways:
loaded from DB by its id or by any other attribute
received from the Checkout session
received from the Checkout Cart model
The most general way is to get Quote by loading it from DB - this can be done in all the Magento workflows and areas (API, frontend, backend, etc.).
But for your case the most straightforward way is to get Quote from Checkout Cart model, as you don't need to know Quote id for it - at frontend Magento loads Cart with appropriate customer data automatically.
/** #var $cart Mage_Checkout_Model_Cart */
$cart = Mage::getSingleton('checkout/cart');
$quote = $cart->getQuote();
$shippingAddress = $quote->getShippingAddress();
$zip = $shippingAddress->getPostcode();
To get a little more understanding, why the Checkout Cart is used in this approach: the Checkout module manages the whole checkout process at frontend. It processes composing cart, viewing it, going through checkout steps and placing an order. Checkout module also stores the customer's quote model in its Cart model. While Quote stores whole information and can be used everywhere to manipulate customer's cart, the Cart model is just a temporary service model to aid Checkout module in fulfilling its duty, and it can be used at frontend for current customer.
you can do something like:
Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getPostcode();
//or
Mage::getSingleton('checkout/session')->getQuote()->getBillingAddress()->getPostcode();
Modifying a payment module I'm not having any success changing the "payment name" that is placed in table sales_flat_order_payment in field "method".
For example if payment is check, it is populated with checkmo.
I've tried changing
protected $_code = '.........'; in payment.php with no success.
I'm guessing this name may need changing in multiple places?
I have researched this but any answers I can find are assuming I have the skill level to know how to duplicate or modify the extension.
magento ver 1.4.1.1
more info; I'm using a Western Union payment extension as a Bpay payment extension and that field method is used to SMS payment type to me (and it would be more elegant it said what it really was!)
It's better to have a separate payment method for this. You can duplicate some existing method, and use your custom name.
Create a new payment module by duplicate one of your other payment module that closest matches what you are trying to do.
If you are trying to create a payment module for check then take a look at create a new payment method
I'm implementing a custom FedEx integration solution for a Magento site. Part of this is to add a signature requirement checkbox in the onepage checkout, and add $3 if this is checked. Unfortunately it seems that the FedEx Rate Web Service doesn't take any parameter regarding signature requirements, so I must manually add this cost to the order.
I was thinking about taking one of these two approaches, but I'm not sure will be best nor am I sure how to actually accomplish it:
Add $3 to whatever price FedEx returns
Create a new line item for this
Assuming that I have a handle on the $order, which solution would be best and how would I do it?
The code should run inside an observer method which is called by the checkout_controller_onepage_save_shipping_method event, which is triggered immediately after $this->getOnepage()->saveShippingMethod($data);. This means I can't add $3 when the FedEx API returns a result, as I won't know if the checkbox is checked until afterwards.
I came up with a solution; it's not the best but it works perfectly fine for me:
Magento fires an event when saving the shipping info. I grab the POST data and save it in the db as well as the address object.
If the checkbox has changed, have it reload that same tab instead of moving onto the payment step.
In the shipping quote, check the address object for the checkbox value. If set, add a certain amount to the quote result.