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

Disable WooPay for suspended and rejected accounts #8857

Merged
merged 9 commits into from
Jun 4, 2024

Conversation

asumaran
Copy link
Contributor

@asumaran asumaran commented May 21, 2024

Closes https://github.com/Automattic/woopay/issues/2641

Changes proposed in this Pull Request

Add checks to WC_Payments_Features::is_woopay_eligible() to return false in case the merchant account is suspended or rejected.

Testing instructions


Warning

Rejecting a merchant account is irreversible. It will inform Stripe about the rejection and it can not be undone.

Since I didn't find a way to reverse a rejection I'm sharing another way to simulate a rejected account.

a) Reject the account using the MC tool.

  • In the WCPay Server’ admin area:
  • Go to MC, Enter the Blog ID then click “Open reportcard”.
  • In the “Account Rejection Tool” section.
  • Chose “Refund all” option then click “Reject Account”.

b) Hardcode the account status

  • On the WCPay Server repo.
  • Edit server/wp-content/rest-api-plugins/endpoints/wcpay/class-accounts-controller.php line 885
  • Change the status to: 'status' => 'rejected.something',
  • Note that this will reject all WCPay accounts. So make sure to discard the changes after you are done testing.

I'd suggest using option "b" if you don't want to go through the hassle of creating a new WCPay account every time you want to test a rejected account.


Disable WooPay for rejected accounts.

  • In the WCPay Server’ admin area:
    • Reject your merchant account using the steps above.
  • Go to the WC Pay site’ admin area
    • Go to “WCPay Dev“
    • Clear the "Account cache contents” to apply changes.
    • Go to > Payments. The account should be “Rejected”.
  • Go to the Store
    • Add products.
    • Go to the Shortcode Cart page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.
    • Go to the Cart Block page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.
    • Go to Shortcode Checkout page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.
    • Go to Checkout Block page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.

Disable WooPay for suspended accounts.

  • In the WCPay Server’ admin area:
    • Go to MC, Enter the Blog ID then click “Open reportcard”.
    • In the “Account Tool” section:
    • Select “Hard Block Account” then click “Apply Account Action”.
  • Go to the WC Pay site’ admin area
    • Go to “WCPay Dev“
    • Clear the "Account cache contents” to apply changes.
    • Go to > Payments. The account should be “Under review”.
  • Go to the Store
    • Add products.
    • Go to the Shortcode Cart page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.
    • Go to the Cart Block page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.
    • Go to Shortcode Checkout page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.
    • Go to Checkout Block page.
      • Check the Network tab in Chrome. It shouldn’t download any Woopay related file.

Remove active WooPay webhooks for rejected accounts.

  • Go to the WC Pay site’ admin area
    • Reject your merchant account using the steps above.
  • Go to the WC Pay site’ admin area
    • Go to “WCPay Dev“
    • Clear the "Account cache contents” to apply changes.
    • Go to > Payments. The account should be “Rejected”.
    • Go to WooCommerce > Settings > Advanced > Webhooks
    • Verify there’s no “WCPay woopay order status sync” webhook.

Remove active WooPay webhooks for suspended accounts.

  • Make sure to clear the WCPay account on the WC Pay Server using the Account Tool on the Report Card.
  • Go to the WC Pay site’ admin area
    • Go to WooCommerce > Settings > Advanced > Webhooks
    • Verify there’s a “WCPay woopay order status sync” active webhook.
  • In the WCPay Server’ admin area:
    • Go to MC, Enter the Blog ID then click “Open reportcard”.
    • In the “Account Tool” section:
    • Select “Hard Block Account” then click “Apply Account Action”.
  • Go to the WC Pay site’ admin area
    • Go to “WCPay Dev“
    • Clear the "Account cache contents” to apply changes.
    • Go to > Payments. The account should be “Under review”.
    • Go to WooCommerce > Settings > Advanced > Webhooks
    • Verify there’s no “WCPay woopay order status sync” webhook.

  • 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 21, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 8857 or branch name as-disable-woopay-rejected-suspended-accounts 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: 21ba127
  • Build time: 2024-05-30 22:53:07 UTC

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

Copy link
Contributor

github-actions bot commented May 21, 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 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.24 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

@asumaran asumaran self-assigned this May 22, 2024
@asumaran asumaran force-pushed the as-disable-woopay-rejected-suspended-accounts branch 4 times, most recently from 10c720c to 5c1fa2c Compare May 23, 2024 23:01
@asumaran asumaran marked this pull request as ready for review May 23, 2024 23:02
@asumaran asumaran requested review from a team and ricardo and removed request for a team May 23, 2024 23:02
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 all tests have passed.

  • ✅ Disable WooPay for rejected accounts.
  • ✅ Disable WooPay for suspended accounts.
  • ✅ Remove active WooPay webhooks for rejected accounts.
  • ✅ Remove active WooPay webhooks for suspended accounts.

@asumaran Please check my comment below before merging.

Comment on lines +214 to +216
$is_account_rejected = WC_Payments::get_account_service()->is_account_rejected();

$is_account_under_review = WC_Payments::get_account_service()->is_account_under_review();
Copy link
Member

Choose a reason for hiding this comment

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

I created this issue only taking into account "rejected*" and "under_review" statuses, but it looks like there could be more statuses and I'm not sure if/how these would be set in a real scenario.

@asumaran should we consider those other statuses as well? Perhaps untimately it would be easier to just check if the account is enabled/complete/not currently restricted?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

should we consider those other statuses as well?

Good question. We'd need to confirm what statuses actually block the account. I'll double check tomorrow. In the meantime I'll ask internally about that.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I noticed the account status is set to restricted in two cases:

  • When payments are paused on Stripe.
  • When payouts are paused on Stripe.

When the merchant's account is restricted WooPayments is not disabled on the site neither the WooPayments account.

Does it make sense to turn off the merchant's WooPay eligibility if their Stripe account is restricted? cc @pierorocca @bborman22

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I've tested with a JN site + my sandbox and can confirm WooPay doesn't work if the merchant has payments disabled on Stripe. No iframe is triggered after entering a valid WooPay email. The account status is set to restricted.

The server will set the site as not eligible for WooPay. So, nothing to add there as it's already being handled correctly.

Perhaps untimately it would be easier to just check if the account is enabled/complete/not currently restricted?

I think disabling WooPay for "rejected", "under review" and "restricted" accounts it's OK from WooPayments. If there's more status we need to handle it would be better to do it server side.

@asumaran asumaran force-pushed the as-disable-woopay-rejected-suspended-accounts branch 3 times, most recently from 69035bb to 4c7036a Compare May 30, 2024 21:41
@asumaran asumaran enabled auto-merge May 30, 2024 21:43
@asumaran asumaran force-pushed the as-disable-woopay-rejected-suspended-accounts branch from 4c7036a to 5334184 Compare May 30, 2024 22:15
@asumaran asumaran disabled auto-merge May 30, 2024 22:16
asumaran added 2 commits May 30, 2024 17:41
Fixes a fatal error when clearing the account data cache.

In this PR we call `WC_Payments::get_account_service()->is_account_rejected()` to know if the account is rejected. This method will get the data from Stripe and the `WC_Payments_Account->get_cached_account_data()` will be called. Then the action `woocommerce_payments_account_refreshed` will be fired.

The `Compatibility_Service` class is registering a hook for that action. https://github.com/Automattic/woocommerce-payments/blob/trunk/includes/class-compatibility-service.php#L41
Then `Compatibility_Service->get_compatibility_data()` is called. Which calls the `get_permalink()` function.

This function internally calls to `_get_page_link` which uses `$wp_rewrite` global but at the time it’s not defined resulting in a PHP fatal error. This commit fixes it.

Note that the request to the server is not done on every page refresh, only after clearing the account cache contents.
…er_review`

We are already checking if the account is rejected or under review in the `WC_Payments_Features::is_woopay_eligible()` method.
@asumaran asumaran force-pushed the as-disable-woopay-rejected-suspended-accounts branch from 5334184 to e95c392 Compare May 30, 2024 22:44
self::maybe_register_woopay_hooks();
// Defer registering the WooPay hooks. Later on, $wp_rewrite is used and causes a fatal error on the WooPayment Dev Tools,
// given that $wp_rewrite is defined right after the `plugins_loaded` action is fired. See #8857.
add_action( 'setup_theme', [ __CLASS__, 'maybe_register_woopay_hooks' ] );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

It would be good to have more eyes on this. The reasoning is explained in the commit message 69fa9ef

I've tested the full WooPay flow locally and did not experience any errors with this change.

Pinging @waclawjacek since he introduce this line initially and @malithsen since worked on something very similar.

Copy link
Contributor

Choose a reason for hiding this comment

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

Hi! 👋 Could you please provide some more details on how I could help here? I'm not sure what the code I introduced is, and I've been detached from this codebase for quite some time so some extra context would be much appreciated.

Copy link
Contributor Author

@asumaran asumaran Jun 3, 2024

Choose a reason for hiding this comment

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

Hi @waclawjacek. I believe the original line was added in this PR of yours. I just wanted to get more eyes on this from people familiar with it. The change looks a bit sensitive since I'm delaying some hooks registrations for the reasons mentioned in 4e1b201. I've tested it with WooPay and double-checked that it's working. If you don't see anything to comment that's fine. I reached out to you as an extra precaution ;-)

Copy link
Contributor

Choose a reason for hiding this comment

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

I see! Thanks for the explanation and the ping - I appreciate the cautiousness.

I haven't tested the code or done a super deep dive into the WP codebase but the reasoning sounds good to me. It looks like setup_theme is the next hook that fires in wp-settings.php after plugins_loaded (which is when WC_Payments::init() fires right now), and it looks like a good candidate to hook into, despite the hook's name being somewhat irrelevant to the logic here.

Copy link
Member

Choose a reason for hiding this comment

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

Apologies for the delay in getting to this.

Change looks good to me. I tested WooPay locally with a WCPay account having status=complete and did not notice any regressions.

@asumaran asumaran added this pull request to the merge queue Jun 4, 2024
Merged via the queue into develop with commit 8aa455c Jun 4, 2024
23 checks passed
@asumaran asumaran deleted the as-disable-woopay-rejected-suspended-accounts branch June 4, 2024 18:15
asumaran added a commit that referenced this pull request Jun 5, 2024
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.

5 participants