woocommerce / woocommerce-paypal-payments

https://wordpress.org/plugins/woocommerce-paypal-payments/
GNU General Public License v2.0
62 stars 47 forks source link

[GlobalStep] An error message appears on checkout page while placing order for "free trial subscription" product. (378) #267

Closed gglobalstep closed 2 years ago

gglobalstep commented 3 years ago

Bug Description:

An error message appears on checkout page while placing order for "free trial subscription" product.

Environment:

Woocommerce Version : WooCommerce 5.6.0 WooCommerce PayPal Payments 1.6.0 - test WordPress version: v5.8.1

PC: Windows 10, Mac 10.14.6 Chrome(Version 93.0.4577.82) Firefox(Version 92.0 (64-bit)) Safari: v14.1.2

Steps To Reproduce:

  1. Create any test site using JN site.
  2. Install and activate all the required plugins.
  3. Complete the setup wizard.
  4. Connect the store to Pay Pal payment.
  5. Go to WooCommerce > Settings > PayPal and make sure “Enable saved cards and subscription features on your store.” next to “Vaulting” is enabled.
  6. Go to the store and add your free trial subscription product to the cart. Proceed to checkout.
  7. Make sure the total is 0.0.
  8. Click the “PayPal” button and follow all the steps in the modal window. Use your PayPal sandbox buyer account details when asked.
  9. Observe that an error message appears.

Actual Result:

An error message appears on checkout page while placing order for "free trial subscription" product.

Expected Result:

User should be able to place order free trial subscrption product sucessfully.

Screenshot:

#267

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

` ### WordPress Environment ### WC Version: 5.6.0 REST API Version: ✔ 5.6.0 WC Blocks Version: ✔ 5.5.1 Action Scheduler Version: ✔ 3.2.1 WC Admin Version: ✔ 2.5.1 Log Directory Writable: ✔ WP Version: 5.8.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.48 (Unix) OpenSSL/1.0.2g PHP Version: 7.4.23 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: 5.6.0 WC Database Prefix: wp_ Total Database Size: 10.94MB Database Data Size: 8.23MB Database Index Size: 2.71MB 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.05MB + Index: 0.03MB + 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.08MB + Index: 0.13MB + 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.06MB + Index: 0.03MB + Engine InnoDB wp_commentmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_comments: Data: 0.05MB + Index: 0.09MB + Engine InnoDB wp_gla_budget_recommendations: Data: 0.22MB + Index: 0.14MB + Engine InnoDB wp_gla_merchant_issues: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_gla_shipping_rates: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_gla_shipping_times: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_links: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailchimp_carts: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_mailchimp_jobs: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_mailpoet_custom_fields: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_dynamic_segment_filters: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_feature_flags: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_forms: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_mailpoet_log: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_mailpoet_mapping_to_external_entities: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_newsletters: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_newsletter_links: Data: 0.02MB + Index: 0.05MB + Engine InnoDB wp_mailpoet_newsletter_option: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_newsletter_option_fields: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_newsletter_posts: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_newsletter_segment: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_newsletter_templates: Data: 2.52MB + Index: 0.00MB + Engine InnoDB wp_mailpoet_scheduled_tasks: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_scheduled_task_subscribers: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_segments: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_sending_queues: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_settings: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_statistics_bounces: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_mailpoet_statistics_clicks: Data: 0.02MB + Index: 0.05MB + Engine InnoDB wp_mailpoet_statistics_forms: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_statistics_newsletters: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_statistics_opens: Data: 0.02MB + Index: 0.08MB + Engine InnoDB wp_mailpoet_statistics_unsubscribes: Data: 0.02MB + Index: 0.05MB + Engine InnoDB wp_mailpoet_statistics_woocommerce_purchases: Data: 0.02MB + Index: 0.06MB + Engine InnoDB wp_mailpoet_stats_notifications: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_subscribers: Data: 0.02MB + Index: 0.13MB + Engine InnoDB wp_mailpoet_subscriber_custom_field: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_subscriber_ips: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_subscriber_segment: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_mailpoet_user_agents: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_mailpoet_user_flags: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_options: Data: 3.48MB + Index: 0.08MB + Engine InnoDB wp_postmeta: Data: 0.22MB + Index: 0.17MB + Engine InnoDB wp_posts: Data: 0.08MB + Index: 0.06MB + 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.02MB + 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_meta_lookup: Data: 0.02MB + Index: 0.09MB + 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 mailpoet_page: 1 page: 7 post: 2 product: 19 product_variation: 7 shop_order: 28 shop_order_refund: 1 shop_subscription: 4 ### Security ### Secure connection (HTTPS): ✔ Hide errors from visitors: ✔ ### Active Plugins (9) ### Query Monitor: by John Blackbourn – 3.7.1 Companion Plugin: by Osk – 1.18 Google Listings and Ads: by WooCommerce – 1.4.3 Jetpack: by Automattic – 10.1 Mailchimp for WooCommerce: by Mailchimp – 2.5.2 MailPoet 3 (New): by MailPoet – 3.69.1 WooCommerce PayPal Payments: by WooCommerce – 1.5.1 WooCommerce Subscriptions: by WooCommerce – 3.1.3 WooCommerce: by Automattic – 5.6.0 ### Inactive Plugins (2) ### Akismet Anti-Spam: by Automattic – 4.1.12 Hello Dolly: by Matt Mullenweg – 1.7.2 ### Dropin Plugins (1) ### db.php: Query Monitor Database Class ### 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: – ### WC Pages ### Shop base: #6 - /shop/ Cart: #7 - /cart/ Checkout: #8 - /checkout/ My account: #9 - /my-account/ Terms and conditions: ❌ Page not set ### Theme ### Name: Storefront Version: 3.8.1 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://voiceless-humboldt.jurassic.ninja Subscription Statuses: wc-active: 2 wc-on-hold: 2 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 ### PayPal Card Processing: wc-active: 1 PayPal: wc-active: 1 wc-on-hold: 2 ### Payment Gateway Support ### PayPal: refunds products subscriptions subscription_cancellation subscription_suspension subscription_reactivation subscription_amount_changes subscription_date_changes subscription_payment_method_change subscription_payment_method_change_customer subscription_payment_method_change_admin multiple_subscriptions PayPal Card Processing: refunds products subscriptions subscription_cancellation subscription_suspension subscription_reactivation subscription_amount_changes subscription_date_changes subscription_payment_method_change subscription_payment_method_change_customer subscription_payment_method_change_admin multiple_subscriptions ### WooCommerce PayPal Payments ### Onboarded: Yes Shop country code: US PayPal card processing available in country: Yes Pay Later messaging available in country: Yes Vault enabled: Yes ### Action Scheduler ### Complete: 155 Oldest: 2021-09-17 05:12:34 +0000 Newest: 2021-09-17 15:44:22 +0000 Pending: 2 Oldest: 2021-10-17 14:29:48 +0000 Newest: 2021-10-17 14:53:33 +0000 ### Status report information ### Generated at: 2021-09-17 16:16:58 +00:00 `
jorgeatorres commented 3 years ago

I'd like to add that it was discussed whether a warning was a good idea to add. I'm not against it, but we already have a ton of warnings. I believe it'd be better to clearly document that this is not supported at the moment. As for the customer experience, it'd be good if PPCP could remove itself from the list of available gateways when it detects a free trial subscription in the cart. Similarly to how it doesn't appear as an option when vaulting is disabled and you're playing for a subscription product.

WillBrubaker commented 2 years ago

Pretty sure I've got a case of this in 32602728-hc

see screen shot

dreamtooloud commented 2 years ago

Hi there! I was working on an issue today for 4388477-zd (closed but not resolved). I would like to note that this issue does not only impact free trial subscriptions but it also impacts merchants that synchronize their renewals with no prorate or fee at sign up (ie: All subscriptions are renewed on the 5th of the month, customer places order on the 25th of the previous month; no money is taken from that customer until the 5th, so a 'zero amount' is needed for customer signup).

So, this does impact more than free trial subscriptions.

I saw in a forums post that the work around is currently to ensure that customers have $0 checkout enabled in WooCommerce Subscriptions but that does require the customer to manually renew the subscription when the first payment date arrives (since payment methods won't be saved for a customer if they have a $0 amount). I will suggest this to the merchant I am working with for now, but I did want to make note here that there are more impacted merchant configurations.

adambware commented 2 years ago

Is this the correct issue to be following for updates on a fix for this "free trial" or "zero sum subscription" issue?

Consider this my vote 👍🏻

InpsydeNiklas commented 2 years ago

Yes, there will be more related issues but this one will be closed once the feature has been implemented. For PayPal, this likely happens in one of the next updates, so version 1.7.1 or 1.7.2 but I'm not sure about the PayPal Card Processing. Until then, the workarounds as suggested are enabling either zero-sum checkouts in the WooCommerce Subscriptions or setting a sign-up fee.

EricaKuschel commented 2 years ago

Adding hc-25352288 to this report to be contacted.

darcie commented 2 years ago

Request in 4915026-zen

ziodave commented 2 years ago

The fix should be in 1.8.0, adding a reference link: https://woocommerce.com/document/woocommerce-paypal-payments/#free-trials

melek commented 2 years ago

36300525-hc

User is on WooCommerce PayPal Payments 1.9.1 but is getting an error at checkout with a synchronized subscription that 'Never' prorates using WooCommerce Payments:

CANNOT_BE_ZERO_OR_NEGATIVE Must be greater than zero. If the currency supports decimals, only two decimal place precision is supported.
InpsydeNiklas commented 2 years ago

Update 1.8.0 implemented support for subscription products with a free trial period. But synchronized payment dates are not yet supported. These will follow in a future update. For the time being, saving a payment method with a free trial subscription product requires the merchant to have Reference Transactions transactions enabled. Without Reference Transactions, it may result in an UNKNOWN_BUSINESS_ERROR. Payment methods can be saved in the Vault without Reference Transactions for regular products and subscriptions. But for free trials, it only works with Reference Transactions enabled. We are looking into whether or not this requirement could be bypassed somehow but if Reference Transactions are available, it should be working.

marklifeboxfood commented 1 year ago

Hi @InpsydeNiklas - thank you for that helpful information. Regarding Synchronized Payments - if the value upfront payment is non-zero (i.e. my synchronized payment subscription includes a Sign Up Fee) the order completes successfully, and renewals "seem" to work fine... should I still avoid using paypal payments for synchronized payments if there is a non-zero fee, or is this use case generally supported? In other words, is there some other bug in this logic that would make future renewals fail or is the issue solely down to the CANNOT_BE_ZERO... issue

Thank you very much!

InpsydeNiklas commented 1 year ago

@marklifeboxfood The only problem is PayPal API not accepting zero-sum payments. So as long as the checkout total is non-zero, e.g. due to a signup fee, there is no problem with processing the payment and saving the payment method in the Vault. Free trial subscriptions use a special logic as explained here in the docs to save the payment method in the Vault without a payment. The next update (pre-release is available here) expands the functionality used for free trials to all scenarios where the Checkout total is zero and there is a subscription in the cart. So then it will also work when payment is synchronized and there is no signup fee.