Closed asumaran closed 1 year ago
-- Starting from here "Keep the posts table and the orders tables synchronized" option was disabled --
Refund related issues seem to be fixed now after @vedanshujain has merged enhancement/33771
into the cot-main
branch.
So I looked over the code and wanted to see which functions need to be updated or adjusted to work with COT. Here's the list:
So we need to take care of the get_post_meta
, update_post_meta
, delete_post_meta
, and clean_post_cache
functions only.
I went through all the instances where get_post_meta, update_post_meta, delete_post_meta, and clean_post_cache are called and made sure it's working well with COT enabled and "Keep the posts table and the orders tables synchronized" unchecked.
Next step is to create a PR with tweaks for COT compatibility. Unfortunately, all the cases related to subscriptions are not supported for now because COT will not support WC Subscriptions. See pc2DNy-1V1-p2
order_data_exporter
method.
Stripe payment id
and Stripe customer id
informationsubscriptions_data_exporter
method.
maybe_handle_subscription
method.
maybe_handle_order
method.
add_subscription_payment_meta
method.
maybe_render_subscription_payment_method
method.
[x] 1 instance in the get_instructions
method.
get_instructions
to get the order meta using the new order API.maybe_update_source_on_subscription_order
method.
_stripe_customer_id
and _stripe_source_id
meta data are correctly added to the subscription in the DB (Use the subscription ID).update_failing_payment_method
method.
WC_Subscription
object so it's probably compatible with COT).add_subscription_payment_meta
method.
update_post_meta
is there for the following cases:
_stripe_source_id
attached to the subscription._stripe_source_id
attached to the account and there's no _stripe_source_id
attached the parent order of the subscription.maybe_render_subscription_payment_method
method.
[x] 1 instance in the save_instructions
method.
_stripe_multibanco
meta key is saved on the wp_wc_orders_meta
with "order_id = {recently created order ID}"[x] 1 instance in the save_post_test_update_meta_data_direct
method
delete_stripe_fee
method.
delete_stripe_fee
the problem I see is that there's no _stripe_fee
attached to the order. And when the renewal process finishes there's no _stripe_fee
meta data attached to the order. So, not sure if this delete_stripe_fee
is doing anything at all.delete_stripe_net
method.
_stripe_net
in the order then _stripe_net
is added to the order.maybe_handle_subscription
method.
return true
to the is_retention_expired
in the includes/admin/class-wc-stripe-privacy.php
file._stripe_source_id
, _stripe_refund_id
, and _stripe_customer_id
should be removed from the renewal order and the subscription.maybe_handle_order
method.
delete_resubscribe_meta
delete_resubscribe_meta
is added as a callback of wcs_resubscribe_order_created
which is called bywcs_create_resubscribe_order
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/wcs-resubscribe-functions.php
which is called bygenerate_renewal_order
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-renewal-order.php
which is called bygenerate_renewal_orders
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
which is called byupgrade_really_old_versions
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
which is called byajax_upgrade
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
which is called byinit
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
delete_resubscribe_meta
since it's called only when upgrading old subscritions.delete_renewal_meta
method.
delete_renewal_meta
delete_renewal_meta
is called bydelete_resubscribe_meta
in includes/compat/trait-wc-stripe-subscriptions.php
which is added as callback of actionwcs_resubscribe_order_created
in includes/compat/trait-wc-stripe-subscriptions.php
which is called bywcs_create_resubscribe_order
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/wcs-resubscribe-functions.php
which is called bygenerate_renewal_order
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-renewal-order.php
which is called bygenerate_renewal_orders
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
which is called byupgrade_really_old_versions
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
which is called byajax_upgrade
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
which is called byinit
in woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/upgrades/class-wc-subscriptions-upgrader.php
delete_resubscribe_meta
since it's called only when upgrading old subscritions.delete_renewal_meta
is added as a callback of actionwcs_renewal_order_created
which is called bywcs_create_renewal_order
called in multiple places byprocess_early_renewal_request
is added as a callback of actionwp_loaded
which is added ininit
in WCS_Early_Renewal_Modal_Handler
which is called byinit
in WC_Subscriptions_Plugin
which is called byinit
in WC_Subscriptions
which is called bywoocommerce-subscriptions.php
file when loaded.process_renewal
in /woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php
which is called byprepare_renewal
in /woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php
which is added as callback of actionwoocommerce_scheduled_subscription_payment
in /woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php
which is added byinit
in WC_Subscriptions_Manager
in /woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-manager.php
which is called byinit
in WC_Subscriptions_Core_Plugin
in /woocommerce-subscriptions/vendor/woocommerce/subscriptions-core/includes/class-wc-subscriptions-core-plugin.php
which is called byinit
in WC_Subscriptions_Plugin
in /woocommerce-subscriptions/includes/class-wc-subscriptions-plugin.php
which is called byinit
in WC_Subscriptions
in /woocommerce-subscriptions/woocommerce-subscriptions.php
which is called bywoocommerce-subscriptions.php
file when loaded.add_subscription_payment_meta
method.
add_subscription_payment_meta
is added as a callback of actionwoocommerce_subscription_payment_meta
which is added in maybe_init_subscriptions
of trait WC_Stripe_Subscriptions_Trait
in /woocommerce-gateway-stripe/includes/compat/trait-wc-stripe-subscriptions.php
update_payment_method
create_subscription
register_routes
via APIverify_intent_after_checkout
method.
woocommerce_account_view-order_endpoint
should be called which calls verify_intent_after_checkout
which then calls the clean_post_cache
function.Doing another battery of tests with “Use the WooCommerce orders tables” option enabled:
Store setup:
trunk
(7f3cbdd9)Starting from here “Keep the posts table and the orders tables synchronized” option was disabled.
Result:
No issues related to COT were found. When “Keep the posts table and the orders tables synchronized” was enabled, both wp_posts
and wp_wc_orders
have stayed in sync; after disabling it, only wp_wc_orders
was having information being set – as expected.
Bugs found:
To do:
I switched my local dev store to HPOS and subscriptions don't seem to work for me.
Store setup
develop
(https://github.com/woocommerce/woocommerce-gateway-stripe/commit/d9ed8a9be5f67c6c4290032fea30b67d6617b46f) with the following patch applied:diff --git a/woocommerce-gateway-stripe.php b/woocommerce-gateway-stripe.php
index 6a0a76c8..8b2a9359 100644
--- a/woocommerce-gateway-stripe.php
+++ b/woocommerce-gateway-stripe.php
@@ -777,7 +777,7 @@ add_action(
'before_woocommerce_init',
function() {
if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
- \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, false );
+ \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
}
}
);
--- a/woocommerce-subscriptions.php
+++ b/woocommerce-subscriptions.php
add_action(
'before_woocommerce_init',
function() {
if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
- \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, false );
+ \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
}
}
);
Testing flow
4242 4242 4242 4242
.Order details | Subscriptions list |
---|---|
The most relevant bit from the logs is this:
Error: stdClass Object
(
[error] => stdClass Object
(
[code] => payment_intent_unexpected_state
[doc_url] => https://stripe.com/docs/error-codes/payment-intent-unexpected-state
[message] => You cannot confirm this PaymentIntent because it's missing a payment method. You can either update the PaymentIntent with a payment method and then confirm it again, or confirm it again directly with a payment method.
[request_log_url] => https://dashboard.stripe.com/test/logs/req_eDMB8MdnINP1i4?t=1673917055
[type] => invalid_request_error
)
)
So it looks like there is no payment method assigned to the renewal payments? Not sure exactly what's going on.
Pending payment
.On Hold
in wp-admin > WooCommerce > Subscriptions.Same thing happens on a fresh store, except now renewals work but there's no Subscription added to wp-admin > WooCommerce > Subscription 🤔
Hmmm, after I deleted the payment methods that were initially saved during the first few subscription trials to reduce the list of payment methods in the database the renewals started failing again, likely because no payment method was saved:
This is with UPE enabled. It seems like UPE + HPOS doesn't save payment methods? Even when I checkout with a simple product and tick "save payment method" there is still no payment method added.
Adding a payment method through the payment method screen caused them all the previous trial attempts to appear:
Switching back to the non-UPE checkout has renewals working again, but there are still no Subscriptions showing up in the subscriptions list.
Using UPE with Blocks checkout works the same as non-UPE with the blocks checkout, i.e. payments and renewals successful, but no Subscriptions show up in the subscriptions list.
So in my tests I think this is the array of support for subs, at least as long as the Subs plugin wraps up the support by making sure the Subscriptions show up in the Subscriptions list:
Shortcode | Blocks | |
---|---|---|
Non-UPE Checkout | ✅ | ✅ |
UPE Checkout | ❌ | ✅ |
The UPE Checkout with the shortcode block is likely failing because the payment method is not being saved for some reason, which I think is a problem I've seen before sometime 🤔
When I use the latest subs testing release from pdjTHR-1Fu-p2#comment-2572 everything seems to work actually, so the issue is only present with v4.7.0 of subs (which we already knew to be incompatible).
I'm just glad the shortcode+UPE issue is an issue in subs, not Stripe 😌
@reykjalin In a fresh store using the very same setup you used, except Stripe, where I used 7.0.2, I could reproduce partially what you described here. I got the same until step 9 – the action runs fine and the order is processed and paid correctly, although, no subscriptions show up still.
After using the test release you mentioned it worked well 🙌 Replacing the subs 4.7.0 plugin with the test version in the same store step fixes the subscription list as well.
Doing another battery of tests with “Use the WooCommerce orders tables” option enabled:
develop
(1c36361ad485c962f5c7d27578a1ae8f8d2c9356)Note All tests done with HPOS enabled and “Keep the posts table and the orders tables synchronized" disabled.
Note Testing was done on a fresh store, but before starting the flows I processed 1 payment with HPOS turned off in an attempt to simulate a store that's migrating from WP tables to HPOS.
There seems to be an issue with saving cards when UPE is enabled causing cascading issues for subscriptions. The first payment seems to work, subscriptions are created correctly, and renewal jobs are properly instantiated. The only thing missing is payment method saving functionality.
@reykjalin I retested all of the items that failed for you. The following worked for me under the same store setup (with Stripe 7.0.2):
Can you double-check the ones above in a fresh store to confirm?
I spun up a new store with Stripe 7.0.2 and HPOS disabled and all tests under "Shopper - Subscriptions" that failed with HPOS enabled passed in this store. I'm investigating this.
Created #2531 to track failing critical flows.
@reykjalin I retested all of the items that failed for you. The following worked for me under the same store setup (with Stripe 7.0.2):
Shopper - Checkout - Save card at checkout
- UPE: ❌ This did not work; the card wasn't saved.
- No UPE: ❌ This did not work; the card wasn't saved.
Shopper - WooCommerce Blocks - Save card at checkout
- UPE: ❌ This did not work; the card wasn't saved.
@cesarcosta99 @reykjalin This worked for me as well. With HPOS enabled and UPE enabled/disabled and using shortcode based checkout or checkout block.
For more context visit: p1659937693943169-slack-C9QDV4TL4
As part of WooCommerce's migration to Custom Order Tables (COT) we need to prepare our code to be compatible with it when it's released to everyone.
So far, while testing the critical flows (No UPE) I've found an issue related to refunds.
There are likely more errors than that. We must at least ensure the critical flows (with or without UPE enabled) runs as expected without issues.
Per the COT Recipe Book, these are the functions we need to replace with the new WooCommerce APIs for getting/setting post and post meta data.
We seem affected, given that there are multiple occurrences of some of these functions in our code base.
List of occurrences
``` Searching 249 files for "(get_post)|(get_post_field)|(get_post_status)|(get_post_type)|(get_post_type_object)|(get_posts)|(metadata_exists)|(get_post_meta)|(get_metadata)|(get_metadata_raw)|(get_metadata_default)|(get_metadata_by_mid)|(wp_insert_post)|(add_metadata)|(add_post_meta)|(wp_update_post)|(update_post_meta)|(update_metadata)|(update_metadata_by_mid)|(delete_metadata)|(delete_post_meta)|(delete_metadata_by_mid)|(delete_post_meta_by_key)|(wp_delete_post)|(wp_trash_post)|(wp_untrash_post)|(wp_transition_post_status)|(clean_post_cache)|(update_post_caches)|(update_postmeta_cache)|(post_exists)" (regex) /Users/asumaran/www/woocommerce-gateway-stripe/includes/class-wc-gateway-stripe.php: 861: clean_post_cache( $order->get_id() ); /Users/asumaran/www/woocommerce-gateway-stripe/includes/class-wc-stripe-helper.php: 103: delete_post_meta( $order_id, self::META_NAME_FEE ); 104: delete_post_meta( $order_id, self::LEGACY_META_NAME_FEE ); 162: delete_post_meta( $order_id, self::META_NAME_NET ); 163: delete_post_meta( $order_id, self::LEGACY_META_NAME_NET ); /Users/asumaran/www/woocommerce-gateway-stripe/includes/class-wc-stripe-intent-controller.php: 409: 'metadata' => $gateway->get_metadata_from_order( $order ), /Users/asumaran/www/woocommerce-gateway-stripe/includes/admin/class-wc-stripe-privacy.php: 128: 'value' => get_post_meta( $order->get_id(), '_stripe_source_id', true ), 132: 'value' => get_post_meta( $order->get_id(), '_stripe_customer_id', true ), 193: 'value' => get_post_meta( $subscription->get_id(), '_stripe_source_id', true ), 197: 'value' => get_post_meta( $subscription->get_id(), '_stripe_customer_id', true ), 342: $stripe_source_id = get_post_meta( $subscription_id, '_stripe_source_id', true ); 361: delete_post_meta( $renewal_order_id, '_stripe_source_id' ); 362: delete_post_meta( $renewal_order_id, '_stripe_refund_id' ); 363: delete_post_meta( $renewal_order_id, '_stripe_customer_id' ); 366: delete_post_meta( $subscription_id, '_stripe_source_id' ); 367: delete_post_meta( $subscription_id, '_stripe_refund_id' ); 368: delete_post_meta( $subscription_id, '_stripe_customer_id' ); 381: $stripe_source_id = get_post_meta( $order_id, '_stripe_source_id', true ); 382: $stripe_refund_id = get_post_meta( $order_id, '_stripe_refund_id', true ); 383: $stripe_customer_id = get_post_meta( $order_id, '_stripe_customer_id', true ); 394: delete_post_meta( $order_id, '_stripe_source_id' ); 395: delete_post_meta( $order_id, '_stripe_refund_id' ); 396: delete_post_meta( $order_id, '_stripe_customer_id' ); /Users/asumaran/www/woocommerce-gateway-stripe/includes/compat/trait-wc-stripe-subscriptions.php: 384: update_post_meta( $subscription_id, '_stripe_customer_id', $source->customer ); 387: update_post_meta( $subscription_id, '_stripe_source_id', $source->payment_method ); 389: update_post_meta( $subscription_id, '_stripe_source_id', $source->source ); 400: delete_post_meta( $resubscribe_order->get_id(), '_stripe_customer_id' ); 401: delete_post_meta( $resubscribe_order->get_id(), '_stripe_source_id' ); 403: delete_post_meta( $resubscribe_order->get_id(), '_stripe_card_id' ); 405: delete_post_meta( $resubscribe_order->get_id(), '_stripe_intent_id' ); 419: delete_post_meta( $renewal_order->get_id(), '_stripe_intent_id' ); 433: update_post_meta( $subscription->get_id(), '_stripe_customer_id', $renewal_order->get_meta( '_stripe_customer_id', true ) ); 434: update_post_meta( $subscription->get_id(), '_stripe_source_id', $renewal_order->get_meta( '_stripe_source_id', true ) ); 449: $source_id = get_post_meta( $subscription_id, '_stripe_source_id', true ); 453: $source_id = get_post_meta( $subscription_id, '_stripe_card_id', true ); 456: update_post_meta( $subscription_id, '_stripe_source_id', $source_id ); 457: delete_post_meta( $subscription_id, '_stripe_card_id', $source_id ); 463: 'value' => get_post_meta( $subscription_id, '_stripe_customer_id', true ), 530: $stripe_source_id = get_post_meta( $subscription->get_id(), '_stripe_source_id', true ); 534: $stripe_source_id = get_post_meta( $subscription->get_id(), '_stripe_card_id', true ); 537: update_post_meta( $subscription->get_id(), '_stripe_source_id', $stripe_source_id ); 541: $stripe_customer_id = get_post_meta( $subscription->get_id(), '_stripe_customer_id', true ); 560: $stripe_customer_id = get_post_meta( $subscription->get_parent_id(), '_stripe_customer_id', true ); 561: $stripe_source_id = get_post_meta( $subscription->get_parent_id(), '_stripe_source_id', true ); 565: $stripe_source_id = get_post_meta( $subscription->get_parent_id(), '_stripe_card_id', true ); 568: update_post_meta( $subscription->get_parent_id(), '_stripe_source_id', $stripe_source_id ); /Users/asumaran/www/woocommerce-gateway-stripe/includes/payment-methods/class-wc-gateway-stripe-multibanco.php: 241: $data = get_post_meta( $order_id, '_stripe_multibanco', true ); 292: update_post_meta( $order_id, '_stripe_multibanco', $data ); /Users/asumaran/www/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-payment-request.php: 1556: $posted_data = $wc_checkout->get_posted_data(); /Users/asumaran/www/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-upe-payment-gateway.php: 572: $request['metadata'] = $this->get_metadata_from_order( $order ); 1306: public function get_metadata_from_order( $order ) { /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/class-wc-gateway-stripe.php: 860: clean_post_cache( $order->get_id() ); /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/class-wc-stripe-helper.php: 103: delete_post_meta( $order_id, self::META_NAME_FEE ); 104: delete_post_meta( $order_id, self::LEGACY_META_NAME_FEE ); 162: delete_post_meta( $order_id, self::META_NAME_NET ); 163: delete_post_meta( $order_id, self::LEGACY_META_NAME_NET ); /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/class-wc-stripe-intent-controller.php: 409: 'metadata' => $gateway->get_metadata_from_order( $order ), /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/admin/class-wc-stripe-privacy.php: 121: 'value' => get_post_meta( $order->get_id(), '_stripe_source_id', true ), 125: 'value' => get_post_meta( $order->get_id(), '_stripe_customer_id', true ), 186: 'value' => get_post_meta( $subscription->get_id(), '_stripe_source_id', true ), 190: 'value' => get_post_meta( $subscription->get_id(), '_stripe_customer_id', true ), 335: $stripe_source_id = get_post_meta( $subscription_id, '_stripe_source_id', true ); 354: delete_post_meta( $renewal_order_id, '_stripe_source_id' ); 355: delete_post_meta( $renewal_order_id, '_stripe_refund_id' ); 356: delete_post_meta( $renewal_order_id, '_stripe_customer_id' ); 359: delete_post_meta( $subscription_id, '_stripe_source_id' ); 360: delete_post_meta( $subscription_id, '_stripe_refund_id' ); 361: delete_post_meta( $subscription_id, '_stripe_customer_id' ); 374: $stripe_source_id = get_post_meta( $order_id, '_stripe_source_id', true ); 375: $stripe_refund_id = get_post_meta( $order_id, '_stripe_refund_id', true ); 376: $stripe_customer_id = get_post_meta( $order_id, '_stripe_customer_id', true ); 387: delete_post_meta( $order_id, '_stripe_source_id' ); 388: delete_post_meta( $order_id, '_stripe_refund_id' ); 389: delete_post_meta( $order_id, '_stripe_customer_id' ); /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/compat/trait-wc-stripe-subscriptions.php: 384: update_post_meta( $subscription_id, '_stripe_customer_id', $source->customer ); 387: update_post_meta( $subscription_id, '_stripe_source_id', $source->payment_method ); 389: update_post_meta( $subscription_id, '_stripe_source_id', $source->source ); 400: delete_post_meta( $resubscribe_order->get_id(), '_stripe_customer_id' ); 401: delete_post_meta( $resubscribe_order->get_id(), '_stripe_source_id' ); 403: delete_post_meta( $resubscribe_order->get_id(), '_stripe_card_id' ); 405: delete_post_meta( $resubscribe_order->get_id(), '_stripe_intent_id' ); 419: delete_post_meta( $renewal_order->get_id(), '_stripe_intent_id' ); 433: update_post_meta( $subscription->get_id(), '_stripe_customer_id', $renewal_order->get_meta( '_stripe_customer_id', true ) ); 434: update_post_meta( $subscription->get_id(), '_stripe_source_id', $renewal_order->get_meta( '_stripe_source_id', true ) ); 449: $source_id = get_post_meta( $subscription_id, '_stripe_source_id', true ); 453: $source_id = get_post_meta( $subscription_id, '_stripe_card_id', true ); 456: update_post_meta( $subscription_id, '_stripe_source_id', $source_id ); 457: delete_post_meta( $subscription_id, '_stripe_card_id', $source_id ); 463: 'value' => get_post_meta( $subscription_id, '_stripe_customer_id', true ), 530: $stripe_source_id = get_post_meta( $subscription->get_id(), '_stripe_source_id', true ); 534: $stripe_source_id = get_post_meta( $subscription->get_id(), '_stripe_card_id', true ); 537: update_post_meta( $subscription->get_id(), '_stripe_source_id', $stripe_source_id ); 541: $stripe_customer_id = get_post_meta( $subscription->get_id(), '_stripe_customer_id', true ); 560: $stripe_customer_id = get_post_meta( $subscription->get_parent_id(), '_stripe_customer_id', true ); 561: $stripe_source_id = get_post_meta( $subscription->get_parent_id(), '_stripe_source_id', true ); 565: $stripe_source_id = get_post_meta( $subscription->get_parent_id(), '_stripe_card_id', true ); 568: update_post_meta( $subscription->get_parent_id(), '_stripe_source_id', $stripe_source_id ); /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/payment-methods/class-wc-gateway-stripe-multibanco.php: 237: $data = get_post_meta( $order_id, '_stripe_multibanco', true ); 288: update_post_meta( $order_id, '_stripe_multibanco', $data ); /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-payment-request.php: 1584: $posted_data = $wc_checkout->get_posted_data(); /Users/asumaran/www/woocommerce-gateway-stripe/release/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-upe-payment-gateway.php: 534: $request['metadata'] = $this->get_metadata_from_order( $order ); 1268: public function get_metadata_from_order( $order ) { /Users/asumaran/www/woocommerce-gateway-stripe/tests/phpunit/helpers/class-wc-helper-product.php: 394: update_post_meta( $id, '_test2', 'world' ); 103 matches across 17 files ```