Skip to content

Conversation

@frosso
Copy link
Contributor

@frosso frosso commented Dec 4, 2025

Fixes WOOPMNT-5546

Changes proposed in this Pull Request

In #11144 we migrated Google Pay/Apple Pay to have their own payment method definition.
That change was iterative, and left some inconsistency: all the other payment methods have their own enabled option. But Google Pay/Apple Pay still relied on the payment_request option on the main gateway class.

With these changes, I'd like to bring consistency to that.
These changes are needed as part of the Dynamic "Place Order" Button project (larger PR here), which aims to having Google Pay and Apple Pay to be displayed as part of the main gateway list.

After this PR, there's another slight inconsistency: the settings endpoint isn't returning google_pay or apple_pay in the enabled_payment_method_ids array.
That change would affect the Settings UI/JS. I am not implementing that change (yet) because it would blow this PR even further 😅

Testing instructions

1. Test the migration

  • without checking out these changes, enable Google Pay/Apple Pay in the WooPayments settings
  • Look into your DB: SELECT * FROM wp_options WHERE option_name = 'woocommerce_woocommerce_payments_settings'
  • The option should be present, with a payment_request key with value yes
  • In your DB, update the woocommerce_woocommerce_payments_version option to a previous version, like 10.1.0
  • Check out the changes in this PR
  • Load any admin page (e.g.: the WooPayments settings page)
  • Google Pay/Apple Pay should still appear as enabled in the WooPayments settings page
  • Now in your DB:
    • woocommerce_woocommerce_payments_version should be updated to a newer version
    • woocommerce_woocommerce_payments_settings should no longer contain the payment_request key
    • woocommerce_woocommerce_payments_apple_pay_settings should exist with enabled = yes

2. apple_pay & google_pay not in enabled_payment_method_ids

  • Navigate to Payments > Settings
  • Inspect the network tab
  • Look for the /wp-json/wc/v3/payments/settings endpoint response
  • The enabled_payment_method_ids array should not contain google_pay or apple_pay
  • The available_payment_method_ids array should contain google_pay and apple_pay
  • Enable Google Pay/Apple Pay in the settings, save the changes
  • As a customer, add a product to the cart and navigate to the checkout page
  • window.wcpayConfig.paymentMethodsConfig should not contain google_pay or apple_pay

3. test saving the settings

  • As a merchant, navigate to Payments > Settings
  • Disable Google Pay/Apple Pay
  • Save the settings
  • As a customer, navigate to a product page for a simple product
  • Google Pay/Apple Pay should not be displayed
  • Add the product to the cart
  • Navigate to the cart
  • Google Pay/Apple Pay should not be displayed
  • Navigate to the checkout page
  • Google Pay/Apple Pay should not be displayed

Tip

After updating the settings, woocommerce_woocommerce_payments_apple_pay_settings and woocommerce_woocommerce_payments_google_pay_settings might include some additional keys, other than enabled. That's normal.


  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@frosso frosso requested a review from Copilot December 4, 2025 17:07
Copilot finished reviewing on behalf of frosso December 4, 2025 17:10
@github-actions
Copy link
Contributor

github-actions bot commented Dec 4, 2025

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 11182 or branch name refactor/google-pay-apple-pay-settings-storage in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: 61940e5
  • Build time: 2025-12-05 11:30:06 UTC

Note: the build is updated when a new commit is pushed to this PR.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the Express Checkout Elements (ECE) settings to improve consistency by migrating from a single payment_request setting on the card gateway to individual enabled settings for Apple Pay and Google Pay gateways. This change provides better separation of concerns and clearer settings management.

Key Changes

  • Introduced a migration class to transition existing payment_request settings to individual Apple Pay and Google Pay gateway enabled states
  • Updated is_payment_request_enabled() method to check the enabled status of Apple Pay and Google Pay gateways instead of reading a single option
  • Modified Apple Pay domain registration to listen to Apple Pay gateway settings instead of card gateway settings

Reviewed changes

Copilot reviewed 20 out of 20 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
includes/migrations/class-migrate-payment-request-to-express-checkout-enabled.php New migration class to convert legacy payment_request setting to individual gateway enabled settings
includes/class-wc-payment-gateway-wcpay.php Updated is_payment_request_enabled() to check Apple Pay/Google Pay gateway enabled states
includes/class-wc-payments-apple-pay-registration.php Refactored to listen to Apple Pay gateway settings and use constant for error option name
includes/admin/class-wc-rest-payments-settings-controller.php Updated REST API to read/write Apple Pay and Google Pay gateway enabled settings
includes/class-wc-payments-onboarding-service.php Modified to enable/disable Apple Pay and Google Pay gateways based on capabilities
includes/class-wc-payments-account.php Updated to use new is_payment_request_enabled() method
includes/class-wc-payments-status.php Updated status report to use new method
includes/class-duplicates-detection-service.php Added method check for is_payment_request_enabled()
includes/express-checkout/class-wc-payments-express-checkout-button-handler.php Updated to use new is_payment_request_enabled() method
includes/express-checkout/class-wc-payments-express-checkout-button-display-handler.php Updated to use new is_payment_request_enabled() method
includes/class-wc-payments.php Registered migration hook
includes/class-wc-payments-blocks-payment-method.php Removed unnecessary blank line
tests/unit/test-class-wc-payments-apple-pay-registration.php Updated tests for Apple Pay registration with new gateway-based checks and helper methods
tests/unit/test-class-wc-payment-gateway-wcpay.php Added comprehensive tests for is_payment_request_enabled() method
tests/unit/migrations/test-class-migrate-payment-request-to-express-checkout-enabled.php New test file for migration class
tests/unit/test-class-wc-payments-account.php Updated test to use new is_payment_request_enabled() method mock
tests/unit/admin/test-class-wc-rest-payments-settings-controller.php Added tests for REST API payment request enable/disable functionality
tests/unit/duplicate-detection/test-class-duplicates-detection-service.php Updated test to use new property-based approach
tests/unit/duplicate-detection/class-test-gateway.php Added is_payment_request_enabled() method to test gateway
changelog/refactor-google-pay-apple-pay-settings-storage Added changelog entry

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 4, 2025

Size Change: 0 B

Total Size: 926 kB

ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.45 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.45 kB
release/woocommerce-payments/assets/css/success.css 1.06 kB
release/woocommerce-payments/assets/css/success.rtl.css 1.06 kB
release/woocommerce-payments/dist/blocks-checkout-rtl.css 3.05 kB
release/woocommerce-payments/dist/blocks-checkout.css 3.05 kB
release/woocommerce-payments/dist/blocks-checkout.js 54.6 kB
release/woocommerce-payments/dist/cart-block-rtl.css 113 B
release/woocommerce-payments/dist/cart-block.css 112 B
release/woocommerce-payments/dist/cart-block.js 16.7 kB
release/woocommerce-payments/dist/cart.js 5.27 kB
release/woocommerce-payments/dist/checkout-rtl.css 1.13 kB
release/woocommerce-payments/dist/checkout.css 1.13 kB
release/woocommerce-payments/dist/checkout.js 34.6 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 367 B
release/woocommerce-payments/dist/express-checkout.css 367 B
release/woocommerce-payments/dist/express-checkout.js 16.8 kB
release/woocommerce-payments/dist/frontend-tracks.js 833 B
release/woocommerce-payments/dist/index-rtl.css 21.8 kB
release/woocommerce-payments/dist/index.css 21.8 kB
release/woocommerce-payments/dist/index.js 157 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.08 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.82 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 18.9 kB
release/woocommerce-payments/dist/multi-currency.css 3.83 kB
release/woocommerce-payments/dist/multi-currency.js 25.3 kB
release/woocommerce-payments/dist/order-rtl.css 740 B
release/woocommerce-payments/dist/order.css 740 B
release/woocommerce-payments/dist/order.js 22 kB
release/woocommerce-payments/dist/plugins-page-rtl.css 484 B
release/woocommerce-payments/dist/plugins-page.css 484 B
release/woocommerce-payments/dist/plugins-page.js 2.64 kB
release/woocommerce-payments/dist/product-details-rtl.css 433 B
release/woocommerce-payments/dist/product-details.css 436 B
release/woocommerce-payments/dist/product-details.js 12.3 kB
release/woocommerce-payments/dist/settings-rtl.css 12.4 kB
release/woocommerce-payments/dist/settings.css 12.2 kB
release/woocommerce-payments/dist/settings.js 152 kB
release/woocommerce-payments/dist/subscription-edit-page.js 703 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 1.98 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 730 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 1.9 kB
release/woocommerce-payments/dist/success.js 6.03 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 235 B
release/woocommerce-payments/dist/tos.js 3 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight-rtl.css 1.59 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight.css 1.59 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight.js 27.8 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 5.68 kB
release/woocommerce-payments/dist/woopay-express-button.js 22.8 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.27 kB
release/woocommerce-payments/dist/woopay.css 4.25 kB
release/woocommerce-payments/dist/woopay.js 70.8 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 625 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/jetpack-script-data.js 957 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.02 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/script-data.js 69 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/babel.config.js 163 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.js 14.3 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.rtl.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.js 29.7 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.rtl.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 280 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 625 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 333 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 626 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 417 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-users-connection.js 161 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 585 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 215 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 721 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 412 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 625 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.04 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 294 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 408 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.59 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 301 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 746 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 574 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 414 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 543 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.78 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.84 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 545 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.7 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 507 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 358 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 428 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 782 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.09 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.26 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 391 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.04 kB

compressed-size-action

@frosso frosso self-assigned this Dec 4, 2025
'type' => 'title',
'description' => '',
],
'payment_request' => [
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No longer needed - the payment_request setting got deleted in favor of the enabled flag on the Google Pay/Apple Pay payment method definitions

Comment on lines 866 to 883
// Update Google Pay and Apple Pay enabled settings to keep them in sync.
$google_pay_gateway = WC_Payments::get_payment_gateway_by_id( 'google_pay' );
if ( $google_pay_gateway ) {
if ( $is_payment_request_enabled ) {
$google_pay_gateway->enable();
} else {
$google_pay_gateway->disable();
}
}

$apple_pay_gateway = WC_Payments::get_payment_gateway_by_id( 'apple_pay' );
if ( $apple_pay_gateway ) {
if ( $is_payment_request_enabled ) {
$apple_pay_gateway->enable();
} else {
$apple_pay_gateway->disable();
}
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is where things get "muddy": Google Pay and Apple Pay are two separate payment methods, implemented with two different payment method classes.
But in the settings page, only one checkbox controls both of them.
In other words:

  • For Google Pay/Apple Pay: 1 checkbox controls both of them.
  • For other payment methods: 1 checkbox controls one payment method.
Image

Now, in order to have them appear "enabled" on the payment methods list at checkout (for the subsequent work), I need to ensure that they are both "enabled".

I considered adding an action somewhere that listened to changes to either the Google Pay or Apple Pay payment method settings and enabled/disabled the other automagically.
But I thought it wasn't very explicit. And since it would have been a filter somewhere else, I thought it wouldn't a "transparent" mechanism, which could have lead to bugs.

*
* @var string
*/
private $apple_pay_verify_notice;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the previous implementation, the error message was stored as an attribute on the class.
The problem is that the settings updates happen over AJAX. And the attribute is not persisted across page refreshes.
So the exact error message was never displayed to the merchant.

I modified the implementation to store the error message in a new wcpay_apple_pay_domain_error option, so it can be persisted across page refreshes.

@frosso frosso requested a review from Copilot December 5, 2025 11:09
Copilot finished reviewing on behalf of frosso December 5, 2025 11:11
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 21 out of 21 changed files in this pull request and generated 2 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@frosso frosso marked this pull request as ready for review December 5, 2025 11:27
@frosso frosso requested a review from a team December 5, 2025 11:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants