Add a flag to omit deprecated parameters in payment Android intents

Feature flag: AndroidPaymentIntentsOmitDeprecatedParameters
(Disabled by default)

Design: go/google-pay-in-webview-android-intents-dd

Bug: 40849135
Fixed: 376270117
Change-Id: I7d14521ef0cc90abac5e8970f219503835a569ab
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6020055
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Reviewed-by: Darwin Yang <darwinyang@chromium.org>
Commit-Queue: Rouslan Solomakhin <rouslan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1383776}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java
index 828474b..f97eedf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java
@@ -69,6 +69,7 @@
 @RunWith(BaseJUnit4ClassRunner.class)
 @Batch(AndroidPaymentAppFinderUnitTest.PAYMENTS_BROWSER_UNIT_TESTS)
 @Features.EnableFeatures({PaymentFeatureList.UPDATE_PAYMENT_DETAILS_INTENT_FILTER_IN_PAYMENT_APP})
+@Features.DisableFeatures({PaymentFeatureList.ANDROID_PAYMENT_INTENTS_OMIT_DEPRECATED_PARAMETERS})
 public class AndroidPaymentAppFinderUnitTest extends BlankUiTestActivityTestCase {
     // Collection of payments unit tests that require the browser process to be initialized.
     static final String PAYMENTS_BROWSER_UNIT_TESTS = "PaymentsBrowserUnitTests";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/WebPaymentIntentHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/WebPaymentIntentHelperTest.java
index 362a2668..b20ead5f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/WebPaymentIntentHelperTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/WebPaymentIntentHelperTest.java
@@ -133,7 +133,8 @@
                         displayItems,
                         modifiers,
                         paymentOptions,
-                        shippingOptions);
+                        shippingOptions,
+                        /* removeDeprecatedFields= */ false);
         Assert.assertEquals(WebPaymentIntentHelper.ACTION_PAY, intent.getAction());
         Assert.assertEquals("package.name", intent.getComponent().getPackageName());
         Assert.assertEquals("activity.name", intent.getComponent().getClassName());
@@ -251,7 +252,8 @@
                         displayItems,
                         modifiers,
                         /* paymentOptions= */ null,
-                        /* shippingOptions= */ null);
+                        /* shippingOptions= */ null,
+                        /* removeDeprecatedFields= */ false);
         Bundle bundle = intent.getExtras();
         Assert.assertNotNull(bundle);
 
@@ -291,6 +293,58 @@
     @Test
     @SmallTest
     @Feature({"Payments"})
+    public void verifyRemoveDeprecatedFieldsFromPayIntent() throws Throwable {
+        Map<String, PaymentMethodData> methodDataMap = new HashMap<String, PaymentMethodData>();
+        PaymentMethodData bobPayMethodData = new PaymentMethodData("method", "null");
+        methodDataMap.put("bobPay", bobPayMethodData);
+
+        PaymentItem total = new PaymentItem(new PaymentCurrencyAmount("CAD", "200"));
+
+        List<PaymentItem> displayItems = new ArrayList<PaymentItem>();
+        displayItems.add(new PaymentItem(new PaymentCurrencyAmount("CAD", "50")));
+        displayItems.add(new PaymentItem(new PaymentCurrencyAmount("CAD", "150")));
+
+        Map<String, PaymentDetailsModifier> modifiers =
+                new HashMap<String, PaymentDetailsModifier>();
+        PaymentDetailsModifier modifier = new PaymentDetailsModifier(total, bobPayMethodData);
+        modifiers.put("modifier_key", modifier);
+
+        byte[][] certificateChain = new byte[][] {{0}};
+
+        Intent intent =
+                WebPaymentIntentHelper.createPayIntent(
+                        "package.name",
+                        "activity.name",
+                        "payment.request.id",
+                        "merchant.name",
+                        "schemeless.origin",
+                        "schemeless.iframe.origin",
+                        certificateChain,
+                        methodDataMap,
+                        total,
+                        displayItems,
+                        modifiers,
+                        /* paymentOptions= */ null,
+                        /* shippingOptions= */ null,
+                        /* removeDeprecatedFields= */ true);
+        Bundle bundle = intent.getExtras();
+        Assert.assertNotNull(bundle);
+
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_ID));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_ORIGIN));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_IFRAME_ORIGIN));
+        Assert.assertNull(
+                bundle.getParcelableArray(
+                        WebPaymentIntentHelper.EXTRA_DEPRECATED_CERTIFICATE_CHAIN));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_METHOD_NAME));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_DATA));
+        Assert.assertNull(bundle.getParcelable(WebPaymentIntentHelper.EXTRA_DEPRECATED_DATA_MAP));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_DETAILS));
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"Payments"})
     public void nullPackageNameExceptionTest() throws Throwable {
         thrown.expect(IllegalArgumentException.class);
         thrown.expectMessage("packageName should not be null or empty.");
@@ -314,7 +368,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -343,7 +398,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -372,7 +428,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -401,7 +458,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -430,7 +488,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -456,7 +515,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -485,7 +545,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -514,7 +575,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -543,7 +605,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -572,7 +635,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -603,7 +667,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     // Verify that a null value in methodDataMap would trigger an exception.
@@ -632,7 +697,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     // Verify that a null methodDataMap would trigger an exception.
@@ -658,7 +724,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     // Verify that an empty methodDataMap would trigger an exception.
@@ -686,7 +753,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -713,7 +781,8 @@
                 /* displayItems= */ null,
                 /* modifiers= */ null,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     // Verify that a null value in the modifier map would trigger an exception.
@@ -747,7 +816,8 @@
                 /* displayItems= */ null,
                 modifiers,
                 /* paymentOptions= */ null,
-                /* shippingOptions= */ null);
+                /* shippingOptions= */ null,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -1065,7 +1135,8 @@
                         "schemeless.iframe.origin",
                         certificateChain,
                         methodDataMap,
-                        /* clearIdFields= */ false);
+                        /* clearIdFields= */ false,
+                        /* removeDeprecatedFields= */ false);
         Assert.assertEquals("package.name", intent.getComponent().getPackageName());
         Assert.assertEquals("service.name", intent.getComponent().getClassName());
         Bundle bundle = intent.getExtras();
@@ -1097,6 +1168,82 @@
     @Test
     @SmallTest
     @Feature({"Payments"})
+    public void verifyDeprecatedFieldsInIsReadyToPayIntent() throws Throwable {
+        Map<String, PaymentMethodData> methodDataMap = new HashMap<String, PaymentMethodData>();
+        PaymentMethodData bobPayMethodData =
+                new PaymentMethodData("bobPayMethod", "{\"key\":\"value\"}");
+        PaymentMethodData maxPayMethodData = new PaymentMethodData("maxPayMethod", "{}");
+        methodDataMap.put("bobPay", bobPayMethodData);
+        methodDataMap.put("maxPay", maxPayMethodData);
+
+        byte[][] certificateChain = new byte[][] {{0}};
+
+        Intent intent =
+                WebPaymentIntentHelper.createIsReadyToPayIntent(
+                        "package.name",
+                        "service.name",
+                        "schemeless.origin",
+                        "schemeless.iframe.origin",
+                        certificateChain,
+                        methodDataMap,
+                        /* clearIdFields= */ false,
+                        /* removeDeprecatedFields= */ false);
+        Bundle bundle = intent.getExtras();
+        Assert.assertNotNull(bundle);
+        Assert.assertEquals(
+                "schemeless.origin", bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_ORIGIN));
+        Assert.assertEquals(
+                "schemeless.iframe.origin",
+                bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_IFRAME_ORIGIN));
+        Assert.assertNotNull(
+                bundle.getParcelableArray(
+                        WebPaymentIntentHelper.EXTRA_DEPRECATED_CERTIFICATE_CHAIN));
+        Assert.assertEquals(
+                "bobPay", bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_METHOD_NAME));
+        Assert.assertEquals(
+                "{\"key\":\"value\"}", bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_DATA));
+        Assert.assertNotNull(
+                bundle.getParcelable(WebPaymentIntentHelper.EXTRA_DEPRECATED_DATA_MAP));
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"Payments"})
+    public void verifyRemoveDeprecatedFieldsFromIsReadyToPayIntent() throws Throwable {
+        Map<String, PaymentMethodData> methodDataMap = new HashMap<String, PaymentMethodData>();
+        PaymentMethodData bobPayMethodData =
+                new PaymentMethodData("bobPayMethod", "{\"key\":\"value\"}");
+        PaymentMethodData maxPayMethodData = new PaymentMethodData("maxPayMethod", "{}");
+        methodDataMap.put("bobPay", bobPayMethodData);
+        methodDataMap.put("maxPay", maxPayMethodData);
+
+        byte[][] certificateChain = new byte[][] {{0}};
+
+        Intent intent =
+                WebPaymentIntentHelper.createIsReadyToPayIntent(
+                        "package.name",
+                        "service.name",
+                        "schemeless.origin",
+                        "schemeless.iframe.origin",
+                        certificateChain,
+                        methodDataMap,
+                        /* clearIdFields= */ false,
+                        /* removeDeprecatedFields= */ true);
+        Bundle bundle = intent.getExtras();
+        Assert.assertNotNull(bundle);
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_ORIGIN));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_IFRAME_ORIGIN));
+        Assert.assertNull(
+                bundle.getParcelableArray(
+                        WebPaymentIntentHelper.EXTRA_DEPRECATED_CERTIFICATE_CHAIN));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_METHOD_NAME));
+        Assert.assertNull(bundle.get(WebPaymentIntentHelper.EXTRA_DEPRECATED_DATA));
+        Assert.assertNull(bundle.getParcelable(WebPaymentIntentHelper.EXTRA_DEPRECATED_DATA_MAP));
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"Payments"})
     public void createIsReadyToPayIntentWithoutIdentity() throws Throwable {
         Map<String, PaymentMethodData> methodDataMap = new HashMap<String, PaymentMethodData>();
         PaymentMethodData bobPayMethodData =
@@ -1115,7 +1262,8 @@
                         "schemeless.iframe.origin",
                         certificateChain,
                         methodDataMap,
-                        /* clearIdFields= */ true);
+                        /* clearIdFields= */ true,
+                        /* removeDeprecatedFields= */ false);
         Assert.assertEquals("package.name", intent.getComponent().getPackageName());
         Assert.assertEquals("service.name", intent.getComponent().getClassName());
         Bundle bundle = intent.getExtras();
@@ -1151,7 +1299,8 @@
                 "schemeless.iframe.origin",
                 /* certificateChain= */ null,
                 methodDataMap,
-                /* clearIdFields= */ false);
+                /* clearIdFields= */ false,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
@@ -1173,7 +1322,8 @@
                 "schemeless.iframe.origin",
                 /* certificateChain= */ null,
                 methodDataMap,
-                /* clearIdFields= */ true);
+                /* clearIdFields= */ true,
+                /* removeDeprecatedFields= */ false);
     }
 
     @Test
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
index c25ceba..34cdd32 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
@@ -57,6 +57,7 @@
     @Nullable private final String mPaymentDetailsUpdateServiceName;
     private final SupportedDelegations mSupportedDelegations;
     private final boolean mShowReadyToPayDebugInfo;
+    private final boolean mRemoveDeprecatedFields;
 
     private IsReadyToPayCallback mIsReadyToPayCallback;
     private InstrumentDetailsCallback mInstrumentDetailsCallback;
@@ -233,6 +234,7 @@
      * @param supportedDelegations Delegations which this app can support.
      * @param showReadyToPayDebugInfo Whether IS_READY_TO_PAY intent should be displayed in a debug
      *     dialog.
+     * @param removeDeprecatedFields Whether intents should omit deprecated fields.
      */
     public AndroidPaymentApp(
             Launcher launcher,
@@ -245,7 +247,8 @@
             boolean isIncognito,
             @Nullable String appToHide,
             SupportedDelegations supportedDelegations,
-            boolean showReadyToPayDebugInfo) {
+            boolean showReadyToPayDebugInfo,
+            boolean removeDeprecatedFields) {
         super(packageName, label, null, icon);
         ThreadUtils.assertOnUiThread();
         mHandler = new Handler();
@@ -265,6 +268,7 @@
         mApplicationIdentifierToHide = appToHide;
         mSupportedDelegations = supportedDelegations;
         mShowReadyToPayDebugInfo = showReadyToPayDebugInfo;
+        mRemoveDeprecatedFields = removeDeprecatedFields;
         mIsPreferred = false;
     }
 
@@ -358,7 +362,8 @@
                                 methodDataMap),
                         // TODO(crbug.com/40212375): Re-enable clearing of identity for
                         // IS_READY_TO_PAY
-                        /* clearIdFields= */ false);
+                        /* clearIdFields= */ false,
+                        mRemoveDeprecatedFields);
         if (mBypassIsReadyToPayServiceInTest) {
             respondToIsReadyToPayQuery(true);
             return;
@@ -513,7 +518,8 @@
                                 modifiers),
                         mPaymentOptions,
                         WebPaymentIntentHelperTypeConverter.fromMojoShippingOptionList(
-                                shippingOptions));
+                                shippingOptions),
+                        mRemoveDeprecatedFields);
 
         mLauncher.launchPaymentApp(
                 payIntent, this::notifyErrorInvokingPaymentApp, this::onIntentCompleted);
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
index 8f73035..c5c07dcc 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
@@ -700,7 +700,11 @@
                             webAppIdCanDeduped,
                             appSupportedDelegations,
                             PaymentFeatureList.isEnabled(
-                                    PaymentFeatureList.SHOW_READY_TO_PAY_DEBUG_INFO));
+                                    PaymentFeatureList.SHOW_READY_TO_PAY_DEBUG_INFO),
+                            /* removeDeprecatedFields= */ PaymentFeatureList
+                                    .isEnabledOrExperimentalFeaturesEnabled(
+                                            PaymentFeatureList
+                                                    .ANDROID_PAYMENT_INTENTS_OMIT_DEPRECATED_PARAMETERS));
             mValidApps.put(packageName, app);
         }
 
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
index 6ca50ac..0431f5f 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
@@ -16,6 +16,8 @@
 @JNINamespace("payments::android")
 public abstract class PaymentFeatureList {
     /** Alphabetical: */
+    public static final String ANDROID_PAYMENT_INTENTS_OMIT_DEPRECATED_PARAMETERS =
+            "AndroidPaymentIntentsOmitDeprecatedParameters";
     public static final String ENFORCE_FULL_DELEGATION = "EnforceFullDelegation";
     public static final String GOOGLE_PAY_VIA_ANDROID_INTENTS = "GooglePayViaAndroidIntents";
     public static final String GPAY_APP_DYNAMIC_UPDATE = "GPayAppDynamicUpdate";
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
index bdf95c5..706a335 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
@@ -249,6 +249,8 @@
      * @param paymentOptions The relevant merchant requested payment options. OK to be null.
      * @param shippingOptions Merchant specified available shipping options. Should be non-empty
      *          when paymentOptions.requestShipping is true.
+     * @param removeDeprecatedFields Whether the deprecated fields should be omitted from the
+     *          intent.
      * @return The intent to invoke the payment app.
      */
     public static Intent createPayIntent(
@@ -264,7 +266,8 @@
             @Nullable List<PaymentItem> displayItems,
             @Nullable Map<String, PaymentDetailsModifier> modifiers,
             @Nullable PaymentOptions paymentOptions,
-            @Nullable List<PaymentShippingOption> shippingOptions) {
+            @Nullable List<PaymentShippingOption> shippingOptions,
+            boolean removeDeprecatedFields) {
         Intent payIntent = new Intent();
         checkStringNotEmpty(activityName, "activityName");
         checkStringNotEmpty(packageName, "packageName");
@@ -282,7 +285,8 @@
                         displayItems,
                         modifiers,
                         paymentOptions,
-                        shippingOptions));
+                        shippingOptions,
+                        removeDeprecatedFields));
         return payIntent;
     }
 
@@ -321,6 +325,8 @@
      *     a public key. The map should have at least one entry.
      * @param clearIdFields When this feature flag is enabled, the IS_READY_TO_PAY intent should NOT
      *     pass merchant and user identity to the payment app.
+     * @param removeDeprecatedFields Whether the deprecated fields should be omitted from the
+     *     intent.
      * @return The intent to invoke the service.
      */
     public static Intent createIsReadyToPayIntent(
@@ -330,7 +336,8 @@
             String schemelessIframeOrigin,
             @Nullable byte[][] certificateChain,
             Map<String, PaymentMethodData> methodDataMap,
-            boolean clearIdFields) {
+            boolean clearIdFields,
+            boolean removeDeprecatedFields) {
         Intent isReadyToPayIntent = new Intent();
         checkStringNotEmpty(serviceName, "serviceName");
         checkStringNotEmpty(packageName, "packageName");
@@ -342,6 +349,7 @@
                     schemelessIframeOrigin,
                     certificateChain,
                     methodDataMap,
+                    removeDeprecatedFields,
                     extras);
         }
         isReadyToPayIntent.putExtras(extras);
@@ -375,7 +383,8 @@
             @Nullable List<PaymentItem> displayItems,
             @Nullable Map<String, PaymentDetailsModifier> modifiers,
             @Nullable PaymentOptions paymentOptions,
-            @Nullable List<PaymentShippingOption> shippingOptions) {
+            @Nullable List<PaymentShippingOption> shippingOptions,
+            boolean removeDeprecatedFields) {
         Bundle extras = new Bundle();
         checkStringNotEmpty(id, "id");
         extras.putString(EXTRA_PAYMENT_REQUEST_ID, id);
@@ -415,9 +424,16 @@
         }
 
         addCommonExtrasWithIdentity(
-                schemelessOrigin, schemelessIframeOrigin, certificateChain, methodDataMap, extras);
+                schemelessOrigin,
+                schemelessIframeOrigin,
+                certificateChain,
+                methodDataMap,
+                removeDeprecatedFields,
+                extras);
 
-        return addDeprecatedPayIntentExtras(id, total, displayItems, extras);
+        return removeDeprecatedFields
+                ? extras
+                : addDeprecatedPayIntentExtras(id, total, displayItems, extras);
     }
 
     // Adds to the given `extras` bundle the common fields for both the IS_READY_TO_PAY (if identity
@@ -427,6 +443,7 @@
             String schemelessIframeOrigin,
             @Nullable byte[][] certificateChain,
             Map<String, PaymentMethodData> methodDataMap,
+            boolean removeDeprecatedFields,
             Bundle extras) {
         checkStringNotEmpty(schemelessOrigin, "schemelessOrigin");
         extras.putString(EXTRA_TOP_ORIGIN, schemelessOrigin);
@@ -451,13 +468,15 @@
         }
         extras.putParcelable(EXTRA_METHOD_DATA, methodDataBundle);
 
-        return addDeprecatedCommonExtrasWithIdentity(
-                schemelessOrigin,
-                schemelessIframeOrigin,
-                serializedCertificateChain,
-                methodDataMap,
-                methodDataBundle,
-                extras);
+        return removeDeprecatedFields
+                ? extras
+                : addDeprecatedCommonExtrasWithIdentity(
+                        schemelessOrigin,
+                        schemelessIframeOrigin,
+                        serializedCertificateChain,
+                        methodDataMap,
+                        methodDataBundle,
+                        extras);
     }
 
     // TODO(crbug.com/40849135): Remove this method.
diff --git a/components/payments/content/android/javatests/src/org/chromium/components/payments/AndroidPaymentAppUnitTest.java b/components/payments/content/android/javatests/src/org/chromium/components/payments/AndroidPaymentAppUnitTest.java
index 7f795e3..798b8a4 100644
--- a/components/payments/content/android/javatests/src/org/chromium/components/payments/AndroidPaymentAppUnitTest.java
+++ b/components/payments/content/android/javatests/src/org/chromium/components/payments/AndroidPaymentAppUnitTest.java
@@ -131,7 +131,8 @@
                         /* isIncognito= */ false,
                         /* appToHide= */ null,
                         new SupportedDelegations(),
-                        showReadyToPayDebugInfo);
+                        showReadyToPayDebugInfo,
+                        /* removeDeprecatedFields= */ false);
         app.addMethodName("https://company.com/pay");
         return app;
     }
diff --git a/components/payments/content/android/payment_feature_map.cc b/components/payments/content/android/payment_feature_map.cc
index 8e34a4b..59c06e3 100644
--- a/components/payments/content/android/payment_feature_map.cc
+++ b/components/payments/content/android/payment_feature_map.cc
@@ -4,6 +4,8 @@
 
 #include "components/payments/content/android/payment_feature_map.h"
 
+#include <jni.h>
+
 #include "base/android/feature_map.h"
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
@@ -32,6 +34,7 @@
     &features::kGPayAppDynamicUpdate,
     &features::kWebPaymentsExperimentalFeatures,
     &features::kWebPaymentsSingleAppUiSkip,
+    &kAndroidPaymentIntentsOmitDeprecatedParameters,
     &kGooglePayViaAndroidIntents,
     &kOmitParametersInReadyToPay,
     &kShowReadyToPayDebugInfo,
@@ -52,6 +55,9 @@
 }
 
 // Android only features.
+BASE_FEATURE(kAndroidPaymentIntentsOmitDeprecatedParameters,
+             "AndroidPaymentIntentsOmitDeprecatedParameters",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kGooglePayViaAndroidIntents,
              "GooglePayViaAndroidIntents",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/payments/content/android/payment_feature_map.h b/components/payments/content/android/payment_feature_map.h
index f9d5ae5..06f38b6a 100644
--- a/components/payments/content/android/payment_feature_map.h
+++ b/components/payments/content/android/payment_feature_map.h
@@ -5,8 +5,6 @@
 #ifndef COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_FEATURE_MAP_H_
 #define COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_FEATURE_MAP_H_
 
-#include <jni.h>
-
 #include "base/feature_list.h"
 
 namespace payments {
@@ -14,6 +12,10 @@
 
 // Android only payment features in alphabetical order:
 
+// If enabled, remove the deprecated parameters from the intents that are sent
+// to Android payment apps.
+BASE_DECLARE_FEATURE(kAndroidPaymentIntentsOmitDeprecatedParameters);
+
 // If enabled, use Android intents for the following payment methods:
 // - https://google.com/pay
 // - https://pay.google.com/authentication.