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

Pass previous Exception with Exception #8824

Merged
merged 9 commits into from
May 22, 2024

Conversation

hsingyuc
Copy link
Contributor

@hsingyuc hsingyuc commented May 15, 2024

Changes proposed in this Pull Request

While investigating successfully captured and failed orders root causes, I found we could use more information on error 'We're not able to process this request. Please refresh the page and try again.'

Changes made in this PR:

  1. Passes the previous Exception with Exception.
  2. Updates Process_Payment_Exception inside the process_payment to more unique Exceptions like Fraud_Prevention_Enabled_Exception, Invalid_Phone_Number_Exception, and Rate_Limiter_Enabled_Exception so when WC catches the Exception that throws from process_payment, we can pass the Exception class as additional data with the Exception to help WooPay better understanding where the errors come from.

Testing instructions

  1. Test with WooCommerce PR
  2. Return true in check_nonce
  3. Run the PHP unit tests
  4. Test through Postman for each Exception case inside process_payment:
    ( I tested them by commenting out the condition check )
    1. Add an item to your cart {YOUR_DOMAIN}/wp-json/wc/store/v1/cart/add-item
Body - Raw - JSON
{
  "id": 2040,
  "quantity": 1
}
 ii. Checkout with the cart `{YOUR_DOMAIN}/wp-json/wc/store/v1/checkout`
{
  "billing_address": {
        "first_name": "Test",
        "last_name": "Billing",
        "company": "",
        "address_1": "123 test",
        "address_2": "",
        "city": "San Diego",
        "state": "CA",
        "postcode": "92103",
        "country": "US",
        "email": “[email protected]”,
        "phone": "+14708274627"
    },
    "shipping_address": {
        "first_name": "Test",
        "last_name": “Shipping”,
        "company": "",
        "address_1": "123 test",
        "address_2": "",
        "city": "San Diego",
        "state": "CA",
        "postcode": "92103",
        "country": "US",
        "email": "[email protected]",
        "phone": "+14708274627"
    },
  "payment_method": "woocommerce_payments"
}
  1. See previous exception class in response

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

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 8824 or branch name update/pass-previous-error-to-exception 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: 3b1598e
  • Build time: 2024-05-22 18:00:19 UTC

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

Copy link
Contributor

github-actions bot commented May 15, 2024

Size Change: 0 B

Total Size: 1.23 MB

ℹ️ 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.07 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.07 kB
release/woocommerce-payments/dist/blocks-checkout.js 50.4 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 15.3 kB
release/woocommerce-payments/dist/cart.js 4.46 kB
release/woocommerce-payments/dist/checkout-rtl.css 599 B
release/woocommerce-payments/dist/checkout.css 599 B
release/woocommerce-payments/dist/checkout.js 31.4 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 155 B
release/woocommerce-payments/dist/express-checkout.css 155 B
release/woocommerce-payments/dist/express-checkout.js 3.55 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.5 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.8 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.6 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 5.87 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 11.1 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/tokenized-payment-request-rtl.css 155 B
release/woocommerce-payments/dist/tokenized-payment-request.css 155 B
release/woocommerce-payments/dist/tokenized-payment-request.js 6.23 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.83 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 15.1 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 390 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 517 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

@hsingyuc hsingyuc requested review from a team and malithsen and removed request for a team May 15, 2024 19:37
@malithsen
Copy link
Member

Hi @hsingyuc

Thanks for working on this.
I haven't fully reviewed this PR yet, but from what I understand, the current problem is that WooPay is receiving a redacted error message, which is the output of get_filtered_error_message. This redacted error message isn't helpful for understanding why a merchant order failed from WooPay's perspective.

So, in order to work around this issue, this PR depends on a core change in WooCommerce that retrieves the error class and sends it through the additional_data field. Although this works, WooPay will only see the benefits of these changes once merchants update their WooCommerce version. It may take some time for merchants to make this upgrade.

What are your thoughts of conditionally throwing the exception in process_payment. If the merchant is processing the payment for WooPay, don't redact the error message. If not, do what we're doing now.

Untested code:

if ( ! empty( $_POST['is_woopay'] ) ) {
    // We can also append any other metadata that we think is useful. 
    throw new Exception( $e->getMessage() );
} else {
    // Re-throw the exception after setting everything up.
    // This makes the error notice show up both in the regular and block checkout.
    throw new Exception( WC_Payments_Utils::get_filtered_error_message( $e, $blocked_by_fraud_rules ) );
}

@hsingyuc
Copy link
Contributor Author

This redacted error message isn't helpful for understanding why a merchant order failed from WooPay's perspective.

If I understood you correctly, that's the reason for this PR to log the Exception class so it will be easier for us to find where the error comes from.

So, in order to work around this issue, this PR depends on a core change in WooCommerce that retrieves the error class and sends it through the additional_data field. Although this works, WooPay will only see the benefits of these changes once merchants update their WooCommerce version. It may take some time for merchants to make this upgrade.

I agree with you that it would take some time. I think retrying orders and auto refunding gives us time to solve the other issues and If we had merged the previous PRs, we would have the information to find the root causes of this issue by now. I believe we can and should both add additional data and look for another faster solution this time.

What are your thoughts of conditionally throwing the exception in process_payment. If the merchant is processing the payment for WooPay, don't redact the error message. If not, do what we're doing now.

Wouldn't this error message be shown to shoppers? We can try to check if it's WooPay and then use WooPayMeta like I did before, but I think we should get a proper solution in place long-term.

@malithsen
Copy link
Member

malithsen commented May 21, 2024

Wouldn't this error message be shown to shoppers?

@hsingyuc No, it won't be shown to the shopper. It will just be logged on WooPay logs. WooPay shows a custom error to the shopper instead of showing the error from the merchant site as-is.

https://github.com/Automattic/woopay/blob/5e1060b18b607c16499a3c79571203b0b9d47690/src/Checkout/PaymentsHandler.php#L400

Copy link
Member

@malithsen malithsen left a comment

Choose a reason for hiding this comment

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

Thanks for working on this @hsingyuc, I've tested this with the WC-core PR and was able to get the class-name on to WooPay error logs, which will help narrow down merchant-store errors WooPay shoppers encounter.

If we had merged the #7873 PRs, we would have the information to find the root causes of this issue by now.

I disagree. The PR you linked sends intent_meta_order_id and order_id via additional_data, same information is currently available to us via the changes in #7951.

I do agree that, had we gone ahead with your core changes earlier, it would help us with the additional logs we are adding now :)

@hsingyuc
Copy link
Contributor Author

@malithsen, thank you for the review!

I disagree. The PR you linked sends intent_meta_order_id and order_id via additional_data, same information is currently available to us via the changes in #7951.

Sorry, I meant to link to the WC PR that allows us to pass additional data to exceptions.. This would mean that a number of WooCommerce stores already allow additional data in the Store API responses so we could try and diagnose some of these errors.

Screenshot 2024-05-22 at 1 53 03 PM

@hsingyuc hsingyuc enabled auto-merge May 22, 2024 17:57
@hsingyuc hsingyuc added this pull request to the merge queue May 22, 2024
Merged via the queue into develop with commit 92a623e May 22, 2024
23 checks passed
@hsingyuc hsingyuc deleted the update/pass-previous-error-to-exception branch May 22, 2024 18:10
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