Instant Purchase module
The Instant Purchase module allows customers to place orders in seconds without going through the full checkout process.
This feature takes the form of a button on product pages. When a customer clicks this button, the system places their order using the default shipping, billing address, and stored payment method. Once the order is placed, an order confirmation message appears in the notification area.
This article explains how this module works and ways to customize it using its extension points. For merchant instructions, see Instant Purchase in the user guide.
Implementation details
The logic found in the Instant Purchase module is divided into two parts:
Instant Purchase logic
This module allows any product to be added to an instant purchase order.
The module creates an additional section in the Customer Data cache for Instant Purchase data. This data is updated when the relevant customer data changes, such as adding or removing a stored payment method or the default shipping address.
Important interfaces
The implementation for this interface defines Instant Purchase calculations. The default implementation uses several interfaces to choose the appropriate payment method, billing and shipping addresses, and shipping method.
Responsible for choosing the stored payment method. The default value is the last created and saved payment method used.
Instant Purchase will not use payment methods that were used but not saved.
Responsible for choosing the shipping address. The default implementation chooses the default shipping address set by the customer.
Responsible for choosing the billing address. The default implementation chooses the default billing address set by the customer.
Responsible for choosing the shipping method. The default implementation chooses the cheapest shipping method.
Since the final price of the shipment is calculated after product and quantity are specified in the final confirmation, “Cheapest price” is displayed in the confirmation pop-up for the customer.
The Instant Purchase capability logic is the most customizable part of the module. For more customization details, see the Customization Points section.
Order placement
The logic for the order placement process is found in the PlaceOrder
class.
The whole process is divided into several steps with each step implemented by a corresponding class in the Magento\InstantPurchase\Model\QuoteManagement
namespace.
Since order placement requires specific steps to be followed, this part of the module does not declare separate interfaces. To customize the behavior of the order placement process, use plugins.
Customization Points
Use dependency injection to override preferences for interfaces marked with the @api
notation and modify the behavior of the module.
Instant Purchase calculation
Custom implementations of the InstantPurchaseInterface
should return an InstantPurchaseOption
object.
The InstantPurchaseOption
object is a data container that holds the stored payment method, shipping and billing addresses, and shipping method used by the Instant Purchase module.
The logic of how this data is retrieved is the responsibility of the InstantPurchaseInterface
implementation.
To create an InstantPurchaseOption
object from the gathered data, use the InstantPurchaseOptionFactory
.
The customization points for stored payment, shipping address, billing address, and shipping method are used in the default InstantPurchaseInterface
implementation (InstantPurchaseChooser
).
They become invalid if a different implementation is used.
The choose()
method for custom implementations of the following interfaces must return an instance of the correct class or null
if nothing can be chosen.
Customization Point | Interface | Return Class |
---|---|---|
Stored Payment | PaymentTokenChooserInterface |
PaymentTokenInterface |
Shipping Address | ShippingAddressChooserInterface |
Customer’s Address |
Billing Address | BillingAddressChooserInterface |
Customer’s Address |
Shipping Method | ShippingMethodChooserInterface |
ShippingMethodInterface |
Deferred Shipping Method
Choosing the shipping method based on a customer’s address is difficult without all the information on the shipping subject because it is hard to estimate the cost and effort. To address this issue, the Instant Purchase module allows you to postpone the final decision on which shipping method to use until the exact product and quantity is known.
Use the following steps to help you implement a custom deferred shipping method:
- Create an implementation of the
ShippingMethodChooserInterface
with achoose()
method that returns aShippingMethodInterface
with the following properties:- Returns
DeferredShippingMethodChooserInterface::CARRIER
whengetCarrierCode()
is called. - Returns a unique string when
getMethodCode()
is called.
This string is used as a key to determine the corresponding logic during order placement.
- Returns a translated phrase when
getCarrierTitle()
is called.
This phrase is shown as the shipping method description in the Instant Purchase confirmation pop-up.
- Returns
true
whengetAvailable()
is called.
- Returns
-
Create an implementation of the
DeferredShippingMethodChooserInterface
. Unlike theShippingMethodChooserInterface
, this interface retrieves theQuote\Address
instead of the customer’s address, so it has access to the necessary data.This method must return a string that identifies the shipping method using the format
<carrier code>_<method code>
ornull
if nothing can be chosen. - Add an entry in the
di.xml
file that specifies your defined method code and custom implementation:
1
2
3
4
5
6
7
8
9
<type name="Magento\InstantPurchase\Model\ShippingMethodChoose\DeferredShippingMethodChooserPool">
<arguments>
<argument name="choosers" xsi:type="array">
<!-- item name attribute is method code defined in ShippingMethodChooserInterface implementation-->
<!-- item value is class name of DeferredShippingMethodChooserInterface implementation-->
<item name="cheapest" xsi:type="object">Magento\InstantPurchase\Model\ShippingMethodChoose\CheapestMethodDeferredChooser</item>
</argument>
</arguments>
</type>
Order placement
You can customize order placement using plugins.
Before and after plugins can be created to add custom behaviors in the PlaceOrder
class and any class in the Magento\InstantPurchase\Model\QuoteManagement
namespace.
Customizing payment handling is a special case for the order placement process. See Payment Method Integration for more details.
Confirmation pop-up
You can customize the strings on the Instant Purchase confirmation pop-up by using plugins on classes in the Magento\InstantPurchase\Model\Ui
namespace.
The format of the payment method can also be customized for specific payments.
Payment method integration
A payment method implementation can be integrated with Instant Purchase if it meets the following requirements:
- It implements the payment provider gateway mechanism.
- It implements vault integration.
- The payment along with the stored payment token is processed on the server side
The framework for payment method integration is provided in the Magento\InstantPurchase\PaymentMethodIntegration
namespace.
Integration is not enabled by default and requires developer action to make sure everything works as expected and avoid unpredictable bugs on production sites.
If the payment method meets all the requirements listed, you can enable Instant Purchase integration in the config.xml
file.
The minimal configuration for Instant Purchase integration development is as follows:
1
2
3
4
5
6
7
8
9
10
11
<config>
<default>
<payment>
<vault_payment_method_code><!-- replace this value with your vault payment method code -->
<instant_purchase>
<supported>1</supported>
</instant_purchase>
</vault_payment_method_code>
</payment>
<default>
</config>
This minimal configuration is to help you get started with Instant Purchase integration development and is not recommended for production sites.
The following is an example of a full configuration meant for production:
1
2
3
4
5
6
7
8
9
10
11
12
13
<config>
<default>
<payment>
<vault_payment_method_code><!-- replace this value with your vault payment method code -->
<instant_purchase>
<available>Implementation_Of_Magento\InstantPurchase\PaymentMethodIntegration\AvailabilityCheckerInterface</available>
<tokenFormat>Implementation_Of_Magento\InstantPurchase\PaymentMethodIntegration\PaymentTokenFormatterInterface</tokenFormat>
<additionalInformation>Implementation_Of_Magento\InstantPurchase\PaymentMethodIntegration\PaymentAdditionalInformationProviderInterface</additionalInformation>
</instant_purchase>
</vault_payment_method_code>
</payment>
<default>
</config>
All elements of the integration configuration are optional and have default implementations.
If some integration options are provided, then explicit usage of <supported>1</supported>
is not required.
However, adding <supported>0</supported>
will disable integration regardless of all other settings.
Integration availability checker
The integration availability checker allows you to specify if your payment integration is available based on the current Magento configuration specification or other data. For example, Magento Open Source provides Braintree Stored Credit Cards which supports Instant Purchase unless 3D Secure is enabled.
The default implementation for the availability checker always returns true
.
Custom availability checkers need to implement the AvailabilityCheckerInterface
and can be applied to a payment method by specifying the class name (or virtual type name) in the default/payment/<vault payment method code>/instant_purchase/available
configuration option.
Payment Token Formatter
The Magento Vault module provides an interface to persist and manage stored payment methods.
The properties defined in the interface is necessary to use the payment method.
Almost all the information used to provide the description for stored payment methods are stored as additional data and are not standardized. This is why the default token formatter returns the payment method title as the token description.
We recommend you provide a custom token formatter for your Instant Purchase integration to provide the correct information for your payment token
A custom payment token formatter should implement the PaymentTokenFormatterInterface
and return a human-readable string that describes the PaymentTokenInterface
.
The Instant Purchase module guarantees that the correct token associated with corresponding payment method is passed to the formatter.
To configure the formatter, use the default/payment/<vault payment method code>/instant_purchase/tokenFormat
configuration path.
Additional Payment Information Provider
Some payment methods require the collection of additional information during the checkout process for order placement.
By default, the Instant Purchase module specifies the following properties as additional payment information:
Name | Description |
---|---|
customer_id |
Holds the Customer identifier |
public_hash |
The public hash for the stored payment method |
is_active_payment_token_enabler |
Required by Vault framework |
To change the default behavior or add specific fields, implement the PaymentAdditionalInformationProviderInterface
and specify it as the value for the default/payment/<vault payment method code>/instant_purchase/additionalInformation
configuration option.
The default implementation returns an empty array.
Instant Purchase Payment Marker
In most cases, developers should use interfaces for custom implementations and not rely on internal code.
However, sometimes conditional logic for payment processing needs to be implemented to handle payments initiated from different entry points.
For these cases, the payment object’s InfoInterface
holds an additional_information
property, accessible via the getAdditionalInformation()
method, which can return the instant-purchase
marker.
Use this marker if no other options are available to implement specific payment logic for the Instant Purchase module.