The AddressErrors dictionary is used by the Payment Request API to to report validation errors in a physical address (typically a billing address or a shipping address). Any members which is present indicates that a validation error occurred for the member of the same name in an address described using PaymentAddress.
AddressErrors is the type of the object returned by shippingAddressErrors in the PaymentDetailsUpdate passed into PaymentRequestUpdateEvent.updateWith() by the shippingaddresschange event handler if a change to the address resulted in a validation error occurring.
See the examples below to see how this works.
addressLineDOMString which, if present, indicates that the addressLine property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.cityDOMString which, if present, indicates that the city property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.countryDOMString which, if present, indicates that the country property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.dependentLocalityDOMString which, if present, indicates that the dependentLocality property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.organizationDOMString which, if present, indicates that the organization property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.phoneDOMString which, if present, indicates that the phone property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.postalCodeDOMString which, if present, indicates that the postalCode property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.recipientDOMString which, if present, indicates that the recipient property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.regionDOMString which, if present, indicates that the region property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.regionCodeDOMString which, if present, indicates that the regionCode property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.sortingCodeDOMString which, if present, indicates that the sortingCode property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.These properties have been removed from the specification and should no longer be used.
languageCode
DOMString which, if present, indicates that the languageCode property of the PaymentAddress could not be validated. The contents of the string provide a human-readable explanation of the validation failure, and ideally suggestions to correct the problem.Keep in mind that some violation errors may be outside the ability of the user to fix. Try to avoid asking the user to make corrections to things they can't change, and there may be situations in which you need to allow validation errors to be accepted anyway (for example, if you validate addresses against a postal service database and a new home has been built and its address is not yet in the database).
This first example is just a snippet showing an implementation of the event handler for the shippingaddresschange event which checks to be sure the chosen address is located within one of a limited number of countries.
function handleAddressChange(ev) {
const validCountries = ["US", "CA", "GB", "JP", "CN", "MX"];
const genericAddressError = "Unable to ship to the given address. Please check for any errors.";
const invalidCountryError = "At this time, we only ship to the United States, Canada, Great Britain, Japan, China, and Germany.";
let shippingAddress = ev.target.shippingAddress;
let shippingAddressErrors = {};
let updateDetails = {};
if (!validCountries.includes(shippingAddress.country)) {
ev.target.shippingOptions = [];
shippingAddressErrors.country = invalidCountryError;
updateDetails = {
error: genericAddressError,
shippingAddressErrors,
...defaultPaymentDetails
};
ev.updateWith(updateDetails);
}
} See Handling address changes for a description of how this code works.
Here we'll see a complete, working version of the example above (except of course that it's not connected to an actual payment handler, so no payments are actually processed). In the example, we're handling a donation to an organization that will be sending a "thank you" gift to the donor, so it requests shipping information along with allowing the donation payment itself.
First, we declare the variables supportedHandlers, which is compatible with PaymentMethodData, and defaultPaymentDetails, which is a PaymentDetailsUpdate object.
let supportedHandlers = [
{
supportedMethods: "basic-card",
data: {
supportedNetworks: ["visa", "mastercard", "amex", "discover"],
supportedTypes: ["credit", "debit"]
}
}
];
let defaultPaymentDetails = {
total: {label: 'Donation', amount: {currency: 'USD', value: '65.00'}},
displayItems: [
{
label: 'Original donation amount',
amount: {currency: 'USD', value: '65.00'}
}
],
shippingOptions: [
{
id: 'standard',
label: 'Standard shipping',
amount: {currency: 'USD', value: '0.00'},
selected: true
}
]
}; supportedHandlers describes the supported payment handlers and the details for those. In this example, only the Basic Card handler is supported, and it's configured to permit both debit and credit cards from Visa, Master Card, American Express, and Discover.
defaultPaymentDetails describes the payment being requested. A description of the total amount being requested (including a label and the currency used), a list of the line items (in this case only one, "Original donation amount"), and a list of shipping options available; in this case only one.
The main payment processing code is found in the process() method, up next.
let request;
function process() {
let options = {requestShipping: true};
try {
request = new PaymentRequest(supportedHandlers, defaultPaymentDetails, options);
// Add event listeners here.
request.onshippingaddresschange = handleAddressChange;
// Call show() to trigger the browser's payment flow.
request.show().then(function(instrumentResponse) {
// Do something with the response from the UI.
console.log("Got response!");
})
.catch(function(err) {
// Do something with the error from request.show().
console.log("Error from show(): " + err);
});
} catch (e) {
// Catch any errors from trying to create the PaymentRequest object.
}
} This code creates a new PaymentRequest, providing the supported handlers and payment options we set up above, as well as additional options (in this case, that we want to ask for shipping information).
After that, we set up the handler for the shippingaddresschange event so we can validate address information and call the request's show() method to start running the payment UI.
The handleAddressChange() method, called when shippingaddresschange events occur, is where we'll look to see if the country is one of those we allow as shipping destinations.
function handleAddressChange(ev) {
const validCountries = ["US", "CA", "GB", "JP", "CN", "MX"];
const genericAddressError = "Unable to ship to the given address. Please check for any errors.";
const invalidCountryError = "At this time, we only ship to the United States, Canada, Great Britain, Japan, China, and Germany.";
let shippingAddress = ev.target.shippingAddress;
let shippingAddressErrors = {};
let updateDetails = {};
if (!validCountries.includes(shippingAddress.country)) {
ev.target.shippingOptions = [];
shippingAddressErrors.country = invalidCountryError;
updateDetails = {
error: genericAddressError,
shippingAddressErrors,
...defaultPaymentDetails
};
ev.updateWith(updateDetails);
}
} The shippingaddresschange event doesn't receive the PaymentRequest object directly, so we fetch it from the target property of the event. If the request's shippingAddress has a value for country which isn't in the array validCountries, we generate the error.
That's done by removing all shipping options currently set on the request, then set up an object named shippingAddressErrors which contains a country property which is an error message describing why the stated country isn't being permitted as a value.
Then a PaymentDetailsUpdate object is created with its error set to a generic message about address errors and with the reset of the object's values taken from shippingAddressErrors, and, using "...defaultPaymentDetails" as the final entry in the object, the remeainder of the properties' values are taken from defaultPaymentDetails.
The final step is to call the event's updateWith() method, passing along the updateDetails object. This lets the Payment Request API know to present the specified error or errors but to allow the user to keep trying to edit the address.
This code creates a handler for the load event on the window which in turn adds the needed click event handler to the "Donate Now" button so that clicking it starts the payment process.
window.addEventListener("load", function(ev) {
document.getElementById("pay").addEventListener("click", process, false);
}, false);
See addEventListener() for information about event handlers and how they work.
Here's the simple HTML for this example.
<p>Donate US $65 to our worthwhile cause and we will send you a totally not-useless gift as a token of our thanks!</p> <button id="pay">Donate Now</button>
The final product is below.
Note: if you have content blocking features enabled in your browser, the example may not work inline below. In that case, you can view the example on its own page.
| Specification | Status | Comment |
|---|---|---|
| Payment Request API The definition of 'AddressErrors' in that specification. | Candidate Recommendation | Initial definition. |
No compatibility data found. Please contribute data for "api.AddressErrors" (depth: 1) to the MDN compatibility data repository.
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/AddressErrors