AddressErrors - 用于表示付款中地址的验证错误

AddressErrors付款请求 API 的字典,用于表示付款中地址(通常是帐单地址或送货地址)的验证错误。它的属性如果不为空的话,表示使用 PaymentAddress 描述的地址中的同名成员发生了验证错误。

如果地址的更改导致发生验证错误,则 shippingaddresschange 事件处理函数传递给 PaymentRequestUpdateEvent.updateWith()PaymentDetailsUpdate 中的 shippingAddressErrors 对象是一个 AddressErrors 类型。

请参阅下面的实例,以了解其工作原理。

属性

addressLine

一个 DOMString,如果存在,表示 PaymentAddressaddressLine 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

city

一个 DOMString,如果存在,表示 PaymentAddresscity 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

country

一个 DOMString,如果存在,表示 PaymentAddresscountry 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

dependentLocality

一个 DOMString,如果存在,表示 PaymentAddressdependentLocality 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

organization

一个 DOMString,如果存在,表示 PaymentAddressorganization 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

phone

一个 DOMString,如果存在,表示 PaymentAddressphone 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

postalCode

一个 DOMString,如果存在,表示 PaymentAddresspostalCode 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

recipient

一个 DOMString,如果存在,表示 PaymentAddressrecipient 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

region

一个 DOMString,如果存在,表示 PaymentAddressregion 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

regionCode

一个 DOMString,如果存在,表示 PaymentAddressregionCode 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

sortingCode

一个 DOMString,如果存在,表示 PaymentAddresssortingCode 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

过时的属性

这些属性已从规范中删除,不应再使用。

languageCode

一个 DOMString,如果存在,表示 PaymentAddresslanguageCode 属性验证不通过。字符串的内容提供了易于理解的验证失败的解释,以及纠正问题的理想建议。

使用注意

请记住,某些错误可能是用户无法修复的。尽量避免让用户改正他们不能更改的内容,并且在某些情况下,无论如何您都需要允许接受验证错误(例如,您根据邮政数据库验证地址,用户输入了一个新的地址,但是该地址不在数据库中)。

实例

代码段:限制目标国家

function handleAddressChange(ev) {
  const validCountries = ["US", "CA", "GB", "JP", "CN", "MX"];

  const genericAddressError = "无法运送到指定地址。请检查是否有任何错误。";
  const invalidCountryError = "目前,我们只运送到美国,加拿大,英国,日本,中国和德国。";

  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);
}

有关此代码的工作方式的描述,请参见处理地址变更

完整的例子

在这里,我们将看到上述实例的完整的工作版本(当然,它没有连接到实际的付款处理程序,因此实际上不处理任何付款)。在该实例中,我们处理向组织发送的捐赠,该组织将向捐赠者发送一份 “感谢” 礼物,因此该组织要求提供运输信息以及允许支付捐赠。

JavaScript

付款请求数据

首先,我们声明变量 supportedHandlers,它与 PaymentMethodData 兼容,还声明了 defaultPaymentDetails ,它是一个 PaymentDetailsUpdate 对象。

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: '原始捐款金额',
      amount: {currency: 'USD', value: '65.00'}
    }
  ],
  shippingOptions: [
    {
      id: 'standard',
      label: '标准运输',
      amount: {currency: 'USD', value: '0.00'},
      selected: true
    }
  ]
};

supportedHandlers 描述了支持的付款处理程序及其详细信息。在此实例中,仅支持基本卡处理程序,并且将其配置为允许使用 Visa,Master Card,American Express 和 Discover 的借记卡和信用卡。

defaultPaymentDetails 描述了所请求的付款。说明所要求的总金额(包括标签和使用的货币),一个项目列表(在这种情况下,仅有 “原始捐赠金额” 一行)以及可用的运输选项列表;在这种情况下,也只有一个。

处理付款

主要的付款处理代码可在接下来的 process() 方法中找到。

let request;

function process() {
  let options = {requestShipping: true};

  try {
    request = new PaymentRequest(supportedHandlers, defaultPaymentDetails, options);
    // 在此处添加事件监听器。
    request.onshippingaddresschange = handleAddressChange;
    // 调用 show() 以触发浏览器的付款流程。
    request.show().then(function(instrumentResponse) {
      // 对 UI 的响应进行处理。
      console.log("得到响应!");
    })
    .catch(function(err) {
      // 对 request.show() 中的错误进行处理。
      console.error(`来自 show() 的错误:${err}`);
    });
  } catch (e) {
    // 捕获尝试创建 PaymentRequest 对象的所有错误。
  }
}

这段代码创建了一个新的 PaymentRequest,提供了我们在上面设置的受支持的处理程序和付款方式,以及其他选项(在这种情况下,我们想询问运输信息)。

之后,我们为 shippingaddresschange 事件设置处理程序,以便我们可以验证地址信息并调用请求的 show() 方法开始进入付款用户界面。

处理地址变更

当触发 shippingaddresschange 事件时,我们会调用 handleAddressChange() 方法,以确定该国家 / 地区是否是我们允许的发货目的地之一。

function handleAddressChange(ev) {
  const validCountries = ["US", "CA", "GB", "JP", "CN", "MX"];

  const genericAddressError = "无法运送到指定地址。请检查是否有任何错误。";
  const invalidCountryError = "目前,我们只运送到美国,加拿大,英国,日本,中国和德国。";

  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);
}

shippingaddresschange 事件不会直接收到 PaymentRequest 对象,因此我们从事件的 target 属性中获取该对象。如果请求的 shippingAddresscountry 值不在 validCountries 数组中,我们生成错误。

这是通过删除当前在请求上设置的所有运输选项,然后设置一个名为 shippingAddressErrors 的对象来实现的,该对象包含一个 country 属性,该属性是一条错误消息,描述了为什么不允许指定国家 / 地区作为值。

然后,创建一个 PaymentDetailsUpdate 对象,并将其 error 对象设置为有关地址错误的通用消息,并重置该对象的值从 shippingAddressErrors 中获取,并附加 “...defaultPaymentDetails” 作为对象的值。

最后一步是调用事件的 updateWith() 方法,并传递一个 updateDetails 对象。这样可以使 Payment Request API 知道出现指定的一个或多个错误,但允许用户继续尝试编辑地址。

设置立即捐赠按钮

这段代码在 window 上的 load 事件中创建了处理程序,该处理程序又添加了所需的 click 事件处理程序到 “立即捐赠” 按钮,以便单击该按钮即可开始付款过程。

window.addEventListener("load", function(ev) {
  document.getElementById("pay").addEventListener("click", process, false);
}, false);

有关事件处理程序及其工作方式的信息,请参见 addEventListener()

HTML

这是此实例的简单 HTML。

<p>为我们值得的事业捐款 65 美元,我们将向您发送一份礼物,以表示感谢!</p>
<button id="pay">立即捐款</button>

结果

最终完整的 AddressErrors 例子如下:

<p>为我们值得的事业捐款 65 美元,我们将向您发送一份礼物,以表示感谢!</p>
<button id="pay">立即捐款</button>
        

<script>
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
    }
  ]
}; 

let request;

function process() {
  let options = {requestShipping: true};

  try {
    request = new PaymentRequest(supportedHandlers, defaultPaymentDetails, options);
    // 在此处添加事件监听器。
    request.onshippingaddresschange = handleAddressChange;
    // 调用 show() 以触发浏览器的付款流程。
    request.show().then(function(instrumentResponse) {
      // 对 UI 的响应进行处理。
      console.log("得到响应!");
    })
    .catch(function(err) {
      // 对 request.show() 中的错误进行处理。
      console.error(`来自 show() 的错误:${err}`);
    });
  } catch (e) {
    // 捕获尝试创建 PaymentRequest 对象的所有错误。
  }
}

function handleAddressChange(ev) {
  const validCountries = ["US", "CA", "GB", "JP", "CN", "MX"];

  const genericAddressError = "无法运送到指定地址。请检查是否有任何错误。";
  const invalidCountryError = "目前,我们只运送到美国,加拿大,英国,日本,中国和德国。";

  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);
}

window.addEventListener("load", function(ev) {
  document.getElementById("pay").addEventListener("click", process, false);
}, false);
</script>

尝试一下 »

规范

规范 状态 备注
Payment Request API
AddressErrors 的定义
候选推荐 初始定义。

桌面浏览器兼容性

暂无兼容数据