Automattic / woocommerce-payments

Accept payments via credit card. Manage transactions within WordPress.
https://wordpress.org/plugins/woocommerce-payments/
Other
173 stars 69 forks source link

Stripe Link is Incompatible with Subscription Renewals #6261

Closed csmcneill closed 1 year ago

csmcneill commented 1 year ago

Describe the bug

If a subscription is purchased via Stripe Link, subsequent renewals will not process. They will fail with the following error:

2023-05-09T01:38:14+00:00 ERROR There is no saved payment token for order # [...]

In my tests, the pm_ ID is stored correctly in Stripe, but that information isn't being passed to Woo or stored on the site to retrieve that information for renewals.

To Reproduce

  1. Enable UPE and enable Stripe Link.
  2. Purchase a subscription product.
  3. Edit the subscription at WooCommerce > Subscriptions and attempt to change the payment method—you will be unable to.
  4. Go through the Renew now flow and the subscription can be renewed as the customer has to go through the checkout flow again.
  5. Process a renewal via the Subscription actions metabox or by manually running the associated woocommerce_scheduled_subscription_payment scheduled action.
  6. The renewal order will fail.

Actual behavior

If a customer purchases a subscription via Stripe Link, the renewals fail, and there is no way for the subscription tokens to be added manually.

Screenshots

Markup on 2023-05-09 at 17:42:14

Markup on 2023-05-09 at 17:43:15

Markup on 2023-05-09 at 17:43:53

Markup on 2023-05-09 at 17:44:20

Expected behavior

Either of the following:

  1. Subscriptions purchased via Stripe Link renew properly.
  2. Stripe Link is not offered for carts that include a subscription product.

Additional context

p1683573649730159-slack-C7U3Y3VMY 6271366-zen

zmaglica commented 1 year ago

According to Pc2DNy-3z-p2, this falls in Helix @haszari. Tagging as a part of Gamma Porter duties PcreKM-yM-p2.

haszari commented 1 year ago

Thanks – since this is subscription related it's best to hand over to Quark - FYI @thenbrent .

I'll update the Product Responsibilities page (Pc2DNy-3z-p2) to add Quark team for WCPay Subscriptions.

maxlaf commented 1 year ago

6477405-zen

frosso commented 1 year ago

As a temporary "fix", we have https://github.com/Automattic/woocommerce-payments/issues/6709 . But we might end up closing https://github.com/Automattic/woocommerce-payments/issues/6709 for a more definitive solution.

timur27 commented 1 year ago

Hey @csmcneill, we've just merged some implementation into develop which should fix the issue and I couldn't reproduce it. May we ask you to test the fix if your setup allows it and let us know if we can close the issue?

cc @FangedParakeet

csmcneill commented 1 year ago

Hey @timur27! If you can provide me with a ZIP I can install on my test site, I'll be glad to give it a whirl. When I try to activate the develop branch after uploading it to the site, I get a fatal error (which is probably due to my own naïveté):

Fatal error: Uncaught Error: Failed opening required '/srv/htdocs/wp-content/plugins/woocommerce-payments/vendor/autoload_packages.php' (include_path='.:') in /srv/htdocs/wp-content/plugins/woocommerce-payments/woocommerce-payments.php:27
Stack trace:
#0 /wordpress/core/6.2.2/wp-admin/includes/plugin.php(2314): include_once()
#1 /wordpress/core/6.2.2/wp-admin/includes/plugin.php(661): plugin_sandbox_scrape('woocommerce-pay...')
#2 phar:///usr/local/bin/wp-cli/vendor/wp-cli/extension-command/src/Plugin_Command.php(347): activate_plugin('woocommerce-pay...', '', NULL)
#3 [internal function]: Plugin_Command->activate(Array, Array)
#4 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/CommandFactory.php(100): call_user_func(Array, Array, Array)
#5 [internal function]: WP_CLI\Dispatcher\CommandFactory::WP_CLI\Dispatcher\{closure}(Array, Array)
#6 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/Subcommand.php(491): call_user_func(Object(Closure), Array, Array)
#7 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(419): WP_CLI\Dispatcher\Subcommand->invoke(Array, Array, Array)
#8 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(442): WP_CLI\Runner->run_command(Array, Array)
#9 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1256): WP_CLI\Runner->run_command_and_exit()
#10 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/WP_CLI/Bootstrap/LaunchRunner.php(28): WP_CLI\Runner->start()
#11 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/bootstrap.php(78): WP_CLI\Bootstrap\LaunchRunner->process(Object(WP_CLI\Bootstrap\BootstrapState))
#12 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/wp-cli.php(32): WP_CLI\bootstrap()
#13 phar:///usr/local/bin/wp-cli/php/boot-phar.php(11): include('phar:///usr/loc...')
#14 /usr/local/bin/wp-cli(4): include('phar:///usr/loc...')
#15 {main}
  thrown in /srv/htdocs/wp-content/plugins/woocommerce-payments/woocommerce-payments.php on line 27
timur27 commented 1 year ago

@csmcneill Thanks for your attempt while testing this, Chris! Could you please try woo-payments-develop.zip and let us know if any other support from our side would be needed to test it. Thank you!

csmcneill commented 1 year ago

@timur27 I don't have access to Zenhub, so that link isn't quite working for me 😞

The error I get is when I download the ZIP from GH...

Markup 2023-08-07 at 10 17 51

...and then try to activate it on my test site. I've tried activating it via wp-admin and WP CLI without success.

FangedParakeet commented 1 year ago

The error I get is when I download the ZIP from GH...

This is probably happening because if you just download the raw repo zip from GH, you still need to build all the dependencies before you can use it on a test site. Nonetheless never fear, here's one I made earlier--hopefully the link below works for you! @csmcneill, gimme a shout if it's still not opening and I'll figure something else out.

woocommerce-payments.zip

csmcneill commented 1 year ago

Thanks a ton for that @FangedParakeet!

I tested this out on the same site I was using to explore #4492 (read p1691503660845959-slack-CGGCLBN58 for all the juicy details, including login information) and am still unable to renew a subscription paid via Link:

Markup on 2023-08-08 at 13:57:06

Edit: I realized that what I was testing is very similar to the flow in #4492 since the site's currency was still set to EUR. However, disabling multicurrency completely and changing the site's currency to USD still yields the same error.

FangedParakeet commented 1 year ago

6965 has now been tested internally, approved, and merged. @csmcneill, if I may summon you once more and beseech you to retest this issue one more time, whenever you're able, can you please let me know if we have indeed managed to patch this problem this time. I am now able to reliably process subscription payments on my own test site, so hopefully these new changes now successfully address this issue directly.

Please find an updated build of the plugin attached below for you to trial on a test site. As always many thanks in advance and hopefully we have managed to resolve this issue for good this time. 🙏

woocommerce-payments-latest.zip

frosso commented 1 year ago

@FangedParakeet (& @csmcneill ) FWIW, I created a subscription with Stripe Link. As a merchant, I manually renewed the subscription. It worked. Then, as a customer, I manually changed the subscription's payment method to "card". As a merchant, I manually renewed the subscription again. It also worked.

I think the fix was good 👍

(The subscription was processed with the "Legacy UPE" because of the current fallback from the Split UPE).

frosso commented 1 year ago

@csmcneill feel free to test this further - otherwise, we can mark this ticket as closed?

FangedParakeet commented 1 year ago

I tested this on a fresh JN and I was able to process a subscription renewal with Stripe Link...but I did face a few other issues and can confirm that @csmcneill is not losing his mind and imagining things. 😂

(The subscription was processed with the "Legacy UPE" because of the current fallback from the Split UPE).

This is the key basically. Stripe Link payment tokens are being sent to the non-existent woocommerce_payments_link gateway instead of the woocommerce_payments gateway where they should belong--only when the split UPE is enabled.

I've just authored #7026 that should resolve this and bring balance to the force once and for all. That PR also adds a fix that I believe will ensure that SEPA Debit is functional as a saved payment method/subscription payment method as well. However, I have not yet fully enabled SEPA Debit when the split UPE is enabled (so you will have to manually edit this function to test SEPA with the split UPE), as I would rather wait for consensus in #5517 and test SEPA with the split UPE a bit more comprehensively, before leaping to enable it in #7026.

Nonetheless I'm pretty confident #7026 will finally dam the floodgate of tears unloaded by this issue, so once it is merged, I think we should be able to close out this issue at last.

FangedParakeet commented 1 year ago

@csmcneill, I think we can test this one internally in #7026, so if your hands are full don't feel the need to drop whatever they're currently occupied with. Nonetheless if your curiosity cannot be constrained, here's a new build that contains the Stripe Link fix, should you yearn to see the promised land with your own eyes.

woocommerce-payments-stripe-link-fix.zip