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

[GlobalStep] Subscription renewals fail with WC Subscriptions due to Split UPE #5567

Closed
1 of 3 tasks
gglobalstep opened this issue Feb 16, 2023 · 5 comments · Fixed by #5574
Closed
1 of 3 tasks

[GlobalStep] Subscription renewals fail with WC Subscriptions due to Split UPE #5567

gglobalstep opened this issue Feb 16, 2023 · 5 comments · Fixed by #5574
Assignees
Labels
category: core WC Payments core related issues, where it’s obvious. component: upe component: wc subscriptions integration Issues affecting subscriptions with WC Subscriptions plugin active. priority: critical The issue is critical—e.g. a fatal error, security problem affecting many customers. type: bug The issue is a confirmed bug.

Comments

@gglobalstep
Copy link

gglobalstep commented Feb 16, 2023

Bug Description:

Subscription renewal orders fail with WC Pay and WC Subscriptions.

Environment:

Woocommerce Version: WooCommerce 7.3.0
WooCommerce Payments - 5.5.0 test-2
WooCommerce Subscriptions - v4.8.1
WordPress version: v6.1.1

PC:
Windows 10, MacOS 12.6.1 (Monterey)
Chrome(Version 110.0.5481.100)
Safari Version 16.2 (18614.3.7.1.5)

Steps To Reproduce:

  1. Create any test site using the JN site.
  2. Install and activate all the required plugins.
  3. As a Merchant create a subscription product (see official documentation for more details).
  4. As a Shopper add the subscription product to the cart and complete checkout.
  5. Wait for renewal, trigger renewal scheduled action, trigger manual renewal as a Merchant or Shopper
  6. Observe that, "Related order" status is set to "Failed".

Actual Result:

Renewal orders are set to "Failed".

An error is added to the notes.

A payment of $5.00 failed to complete with the following message: Error: You passed an empty string for 'payment_method_types[0]'. We assume empty values are an attempt to unset a parameter; however 'payment_method_types[0]' cannot be unset. You should remove 'payment_method_types[0]' from your request or supply a non-empty value.

Expected Result:

Renewal orders are set to "Processing" on renewal.

Screenshot:

#5567 1

#5567 2

Isolating the problem (mark completed items with an [x]):

  • I have deactivated other plugins and confirmed this bug occurs when only WooCommerce plugin is active.
  • This bug happens with a default WordPress theme active, or Storefront.
  • I can reproduce this bug consistently using the steps above.

`

WordPress Environment

WC Version: 7.3.0
REST API Version: ✔ 7.3.0
WC Blocks Version: ✔ 9.1.5
Action Scheduler Version: ✔ 3.4.0
Log Directory Writable: ✔
WP Version: 6.1.1
WP Multisite: –
WP Memory Limit: 256 MB
WP Debug Mode: ✔
WP Cron: ✔
Language: en_US
External object cache: –

Server Environment

Server Info: Apache/2.4.55 (Unix) OpenSSL/1.0.2g
PHP Version: 7.4.33
PHP Post Max Size: 1 GB
PHP Time Limit: 30
PHP Max Input Vars: 5000
cURL Version: 7.47.0
OpenSSL/1.0.2g

SUHOSIN Installed: –
MySQL Version: 5.7.33-0ubuntu0.16.04.1-log
Max Upload Size: 512 MB
Default Timezone is UTC: ✔
fsockopen/cURL: ✔
SoapClient: ✔
DOMDocument: ✔
GZip: ✔
Multibyte String: ✔
Remote Post: ✔
Remote Get: ✔

Database

WC Database Version: 7.3.0
WC Database Prefix: wp_
Total Database Size: 7.32MB
Database Data Size: 5.16MB
Database Index Size: 2.16MB
wp_woocommerce_sessions: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_woocommerce_api_keys: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_woocommerce_attribute_taxonomies: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_woocommerce_downloadable_product_permissions: Data: 0.02MB + Index: 0.06MB + Engine InnoDB
wp_woocommerce_order_items: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_woocommerce_order_itemmeta: Data: 0.11MB + Index: 0.14MB + Engine InnoDB
wp_woocommerce_tax_rates: Data: 0.02MB + Index: 0.06MB + Engine InnoDB
wp_woocommerce_tax_rate_locations: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_woocommerce_shipping_zones: Data: 0.02MB + Index: 0.00MB + Engine InnoDB
wp_woocommerce_shipping_zone_locations: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_woocommerce_shipping_zone_methods: Data: 0.02MB + Index: 0.00MB + Engine InnoDB
wp_woocommerce_payment_tokens: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_woocommerce_payment_tokenmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_woocommerce_log: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_actionscheduler_actions: Data: 0.19MB + Index: 0.20MB + Engine InnoDB
wp_actionscheduler_claims: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_actionscheduler_groups: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_actionscheduler_logs: Data: 0.17MB + Index: 0.14MB + Engine InnoDB
wp_commentmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_comments: Data: 0.13MB + Index: 0.09MB + Engine InnoDB
wp_links: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_options: Data: 3.19MB + Index: 0.06MB + Engine InnoDB
wp_postmeta: Data: 0.39MB + Index: 0.38MB + Engine InnoDB
wp_posts: Data: 0.11MB + Index: 0.06MB + Engine InnoDB
wp_snippets: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_termmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_terms: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_term_relationships: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_term_taxonomy: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_usermeta: Data: 0.06MB + Index: 0.03MB + Engine InnoDB
wp_users: Data: 0.02MB + Index: 0.05MB + Engine InnoDB
wp_wc_admin_notes: Data: 0.05MB + Index: 0.00MB + Engine InnoDB
wp_wc_admin_note_actions: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_wc_category_lookup: Data: 0.02MB + Index: 0.00MB + Engine InnoDB
wp_wc_customer_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_wc_download_log: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_wc_order_coupon_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_wc_order_product_lookup: Data: 0.02MB + Index: 0.06MB + Engine InnoDB
wp_wc_order_stats: Data: 0.02MB + Index: 0.05MB + Engine InnoDB
wp_wc_order_tax_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB
wp_wc_product_attributes_lookup: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_wc_product_download_directories: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_wc_product_meta_lookup: Data: 0.02MB + Index: 0.09MB + Engine InnoDB
wp_wc_rate_limits: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_wc_reserved_stock: Data: 0.02MB + Index: 0.00MB + Engine InnoDB
wp_wc_tax_rate_classes: Data: 0.02MB + Index: 0.02MB + Engine InnoDB
wp_wc_webhooks: Data: 0.02MB + Index: 0.02MB + Engine InnoDB

Post Type Counts

attachment: 25
page: 10
post: 2
product: 25
product_variation: 7
revision: 4
shop_coupon: 1
shop_order: 55
shop_order_refund: 5
shop_subscription: 24

Security

Secure connection (HTTPS): ✔
Hide errors from visitors: ✔

Active Plugins (6)

Query Monitor: by John Blackbourn – 3.11.1
Code Snippets: by Code Snippets Pro – 3.2.2
Companion Plugin: by Osk – 1.29
WooCommerce Payments: by Automattic – 5.5.0-test-2
WooCommerce Subscriptions: by WooCommerce – 4.8.1
WooCommerce: by Automattic – 7.3.0 (update to version 7.4.0 is available)

Inactive Plugins (3)

Akismet Anti-Spam: by Automattic – 5.0.2
Hello Dolly: by Matt Mullenweg – 1.7.2
WooCommerce Payments Dev Tools: by Automattic –

Dropin Plugins (1)

db.php: Query Monitor Database Class (Drop-in)

Settings

API Enabled: –
Force SSL: –
Currency: USD ($)
Currency Position: left
Thousand Separator: ,
Decimal Separator: .
Number of Decimals: 2
Taxonomies: Product Types: external (external)
grouped (grouped)
simple (simple)
subscription (subscription)
variable (variable)
variable subscription (variable-subscription)

Taxonomies: Product Visibility: exclude-from-catalog (exclude-from-catalog)
exclude-from-search (exclude-from-search)
featured (featured)
outofstock (outofstock)
rated-1 (rated-1)
rated-2 (rated-2)
rated-3 (rated-3)
rated-4 (rated-4)
rated-5 (rated-5)

Connected to WooCommerce.com: –
Enforce Approved Product Download Directories: ✔
Order datastore: WC_Order_Data_Store_CPT

WC Pages

Shop base: #5 - /shop/
Cart: #6 - /cart/
Checkout: #7 - /checkout/
My account: #8 - /my-account/
Terms and conditions: ❌ Page not set

Theme

Name: Storefront
Version: 4.2.0
Author URL: https://woocommerce.com/
Child Theme: ❌ – If you are modifying WooCommerce on a parent theme that you did not build personally we recommend using a child theme. See: How to create a child theme
WooCommerce Support: ✔

Templates

Overrides: –

Subscriptions

WCS_DEBUG: ✔ No
Subscriptions Mode: ✔ Live
Subscriptions Live URL: https://bloody-clam.jurassic.ninja
Subscriptions-core Library Version: 5.3.1
Subscription Statuses: wc-active: 17
wc-on-hold: 6
wc-cancelled: 1

WooCommerce Account Connected: ❌ No
Report Cache Enabled: ✔ Yes
Cache Update Failures: ✔ 0 failure

Store Setup

Country / State: United States (US) — California

Subscriptions by Payment Gateway

WooCommerce Payments: wc-active: 17
wc-cancelled: 1
wc-on-hold: 6

Payment Gateway Support

WooCommerce Payments: products
refunds
multiple_subscriptions
subscription_cancellation
subscription_payment_method_change_admin
subscription_payment_method_change_customer
subscription_payment_method_change
subscription_reactivation
subscription_suspension
subscriptions
subscription_amount_changes
subscription_date_changes
tokenization
add_payment_method

Admin

Enabled Features: activity-panels
analytics
coupons
customer-effort-score-tracks
experimental-products-task
experimental-import-products-task
experimental-fashion-sample-products
shipping-smart-defaults
shipping-setting-tour
homescreen
marketing
multichannel-marketing
mobile-app-banner
navigation
onboarding
onboarding-tasks
remote-inbox-notifications
remote-free-extensions
payment-gateway-suggestions
shipping-label-banner
subscriptions
store-alerts
transient-notices
woo-mobile-welcome
wc-pay-promotion
wc-pay-welcome-page

Disabled Features: minified-js
new-product-management-experience
settings

Daily Cron: ✔ Next scheduled: 2023-02-17 06:32:39 +00:00
Options: ✔
Notes: 44
Onboarding: completed

WooCommerce Payments

Version: 5.5.0-test-2
Connected to WPCOM: Yes
Blog ID: 215596990
Account ID: acct_1MbIYnFdBqgM16K3

Action Scheduler

Canceled: 18
Oldest: 2023-02-14 07:45:36 +0000
Newest: 2023-02-16 15:06:18 +0000

Complete: 503
Oldest: 2023-02-14 07:11:27 +0000
Newest: 2023-02-16 15:06:59 +0000

Pending: 23
Oldest: 2023-02-16 15:15:55 +0000
Newest: 2023-04-14 12:08:57 +0000

Status report information

Generated at: 2023-02-16 15:14:45 +00:00
`

@gglobalstep gglobalstep added the type: bug The issue is a confirmed bug. label Feb 16, 2023
@haszari
Copy link
Contributor

haszari commented Feb 16, 2023

@brucealdridge can you test to confirm this issue and comment your thoughts on priority – does this block WCPay 5.5 release?

@haszari haszari added the component: wc subscriptions integration Issues affecting subscriptions with WC Subscriptions plugin active. label Feb 16, 2023
@brucealdridge brucealdridge added the priority: high The issue/PR is high priority—it affects lots of customers substantially, but not critically. label Feb 17, 2023
@brucealdridge brucealdridge changed the title [GlobalStep] "Related order" status is set to "Failed" after clicking 'Run' to simulate an automatic renewal on "My Account > Subscriptions" page. [GlobalStep] Subscription renewals fail with WC Subscriptions Feb 17, 2023
@haszari haszari added the priority: critical The issue is critical—e.g. a fatal error, security problem affecting many customers. label Feb 17, 2023
@brucealdridge
Copy link
Contributor

This is a bug with Split UPE (#3968)

The culprit lies in the lines below.

$upe_payment_method = sanitize_text_field( wp_unslash( $_POST['payment_method'] ?? '' ) ); // phpcs:ignore WordPress.Security.NonceVerification
if ( 'woocommerce_payments' !== $upe_payment_method ) {
$payment_methods = [ str_replace( 'woocommerce_payments_', '', $upe_payment_method ) ];
} elseif ( WC_Payments_Features::is_upe_split_enabled() ) {
$payment_methods = [ 'card' ];
} else {
$payment_methods = WC_Payments::get_gateway()->get_payment_method_ids_enabled_at_checkout( null, true );
}

Previously for Subscription renewal the following line would be used for setting $payment_methods

$payment_methods = WC_Payments::get_gateway()->get_payment_method_ids_enabled_at_checkout( null, true );

The new lines do a check based on the variable $_POST['payment_method'] which will exist when a customer is submitting payment details but will not work with admin-initiated payments.
I wonder if this also affects in person payments.

@brucealdridge brucealdridge changed the title [GlobalStep] Subscription renewals fail with WC Subscriptions [GlobalStep] Subscription renewals fail with WC Subscriptions due to Split UPE Feb 17, 2023
@frosso frosso removed the priority: high The issue/PR is high priority—it affects lots of customers substantially, but not critically. label Feb 17, 2023
@haszari
Copy link
Contributor

haszari commented Feb 17, 2023

Excellent detective work @brucealdridge ! 🙌

FYI @frosso @FangedParakeet – this issue may have been introduced by split UPE changes, see @brucealdridge comment above. Is someone from @Automattic/heisenberg able to investigate / start a fix?

Regarding priority / impact, it looks like this only affects Subscriber-initiated (early) renewals when the subscriber happens to be an admin user. Is this correct @brucealdridge ? If so that might lower the priority.

FYI @hsingyuc – this issue may be a blocker for WCPay 5.5, I'm not certain of that.

@frosso
Copy link
Contributor

frosso commented Feb 17, 2023

@haszari thanks for the ping! We'll have @timur27 & @mdmoore take a look, so it can hopefully be fixed before the 5.5.0 release.

Regarding priority / impact, it looks like this only affects Subscriber-initiated (early) renewals when the subscriber happens to be an admin user. Is this correct @brucealdridge ? If so that might lower the priority.

If that's the case, I also agree with lowering the priority.

@brucealdridge
Copy link
Contributor

Regarding priority / impact, it looks like this only affects Subscriber-initiated (early) renewals when the subscriber happens to be an admin user. Is this correct @brucealdridge ? If so that might lower the priority.

I did not test subscriber-initiated renewals, I did test admin-initiated renewals and automatic renewals. These would cover the vast majority of renewal payment flows and both of these are failing.

The check that was added for $_POST['payment_method'] expects a customer to go through a normal checkout process. Renewals are not a normal checkout process as both admin-initiated and automatic renewals do not involve a frontend checkout nor do they involve a customer.

This is why I suspect that In Person Payments will be affected as well as these are creating and confirming a payment intent outside of the normal frontend checkout process.

@zmaglica zmaglica added the category: core WC Payments core related issues, where it’s obvious. label Feb 17, 2023
@timur27 timur27 self-assigned this Feb 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
category: core WC Payments core related issues, where it’s obvious. component: upe component: wc subscriptions integration Issues affecting subscriptions with WC Subscriptions plugin active. priority: critical The issue is critical—e.g. a fatal error, security problem affecting many customers. type: bug The issue is a confirmed bug.
Projects
None yet
6 participants