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

feat: tokenized cart PRBs on PDPs #8644

Merged
merged 56 commits into from May 17, 2024

Conversation

frosso
Copy link
Contributor

@frosso frosso commented Apr 15, 2024

Fixes #8526

Changes proposed in this Pull Request

Implementing the tokenized cart on PDPs, as a first step.
This is behind the _wcpay_feature_tokenized_cart_prb feature flag. Enable it in your wp_options.

There are a few TODOs that have been inherited from the previous implementation or that will be useful for the future implementations.

Testing instructions

  • Enable the "Enable Cart-Token implementation for PRBs" flag in your dev tools (you'll need to update them)
  • Ensure you have Google Pay/Apple Pay enabled in the merchant's settings
  • Go to a product page on your site
  • You should be able to use the PRB button to get shipping data & check out on simple products & variable products
  • There shouldn't be a difference in functionality with the older implementation (when the "Enable Cart-Token implementation for PRBs" functionality is disabled) besides what I wrote below - if you do notice something weird, please let me know!
    • The implementation allows you to check out with the US shipping address, but for some reason the UK and CA addresses aren't working correctly (they fail validation in the backend, despite the values being correct)
    • The itemized amount (tax, shipping, etc.) is sometimes not displayed
    • The selected currency is being ignored, and the store's default currency is used instead ( Fixed by feat: add Store API multi-currency support #8816 )
    • The payment method being reported in the "Order success" and "Order details" pages is inaccurate (Fixed by fix: Store API tokenized cart PM title #8842 )
Screenshot 2024-05-02 at 6 26 45 PM
Screen.Recording.2024-05-02.at.6.24.18.PM.mov

  • 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 Apr 15, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 8644 or branch name refactor/pdp-payment-request-tokenized-cart 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: 91a26d1
  • Build time: 2024-05-17 08:41:31 UTC

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

Copy link
Contributor

github-actions bot commented Apr 15, 2024

Size Change: +12.5 kB (+1%)

Total Size: 1.26 MB

Filename Size Change
release/woocommerce-payments/dist/tokenized-payment-request-rtl.css 155 B +155 B (new file) 🆕
release/woocommerce-payments/dist/tokenized-payment-request.css 155 B +155 B (new file) 🆕
release/woocommerce-payments/dist/tokenized-payment-request.js 12.1 kB +12.1 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.08 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.08 kB
release/woocommerce-payments/assets/css/success.css 172 B
release/woocommerce-payments/assets/css/success.rtl.css 172 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 2.06 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.07 kB
release/woocommerce-payments/dist/blocks-checkout.js 56.2 kB
release/woocommerce-payments/dist/bnpl-announcement-rtl.css 530 B
release/woocommerce-payments/dist/bnpl-announcement.css 531 B
release/woocommerce-payments/dist/bnpl-announcement.js 20 kB
release/woocommerce-payments/dist/cart-block.js 21.4 kB
release/woocommerce-payments/dist/cart.js 4.44 kB
release/woocommerce-payments/dist/checkout-rtl.css 599 B
release/woocommerce-payments/dist/checkout.css 599 B
release/woocommerce-payments/dist/checkout.js 37.4 kB
release/woocommerce-payments/dist/index-rtl.css 40.7 kB
release/woocommerce-payments/dist/index.css 40.7 kB
release/woocommerce-payments/dist/index.js 293 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.05 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.28 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 59.6 kB
release/woocommerce-payments/dist/multi-currency.css 3.29 kB
release/woocommerce-payments/dist/multi-currency.js 54.7 kB
release/woocommerce-payments/dist/order-rtl.css 733 B
release/woocommerce-payments/dist/order.css 735 B
release/woocommerce-payments/dist/order.js 41.9 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 1.21 kB
release/woocommerce-payments/dist/payment-gateways.css 1.21 kB
release/woocommerce-payments/dist/payment-gateways.js 38.7 kB
release/woocommerce-payments/dist/payment-request-rtl.css 155 B
release/woocommerce-payments/dist/payment-request.css 155 B
release/woocommerce-payments/dist/payment-request.js 12 kB
release/woocommerce-payments/dist/product-details-rtl.css 398 B
release/woocommerce-payments/dist/product-details.css 402 B
release/woocommerce-payments/dist/product-details.js 17.2 kB
release/woocommerce-payments/dist/settings-rtl.css 11.1 kB
release/woocommerce-payments/dist/settings.css 10.9 kB
release/woocommerce-payments/dist/settings.js 201 kB
release/woocommerce-payments/dist/subscription-edit-page.js 669 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 19.4 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 693 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 18.5 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 236 B
release/woocommerce-payments/dist/tos.js 21 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 4.81 kB
release/woocommerce-payments/dist/woopay-express-button-rtl.css 155 B
release/woocommerce-payments/dist/woopay-express-button.css 155 B
release/woocommerce-payments/dist/woopay-express-button.js 21 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.25 kB
release/woocommerce-payments/dist/woopay.css 4.22 kB
release/woocommerce-payments/dist/woopay.js 69.4 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 622 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 815 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.44 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.01 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 196 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 20 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 196 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 627 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 20 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 628 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 202 B
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-connection/src/sso/jetpack-sso-admin-create-user.css 214 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 523 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 722 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 408 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 230 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.36 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.js 13.5 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.rtl.css 2.36 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.03 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.6 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.4 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.52 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.05 kB

compressed-size-action

@frosso
Copy link
Contributor Author

frosso commented May 6, 2024

Though, one thing I did notice that I thought I'd point out as perhaps a little peculiar: I noticed that the "Origin" field in the Orders table is being returned as "Unknown" for orders completed via this new PRB implementation. Is that normal or expected? I actually haven't really noticed this field before, so not entirely sure what the expected result is supposed to be here. 😅

@FangedParakeet Thanks for pointing it out - that seems to be another quirk of the PRBs.
I tested it on develop and I noticed the same behavior with the current PRB implementation.
I also tested it with WooPay, and Unknown was also displayed.
I initially suspected it to be an issue with the Store API & orders placed directly via the Store API. However, that might not be the case. I placed an order via the blocks checkout and the source origin was correctly set 🤷

I created #8784 to help us track this.

@frosso
Copy link
Contributor Author

frosso commented May 6, 2024

@FangedParakeet RE order attribution data - I was able to fix it for this PRBs implementation in b42101d 😁

@frosso frosso requested a review from FangedParakeet May 6, 2024 16:38
@frosso frosso force-pushed the refactor/pdp-payment-request-tokenized-cart branch from c6ea531 to de28d7f Compare May 15, 2024 08:26
@frosso frosso force-pushed the refactor/pdp-payment-request-tokenized-cart branch from 3ce38af to 86991a1 Compare May 16, 2024 08:59
Copy link
Contributor

@FangedParakeet FangedParakeet left a comment

Choose a reason for hiding this comment

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

I'm approving this PR, so that we can unblock related work, but I want to raise two problems that I encountered that hopefully we can resolve in a separate issue.

Firstly, all of the Store API endpoints require nonces and we collect the nonce to use in successive requests from the response header of our first request to create an anonymous cart. However, if we trigger the request to add an item to the cart before the request to create the anonymous cart has returned with the nonce, there is consequently no nonce in the request to add the product to the cart, this request fails, and--while the PRB still opens--you are prevented from completing the checkout, presumably because the cart is empty.

Thinking on this further, I am wondering if we just need to add an await over here, to ensure that we have the nonce prior to continuing with the initialisation of the button. Thoughts?

Secondly, while testing on a blocks theme (I'm unsure if this is relevant), I was unable to complete a checkout, because I kept receiving the following error, originating from this line, where we add an item to the cart inside getCartData().

{
    "code": "woocommerce_rest_invalid_nonce",
    "message": "Nonce is invalid.",
    "data": {
        "status": 403
    }
}

I found this more perplexing and don't really have an explanation for this one, since we do have a nonce in this request, it is generated immediately prior in the previous request, but for some reason, despite using the same credentials, the Store API is still unhappy.

Let's try to investigate and resolve these problems in a new issue, which might involve some sort of refactor of the PaymentRequestCartApi and its usage. @frosso, if you wouldn't mind, please just link the new issue somewhere in this PR or the original issue and we can move on and continue with the other integrations in parallel. ✌️

client/tokenized-payment-request/cart-api.js Outdated Show resolved Hide resolved
client/tokenized-payment-request/frontend-utils.js Outdated Show resolved Hide resolved
client/tokenized-payment-request/index.js Outdated Show resolved Hide resolved
@frosso
Copy link
Contributor Author

frosso commented May 17, 2024

if we trigger the request to add an item to the cart before the request to create the anonymous cart has returned with the nonce, there is consequently no nonce in the request to add the product to the cart, this request fails, and--while the PRB still opens--you are prevented from completing the checkout, presumably because the cart is empty.

Thinking on this further, I am wondering if we just need to add an await over here, to ensure that we have the nonce prior to continuing with the initialisation of the button. Thoughts?

Yes, I think that's the proper solution 👍 I didn't want to add the await to delay the rendering of the button, but it seems like it's necessary to avoid issues like these.

Secondly, while testing on a blocks theme (I'm unsure if this is relevant), I was unable to complete a checkout, because I kept receiving the following error, originating from this line, where we add an item to the cart inside getCartData().

Yeah, that's another weird quirk - I'll take a look 👍

@frosso frosso enabled auto-merge May 17, 2024 08:40
@frosso frosso added this pull request to the merge queue May 17, 2024
Merged via the queue into develop with commit b0436e9 May 17, 2024
23 checks passed
@frosso frosso deleted the refactor/pdp-payment-request-tokenized-cart branch May 17, 2024 08:52
@frosso
Copy link
Contributor Author

frosso commented May 17, 2024

Secondly, while testing on a blocks theme (I'm unsure if this is relevant), I was unable to complete a checkout, because I kept receiving the following error, originating from this line, where we add an item to the cart inside getCartData().

Yeah, that's another weird quirk - I'll take a look 👍

@FangedParakeet found a solution here: #8840 (with explanation)
TL;DR: It turns out that all the Store API nonces were bring overwritten by a WC middleware.

@frosso frosso mentioned this pull request May 17, 2024
6 tasks
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.

PRB tokenized cart on PDPs
3 participants