Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix WooPay Multiple Redirects #7215

Merged
merged 7 commits into from
Sep 25, 2023
Merged

Conversation

bborman22
Copy link
Contributor

@bborman22 bborman22 commented Sep 14, 2023

Changes proposed in this Pull Request

This is one piece of the fix for https://github.com/Automattic/woopay/issues/2125. This fix prevents cases where WooPay sending multiple redirect messages will trigger too many WooPay session init calls and create too many draft orders causing issues with WooPay checkout.

This change was needed because there was a scenario where 3rd party cookies were not blocked and the shopper was already logged into WooPay where the redirect_to_woopay post message was getting posted to the merchant store multiple times. This triggered multiple session init calls which created an issue with draft orders being created on the merchant store and at times preventing WooPay checkout.

This PR addresses that issue by checking if we are already in the process of redirecting the shopper and prevents any further redirects. It does this check by using a flag within the WooPay front end specific code.

Below are the network logs from dev tools after clicking the WooPay button while already logged into WooPay.

Before
too-many-redirects

After
Screenshot 2023-09-15 at 10 28 35 AM

Testing instructions

  1. Make sure 3rd party cookies are allowed (or if you're using the same TLD for both merchant and platform, it will work either way).
  2. Go to the merchant store and checkout using WooPay.
  3. Stay logged into WooPay and immediately go to checkout again.
  4. This time when the OTP modal opens it should begin an immediate redirect.
  5. You should only see 1 wcpay_init_woopay call.
  6. At this point check in the merchant store admin area and confirm this is only one draft order created.
  7. Continue checkout on WooPay successfully.
  8. Confirm that the only draft order from before is now completed and there were no additional draft orders created for that session.

  • 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

@botwoo
Copy link
Collaborator

botwoo commented Sep 14, 2023

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 7215 or branch name fix/woopay-multiple-redirects 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: 010dcc6
  • Build time: 2023-09-25 16:44:26 UTC

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

@github-actions
Copy link
Contributor

github-actions bot commented Sep 14, 2023

Size Change: +314 B (0%)

Total Size: 1.42 MB

Filename Size Change
release/woocommerce-payments/dist/blocks-checkout.js 73.7 kB +33 B (0%)
release/woocommerce-payments/dist/checkout.js 28.7 kB +34 B (0%)
release/woocommerce-payments/dist/payment-request.js 11.7 kB +37 B (0%)
release/woocommerce-payments/dist/upe_checkout.js 34.1 kB +28 B (0%)
release/woocommerce-payments/dist/upe_split_checkout.js 34.6 kB +33 B (0%)
release/woocommerce-payments/dist/upe_with_deferred_intent_creation_checkout.js 36.6 kB +34 B (0%)
release/woocommerce-payments/dist/upe-blocks-checkout.js 39.5 kB +39 B (0%)
release/woocommerce-payments/dist/upe-split-blocks-checkout.js 41 kB +37 B (0%)
release/woocommerce-payments/dist/woopay-express-button.js 50.7 kB +39 B (0%)
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.03 kB
release/woocommerce-payments/assets/css/success.css 158 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 1.51 kB
release/woocommerce-payments/dist/blocks-checkout.css 1.51 kB
release/woocommerce-payments/dist/checkout-rtl.css 440 B
release/woocommerce-payments/dist/checkout.css 441 B
release/woocommerce-payments/dist/index-rtl.css 36.4 kB
release/woocommerce-payments/dist/index.css 36.4 kB
release/woocommerce-payments/dist/index.js 282 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.05 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 2.88 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 60.1 kB
release/woocommerce-payments/dist/multi-currency.css 2.88 kB
release/woocommerce-payments/dist/multi-currency.js 54.7 kB
release/woocommerce-payments/dist/order-rtl.css 676 B
release/woocommerce-payments/dist/order.css 679 B
release/woocommerce-payments/dist/order.js 40.9 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 690 B
release/woocommerce-payments/dist/payment-gateways.css 692 B
release/woocommerce-payments/dist/payment-gateways.js 38.4 kB
release/woocommerce-payments/dist/payment-request-rtl.css 146 B
release/woocommerce-payments/dist/payment-request.css 146 B
release/woocommerce-payments/dist/product-details.js 789 B
release/woocommerce-payments/dist/settings-rtl.css 8.92 kB
release/woocommerce-payments/dist/settings.css 8.92 kB
release/woocommerce-payments/dist/settings.js 231 kB
release/woocommerce-payments/dist/subscription-edit-page.js 669 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 20.3 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 693 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 19.4 kB
release/woocommerce-payments/dist/tos-rtl.css 230 B
release/woocommerce-payments/dist/tos.css 231 B
release/woocommerce-payments/dist/tos.js 21.9 kB
release/woocommerce-payments/dist/upe_checkout-rtl.css 440 B
release/woocommerce-payments/dist/upe_checkout.css 441 B
release/woocommerce-payments/dist/upe_split_checkout-rtl.css 440 B
release/woocommerce-payments/dist/upe_split_checkout.css 441 B
release/woocommerce-payments/dist/upe-blocks-checkout-rtl.css 1.51 kB
release/woocommerce-payments/dist/upe-blocks-checkout.css 1.51 kB
release/woocommerce-payments/dist/upe-split-blocks-checkout-rtl.css 1.51 kB
release/woocommerce-payments/dist/upe-split-blocks-checkout.css 1.51 kB
release/woocommerce-payments/dist/woopay-express-button-rtl.css 146 B
release/woocommerce-payments/dist/woopay-express-button.css 146 B
release/woocommerce-payments/dist/woopay-rtl.css 3.85 kB
release/woocommerce-payments/dist/woopay.css 3.85 kB
release/woocommerce-payments/dist/woopay.js 71.5 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 633 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 720 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.43 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.01 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 522 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 581 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/babel.config.js 160 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.css 2.32 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.js 13.8 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.rtl.css 2.32 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 291 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 403 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.56 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 299 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 742 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 572 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 411 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.63 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.8 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.83 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.6 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 502 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 355 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 429 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 781 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.27 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 392 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.06 kB

compressed-size-action

@bborman22 bborman22 marked this pull request as ready for review September 15, 2023 14:29
@bborman22 bborman22 requested review from a team and ricardo and removed request for a team September 15, 2023 14:29
@ricardo
Copy link
Member

ricardo commented Sep 15, 2023

I find we can still trigger multiple requests to wcpay_init_woopay by clicking the WooPay express checkout button while the automatic redirect is in progress. This results in multiple draft orders as well.

@bborman22 maybe we can tackle this in a separate issue by introducing some global flag which prevents multiple modals from stacking on top of each other?

multiple-requests-screen-recording.mov

Copy link
Member

@ricardo ricardo left a comment

Choose a reason for hiding this comment

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

Code LGTM and tests well. Nice fix! 💯

I'm able to replicate the behavior of multiple requests to wcpay_init_woopay in develop, and not in this branch. This behavior only happens to me when I click the WooPay button from the cart page, not the checkout page.

However, as I mentioned in my previous comment, if I click the WooPay button from the checkout page while the automatic redirect is already in progress, I still face the same issue with multiple requests and multiple draft orders.

I guess we can tackle this in a separate PR, totally up to you. 👍

@bborman22
Copy link
Contributor Author

Thanks for taking a look at this. After our discussion I did some experimenting and actually was able to reproduce the issue on product and checkout pages with just the button (ignoring the email input flow for that test). I also checked this against cart and checkout blocks as well.

Also from our discussion I explored moving this check into the api object. While that didn't solve the issue with the email input since they are using two different instances, I did feel like the code was a lot cleaner this way and a bit easier to maintain / understand.

To truly solve the email input + button click issue we would have to resort to some sort of global flag on the page. I would personally consider the failing scenario an edge case (shopper loads checkout, email lookup triggers auto redirect, and shopper clicks on WooPay) and would be hesitant to add a global for just that case. Overall, I think this area needs a bit of a refactor to get more of the code shared and that would be the proper way to solve this edge case in my opinion.

@ricardo if you wouldn't mind taking another look at this PR and let me know what you think of this api approach and confirm it works for you as expected and we can address the other case in a separate PR?

@bborman22 bborman22 requested a review from ricardo September 25, 2023 13:17
Copy link
Member

@ricardo ricardo left a comment

Choose a reason for hiding this comment

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

I would personally consider the failing scenario an edge case (shopper loads checkout, email lookup triggers auto redirect, and shopper clicks on WooPay) and would be hesitant to add a global for just that case.

I agree. It's probably better to explore improving the overall integration of express checkout button + email input than introducing a global flag right now.

I explored moving this check into the api object.

This approach looks much cleaner 👏.

The latest changes tested well for me. Code LGTM. ✅

@bborman22 bborman22 added this pull request to the merge queue Sep 25, 2023
Merged via the queue into develop with commit ae1bcee Sep 25, 2023
27 checks passed
@bborman22 bborman22 deleted the fix/woopay-multiple-redirects branch September 25, 2023 17:32
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.

3 participants