Custom Payment Information
Implemented payment methods don't need any additional information. The user only needs to select one of the implemented payment methods and then will be prompted to enter all the required information. However, you may require more information, for example, if you want to let users enter a comment related to the payment method/checkout. This guide explains how to achieve it in Front-Commerce.
All the code that will be created in this page should live in your own module.
You can either put it in your client code or create a specific module for the
payment method(s). If you create a specific one, please keep in mind that you
need to register it in .front-commerce.js.
see the payment workflows specificities for changes to the current example for each worflow
Display a custom input for a payment method
You should register a new component in getAdditionalDataComponent.js by
following this template:
import CustomComponent from "theme/modules/CustomComponent/CustomComponent";
const ComponentMap = {
"<method_code>": CustomComponent,
};
// ... the rest of the code should be kept intact
The Custom component referenced here should be created in your own module, and display the additional information of your payment method to the user.
import React from "react";
import SubmitPayment from "theme/modules/Checkout/Payment/SubmitPayment";
const CustomComponent = ({
onAuthorize,
value,
gscAccepted,
error,
method,
}) => {
const [comments, setComments] = useState(value?.comments ?? "");
return (
<div className="custom-component">
<input
onChange={(event) => setComments(event.target.value)}
value={comments}
type="text"
/>
<SubmitPayment
gscAccepted={gscAccepted}
onSubmit={() => {
onAuthorize(gscAccepted ? { comments } : null);
}}
error={error}
/>
</div>
);
};
export default CustomComponent;
Things to understand here:
- The
SubmitPaymentcomponent is a common component across all payment methods to ensure consistency in how methods are managed. methodthe current selected method.valuecontains initial additional data (usually it is always null).onAuthorizeshould be called with the additional data on<SubmitPayment>'s on submit method.gscAcceptedwhether or not the user have accepted the general sales conditions (checkbox above the "Place my order" button). Just forward this to the<SubmitPayment>component.erroran error object if there is an error. Just forward this to the<SubmitPayment>component.
In this example we're only setting a comments additional text input, but you can do fancier things like fetching a list for the user to pick from GraphQL and displaying them here.
Updating an existing method Additional Data
Sometimes you may need to add an extra field to the additional data of an
existing payment method. You first need to check if this payment method already
has an AdditionalDataComponent registered.
- If
AdditionalDataComponenthas been registered, you should then override theAdditionalDataComponentand add your custom modifications. - If no
AdditionalDataComponentis registered, you can then follow the Display a custom input for a payment method docs.
Adding a field to all payment methods
You should enhance the AdditionalDataComponent by following this template:
import CustomEnhancer from 'theme/modules/CustomModule/CustomEnhancer'
const ComponentMap = {
..., // registered additional data
};
const getAdditionalDataComponent = (method) => {
const Component = ComponentMap[method.code];
return CustomEnhancer(Component);
};
export default getAdditionalDataComponent;
The CustomEnhancer referenced here should be created in your own module. It
should display the base component sent to it and add additional data fields and
override the onAuthorize method.
import React from "react";
import SubmitPayment from "theme/modules/Checkout/Payment/SubmitPayment";
const CustomEnhancer =
(BaseComponent) =>
({ onAuthorize, value, gscAccepted, error, method }) => {
const [comments, setComments] = useState(value?.comments ?? "");
return (
<div className="custom-enhancer">
<input
onChange={(event) => setComments(event.target.value)}
value={comments}
type="text"
/>
{BaseComponent ? (
<BaseComponent
onAuthorize={(additionalData) => {
onAuthorize({ ...additionalData, comments });
}}
value={value}
gscAccepted={gscAccepted}
error={error}
method={method}
/>
) : (
<SubmitPayment
gscAccepted={gscAccepted}
onSubmit={() => {
onAuthorize(gscAccepted ? { comments } : null);
}}
error={this.props.error}
/>
)}
</div>
);
};
export default CustomEnhancer;