<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://web.dev/</id>
  <title>Sahel Sharify on web.dev</title>
  <updated>2026-04-15T23:21:06Z</updated>
  <author>
    <name>Sahel Sharify</name>
  </author>
  <link href="https://web.dev/authors/sahel/feed.xml" rel="self"/>
  <link href="https://web.dev/"/>
  <icon>https://web-dev.imgix.net/image/admin/X2tDP3SQzVCQ8dVLmMMI.jpg?auto=format</icon>
  <logo>https://web.dev/images/shared/rss-banner.png</logo>
  <subtitle>Our latest news, updates, and stories by Sahel Sharify.</subtitle>
  
  
  <entry>
    <title>Providing shipping and contact information from an Android payment app</title>
    <link href="https://web.dev/android-payment-apps-delegation/"/>
    <updated>2020-07-17T00:00:00Z</updated>
    <id>https://web.dev/android-payment-apps-delegation/</id>
    <content type="html" mode="escaped">&lt;p&gt;Entering shipping address and contact information through a web form can be a
cumbersome experience for customers. It can cause errors and lower conversion
rate.&lt;/p&gt;
&lt;p&gt;That&#39;s why the Payment Request API supports a feature to request shipping
address and contact information. This provides multiple benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users can pick the right address with just a few taps.&lt;/li&gt;
&lt;li&gt;The address is always returned in &lt;a href=&quot;https://w3c.github.io/payment-request/#paymentaddress-interface&quot; rel=&quot;noopener&quot;&gt;the standardized
format&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Submitting an incorrect address is less likely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Browsers can defer the collection of shipping address and contact information to
a payment app to provide a unified payment experience. This functionality is
called &lt;em&gt;delegation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Whenever possible, Chrome delegates the collection of a customer&#39;s shipping
address and contact information to the invoked Android payment app. The
delegation reduces the friction during checkout.&lt;/p&gt;
&lt;p&gt;The merchant website can dynamically update the shipping options and total price
depending on the customer&#39;s choice of the shipping address and the shipping
option.&lt;/p&gt;
&lt;figure class=&quot;w-figure&quot; style=&quot;width:300px; margin:auto;&quot;&gt;
  &lt;video controls=&quot;&quot; autoplay=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot; class=&quot;w-screenshot&quot;&gt;
    &lt;source src=&quot;https://storage.googleapis.com/web-dev-assets/payments/android-payment-app-delegation.webm&quot; type=&quot;video/webm&quot; /&gt;
    &lt;source src=&quot;https://storage.googleapis.com/web-dev-assets/payments/android-payment-app-delegation.mp4&quot; type=&quot;video/mp4&quot; /&gt;
  &lt;/video&gt;
  &lt;figcaption class=&quot;w-figcaption&quot;&gt;
    Shipping option and shipping address change in action. See how it affects shipping options and total price dynamically.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Learn how to implement an &lt;a href=&quot;https://web.dev/android-payment-apps-developers-guide/&quot;&gt;Android payment app&lt;/a&gt; in advance. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;To add delegation support to an already existing Android payment app,
implement the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#declare-supported-delegations&quot;&gt;Declare supported delegations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#parse-pay-intent-extras-for-required-payment-options&quot;&gt;Parse &lt;code&gt;PAY&lt;/code&gt; intent extras for required payment
options&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#provide-required-information-in-a-payment-response&quot;&gt;Provide required information in payment
response&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#optional-support-dynamic-flow&quot;&gt;[Optional] Support dynamic flow&lt;/a&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#notify-the-merchant-about-changes-in-the-user-selected-payment-method-shipping-address-or-shipping-option&quot;&gt;Notify the merchant about changes in the user selected payment method,
shipping address, or shipping
option&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#receive-updated-payment-details-from-the-merchant&quot;&gt;Receive updated payment details from the merchant (for example, the
adjusted total amount based on the selected shipping option&#39;s
cost)&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;declare-supported-delegations&quot;&gt;Declare supported delegations &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#declare-supported-delegations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The browser needs to know the list of additional information that your payment
app can provide so it can delegate the collection of that information to your
app. Declare the supported delegations as a &lt;code&gt;&amp;lt;meta-data&amp;gt;&lt;/code&gt; in your app&#39;s
&lt;a href=&quot;https://web.dev/android-payment-apps-developers-guide/#androidmanifest.xml-2&quot;&gt;AndroidManifest.xml&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;activity&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;.PaymentActivity&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token attr-name&quot;&gt;…&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token attr-name&quot;&gt;&amp;lt;meta-data&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;org.chromium.payment_supported_delegations&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;android:&lt;/span&gt;resource&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;@array/supported_delegations&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;activity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;resource&amp;gt;&lt;/code&gt; must be a list of strings chosen from the following valid values:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payerName&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payerEmail&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payerPhone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;shippingAddress&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The following example can only provide a shipping address and the payer&#39;s email
address.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;string-array&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;supported_delegations&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;payerEmail&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;shippingAddress&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;string-array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2 id=&quot;parse-pay-intent-extras-for-required-payment-options&quot;&gt;Parse &lt;code&gt;PAY&lt;/code&gt; intent extras for required payment options &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#parse-pay-intent-extras-for-required-payment-options&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The merchant can specify additional required information using the
&lt;a href=&quot;https://www.w3.org/TR/payment-request/#paymentoptions-dictionary&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;paymentOptions&lt;/code&gt;&lt;/a&gt;
dictionary. Chrome will provide the list of required options that your app can
provide by passing the following parameters to the &lt;code&gt;PAY&lt;/code&gt; activity as &lt;a href=&quot;https://web.dev/android-payment-apps-developers-guide/#parameters-2&quot;&gt;Intent
extras&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;paymentoptions&quot;&gt;&lt;code&gt;paymentOptions&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#paymentoptions&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;paymentOptions&lt;/code&gt; is the subset of merchant specified payment options for which
your app has declared delegation support.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; paymentOptions&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bundle&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; extras&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBundle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;paymentOptions&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; requestPayerName&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paymentOptions&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;requestPayerName&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; requestPayerPhone&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paymentOptions&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;requestPayerPhone&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; requestPayerEmail&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paymentOptions&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;requestPayerEmail&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; requestShipping&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paymentOptions&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;requestShipping&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; shippingType&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paymentOptions&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shippingType&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;It can include the following parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requestPayerName&lt;/code&gt; - The boolean indicating whether or not the payer&#39;s name
is required.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestPayerPhone&lt;/code&gt; - The boolean indicating whether or not the payer&#39;s phone
is required.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestPayerEmail&lt;/code&gt; - The boolean indicating whether or not the payer&#39;s email
is required.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestShipping&lt;/code&gt; - The boolean indicating whether or not shipping information
is required.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shippingType&lt;/code&gt; - The string showing the type of shipping. Shipping type can be
&lt;code&gt;&amp;quot;shipping&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;delivery&amp;quot;&lt;/code&gt;, or &lt;code&gt;&amp;quot;pickup&amp;quot;&lt;/code&gt;. Your app can use this hint in its
UI when asking for the user&#39;s address or choice of shipping options.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shipping-options&quot;&gt;&lt;code&gt;shippingOptions&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#shipping-options&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;shippingOptions&lt;/code&gt; is the parcelable array of merchant specified shipping
options. This parameter will only exist when &lt;code&gt;paymentOptions.requestShipping == true&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; shippingOptions&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ShippingOption&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;br /&gt;    extras&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParcelableArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shippingOptions&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mapNotNull&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        p &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; Bundle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Each shipping option is a &lt;code&gt;Bundle&lt;/code&gt; with the following keys.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; - The shipping option identifier.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;label&lt;/code&gt; - The shipping option label shown to the user.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;amount&lt;/code&gt; - The shipping cost bundle containing &lt;code&gt;currency&lt;/code&gt; and &lt;code&gt;value&lt;/code&gt; keys with
string values.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;currency&lt;/code&gt; shows the currency of the shipping cost, as an
&lt;a href=&quot;https://www.iso.org/iso-4217-currency-codes.html&quot; rel=&quot;noopener&quot;&gt;ISO4217&lt;/a&gt; well-formed
3-letter alphabet code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt; shows the value of the shipping cost, as a &lt;a href=&quot;https://w3c.github.io/payment-request/#dfn-valid-decimal-monetary-value&quot; rel=&quot;noopener&quot;&gt;valid decimal monetary
value&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selected&lt;/code&gt; - Whether or not the shipping option should be selected when the
payment app displays the shipping options.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All keys other than the &lt;code&gt;selected&lt;/code&gt; have string values. &lt;code&gt;selected&lt;/code&gt; has a boolean
value.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bundle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; label&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bundle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; amount&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bundle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bundle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBundle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;amount&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; selected&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bundle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBoolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;selected&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2 id=&quot;provide-required-information-in-a-payment-response&quot;&gt;Provide required information in a payment response &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#provide-required-information-in-a-payment-response&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Your app should include the required additional information in its response to
the &lt;code&gt;PAY&lt;/code&gt;  activity.&lt;/p&gt;
&lt;p&gt;To do so the following parameters must be specified as Intent extras:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;payerName&lt;/code&gt; - The payer&#39;s full name. This should be a non-empty string when
&lt;code&gt;paymentOptions.requestPayerName&lt;/code&gt; is true.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;payerPhone&lt;/code&gt; - The payer&#39;s phone number. This should be a non-empty string when
&lt;code&gt;paymentOptions.requestPayerPhone&lt;/code&gt; is true.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;payerEmail&lt;/code&gt; - The payer&#39;s email address. This should be a non-empty string
when &lt;code&gt;paymentOptions.requestPayerEmail&lt;/code&gt; is true.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shippingAddress&lt;/code&gt; - The user-provided shipping address. This should be a
non-empty bundle when &lt;code&gt;paymentOptions.requestShipping&lt;/code&gt; is true. The bundle
should have the following keys which represent different parts in a &lt;a href=&quot;https://www.w3.org/TR/payment-request/#physical-addresses&quot; rel=&quot;noopener&quot;&gt;physical
address&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;city&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;countryCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dependentLocality&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;organization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postalCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;recipient&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;region&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sortingCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;addressLine&lt;/code&gt;
All keys other than the &lt;code&gt;addressLine&lt;/code&gt; have string values. The &lt;code&gt;addressLine&lt;/code&gt;
is an array of strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shippingOptionId&lt;/code&gt; - The identifier of the user-selected shipping option. This
should be a non-empty string when &lt;code&gt;paymentOptions.requestShipping&lt;/code&gt; is true.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;validate-payment-response&quot;&gt;Validate payment response &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#validate-payment-response&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If the activity result of a payment response received from the invoked payment
app is set to &lt;code&gt;RESULT_OK&lt;/code&gt;, then Chrome will check for required additional
information in its extras. If the validation fails Chrome will return a rejected
promise from &lt;code&gt;request.show()&lt;/code&gt; with one of the following developer-facing error
messages:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&#39;Payment app returned invalid response. Missing field &lt;span class=&quot;token string&quot;&gt;&quot;payerEmail&quot;&lt;/span&gt;.&#39;&lt;br /&gt;&#39;Payment app returned invalid response. Missing field &lt;span class=&quot;token string&quot;&gt;&quot;payerName&quot;&lt;/span&gt;.&#39;&lt;br /&gt;&#39;Payment app returned invalid response. Missing field &lt;span class=&quot;token string&quot;&gt;&quot;payerPhone&quot;&lt;/span&gt;.&#39;&lt;br /&gt;&#39;Payment app returned invalid shipping address in response.&#39;&lt;br /&gt;&#39;... is not a valid CLDR country code&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; should be &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; upper case letters &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;A-Z&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&#39;&lt;br /&gt;&#39;Payment app returned invalid response. Missing field &lt;span class=&quot;token string&quot;&gt;&quot;shipping option&quot;&lt;/span&gt;.&#39;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The following code sample is an example of a valid response:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;fun&lt;/span&gt; Intent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;populateRequestedPaymentOptions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestPayerName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;putExtra&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;payerName&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;John Smith&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestPayerPhone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;putExtra&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;payerPhone&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4169158200&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestPayerEmail&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;putExtra&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;payerEmail&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;john.smith@gmail.com&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestShipping&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; address&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bundle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Bundle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;countryCode&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;CA&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; addressLines&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Array&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;String&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;br /&gt;                arrayOf&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;String&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;111 Richmond st. West&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putStringArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;addressLines&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; addressLines&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;region&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Ontario&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Toronto&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;postalCode&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;M5H2G4&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;recipient&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;John Smith&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;putString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;phone&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4169158200&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;putExtra&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shippingAddress&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;putExtra&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shippingOptionId&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;standard&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2 id=&quot;optional-support-dynamic-flow&quot;&gt;Optional: Support dynamic flow &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#optional-support-dynamic-flow&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sometimes the total cost of a transaction increases, such as when the user
chooses the express shipping option, or when the list of available shipping
options or their prices changes when the user chooses an international shipping
address. When your app provides the user-selected shipping address or option, it
should be able to notify the merchant about any shipping address or option
changes and show the user the updated payment details (provided by the
merchant).&lt;/p&gt;
&lt;h3 id=&quot;aidl&quot;&gt;AIDL &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#aidl&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To notify the merchant about new changes use the &lt;code&gt;PaymentDetailsUpdateService&lt;/code&gt;
service declared in Chrome&#39;s AndroidManifest.xml. To use this service create two
AIDL files with the following content:&lt;/p&gt;
&lt;p class=&quot;label&quot;&gt;app/src/main/aidl/org/chromium/components/payments/IPaymentDetailsUpdateService&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;chromium&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;components&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;payments&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; android&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Bundle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; IPaymentDetailsUpdateServiceCallback &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    oneway void &lt;span class=&quot;token function&quot;&gt;updateWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; Bundle updatedPaymentDetails&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    oneway void &lt;span class=&quot;token function&quot;&gt;paymentDetailsNotUpdated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p class=&quot;label&quot;&gt;app/src/main/aidl/org/chromium/components/payments/IPaymentDetailsUpdateServiceCallback&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;chromium&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;components&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;payments&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; android&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Bundle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;chromium&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;components&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;payments&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IPaymentDetailsUpdateServiceCallback&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; IPaymentDetailsUpdateService &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    oneway void &lt;span class=&quot;token function&quot;&gt;changePaymentMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; Bundle paymentHandlerMethodData&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;            IPaymentDetailsUpdateServiceCallback callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    oneway void &lt;span class=&quot;token function&quot;&gt;changeShippingOption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; String shippingOptionId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;            IPaymentDetailsUpdateServiceCallback callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    oneway void &lt;span class=&quot;token function&quot;&gt;changeShippingAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; Bundle shippingAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;            IPaymentDetailsUpdateServiceCallback callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h3 id=&quot;notify-the-merchant-about-changes-in-the-user-selected-payment-method,-shipping-address,-or-shipping-option&quot;&gt;Notify the merchant about changes in the user selected payment method, shipping address, or shipping option &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#notify-the-merchant-about-changes-in-the-user-selected-payment-method,-shipping-address,-or-shipping-option&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fun&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;// The action is introduced in Chrome version 92, which supports the service in Chrome&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;// and other browsers (e.g., WebLayer).&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; newIntent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Intent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.chromium.intent.action.UPDATE_PAYMENT_DETAILS&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setPackage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;callingBrowserPackage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;packageManager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolveService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newIntent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PackageManager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;GET_RESOLVED_FILTER&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token comment&quot;&gt;// Fallback to Chrome-only approach.&lt;/span&gt;&lt;br /&gt;        newIntent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setClassName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;br /&gt;            callingBrowserPackage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token string-literal singleline&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.chromium.components.payments.PaymentDetailsUpdateService&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        newIntent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; IPaymentDetailsUpdateService&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    isBound &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bindService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newIntent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; connection&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;BIND_AUTO_CREATE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; connection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ServiceConnection &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fun&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onServiceConnected&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;className&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ComponentName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; service&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; IBinder&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; service &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; IPaymentDetailsUpdateService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Stub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;asInterface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;service&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isOptionChange&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;                service&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changeShippingOption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedOptionId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isAddressChange&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;                service&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changeShippingAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;                service&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changePaymentMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;methodData&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; RemoteException&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token comment&quot;&gt;// Handle the remote exception&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;callingPackageName&lt;/code&gt; used for the service&#39;s start intent can have one of the
following values depending on the browser that has initiated the payment
request.&lt;/p&gt;
&lt;div class=&quot;table-wrapper&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Chrome Channel&lt;/th&gt;
        &lt;th&gt;Package Name&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;Stable&lt;/td&gt;
        &lt;td&gt;
          &lt;code&gt;&quot;com.android.chrome&quot;&lt;/code&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Beta&lt;/td&gt;
        &lt;td&gt;
          &lt;code&gt;&quot;com.chrome.beta&quot;&lt;/code&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dev&lt;/td&gt;
        &lt;td&gt;
          &lt;code&gt;&quot;com.chrome.dev&quot;&lt;/code&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Canary&lt;/td&gt;
        &lt;td&gt;
          &lt;code&gt;&quot;com.chrome.canary&quot;&lt;/code&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Chromium&lt;/td&gt;
        &lt;td&gt;
          &lt;code&gt;&quot;org.chromium.chrome&quot;&lt;/code&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Google Quick Search Box (a WebLayer embedder)&lt;/td&gt;
        &lt;td&gt;
          &lt;code&gt;&quot;com.google.android.googlequicksearchbox&quot;&lt;/code&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;h4 id=&quot;changepaymentmethod&quot;&gt;&lt;code&gt;changePaymentMethod&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#changepaymentmethod&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Notifies the merchant about changes in the user-selected payment method. The
&lt;code&gt;paymentHandlerMethodData&lt;/code&gt; bundle contains &lt;code&gt;methodName&lt;/code&gt; and optional &lt;code&gt;details&lt;/code&gt;
keys both with string values. Chrome will check for a non-empty bundle with a
non-empty &lt;code&gt;methodName&lt;/code&gt; and send an &lt;code&gt;updatePaymentDetails&lt;/code&gt; with one of the
following error messages via &lt;code&gt;callback.updateWith&lt;/code&gt; if the validation fails.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&#39;Method data required.&#39;&lt;br /&gt;&#39;Method name required.&#39;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h4 id=&quot;changeshippingoption&quot;&gt;&lt;code&gt;changeShippingOption&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#changeshippingoption&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Notifies the merchant about changes in the user-selected shipping option.
&lt;code&gt;shippingOptionId&lt;/code&gt; should be the identifier of one of the merchant-specified
shipping options. Chrome will check for a non-empty &lt;code&gt;shippingOptionId&lt;/code&gt; and send
an &lt;code&gt;updatePaymentDetails&lt;/code&gt; with the following error message via
&lt;code&gt;callback.updateWith&lt;/code&gt; if the validation fails.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&#39;Shipping option identifier required.&#39;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h4 id=&quot;changeshippingaddress&quot;&gt;&lt;code&gt;changeShippingAddress&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#changeshippingaddress&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Notifies the merchant about changes in the user-provided shipping address. Chrome
will check for a non-empty &lt;code&gt;shippingAddress&lt;/code&gt; bundle with a valid &lt;code&gt;countryCode&lt;/code&gt;
and send an &lt;code&gt;updatePaymentDetails&lt;/code&gt; with the following error message via
&lt;code&gt;callback.updateWith&lt;/code&gt; if the validation fails.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&#39;Payment app returned invalid shipping address in response.&#39;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h4 id=&quot;invalid-state-error-message&quot;&gt;Invalid state error message &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#invalid-state-error-message&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If Chrome encounters an invalid state upon receiving any of the change requests
it will call &lt;code&gt;callback.updateWith&lt;/code&gt; with a redacted &lt;code&gt;updatePaymentDetails&lt;/code&gt;
bundle. The bundle will only contain the &lt;code&gt;error&lt;/code&gt; key with &lt;code&gt;&amp;quot;Invalid state&amp;quot;&lt;/code&gt;.
Examples of an invalid state are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When Chrome is still waiting for the merchant&#39;s response to a previous change
(such as an ongoing change event).&lt;/li&gt;
&lt;li&gt;The payment-app-provided shipping option identifier does not belong to any of
the merchant-specified shipping options.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;receive-updated-payment-details-from-the-merchant&quot;&gt;Receive updated payment details from the merchant &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/android-payment-apps-delegation/#receive-updated-payment-details-from-the-merchant&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;pre class=&quot;language-kotlin&quot;&gt;&lt;code class=&quot;language-kotlin&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fun&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unbind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isBound&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;unbindService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        isBound &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;val&lt;/span&gt; callback&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; IPaymentDetailsUpdateServiceCallback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; IPaymentDetailsUpdateServiceCallback&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Stub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fun&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;paymentDetailsNotUpdated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token comment&quot;&gt;// Payment request details have not changed.&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token function&quot;&gt;unbind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fun&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;updateWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;updatedPaymentDetails&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bundle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            newPaymentDetails &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; updatedPaymentDetails&lt;br /&gt;            &lt;span class=&quot;token function&quot;&gt;unbind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;updatePaymentDetails&lt;/code&gt; is the bundle equivalent to the
&lt;a href=&quot;https://w3c.github.io/payment-handler/#the-paymentrequestdetailsupdate&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;PaymentRequestDetailsUpdate&lt;/code&gt;&lt;/a&gt;
&lt;a href=&quot;https://www.w3.org/TR/WebIDL-1/&quot; rel=&quot;noopener&quot;&gt;WebIDL&lt;/a&gt; dictionary (after redacting the
&lt;code&gt;modifiers&lt;/code&gt; field) and contains the following optional keys:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;total&lt;/code&gt; - A bundle containing &lt;code&gt;currency&lt;/code&gt;  and &lt;code&gt;value&lt;/code&gt; keys, both keys have
string values&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shippingOptions&lt;/code&gt; - The parcelable array of &lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#shipping-options&quot;&gt;shipping
options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;error&lt;/code&gt; - A string containing a generic error message (e.g. when
&lt;code&gt;changeShippingOption&lt;/code&gt; does not provide a valid shipping option identifier)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stringifiedPaymentMethodErrors&lt;/code&gt; - A JSON string representing validation
errors for the payment method&lt;/li&gt;
&lt;li&gt;&lt;code&gt;addressErrors&lt;/code&gt; - A bundle with optional keys identical to &lt;a href=&quot;https://web.dev/android-payment-apps-delegation/#provide-required-information-in-a-payment-response&quot;&gt;shipping
address&lt;/a&gt; and string
values. Each key represents a validation error related to its corresponding
part of the shipping address.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An absent key means its value has not changed.&lt;/p&gt;
</content>
    <author>
      <name>Sahel Sharify</name>
    </author>
  </entry>
</feed>
