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

Add retry counter meta to order to avoid duplicate invoice error on c… #371

Merged
merged 2 commits into from
Nov 22, 2021

Conversation

Dinamiko
Copy link
Contributor

Fixes #367.

@Dinamiko Dinamiko requested a review from AlexP11223 November 18, 2021 13:53
Copy link
Contributor

@AlexP11223 AlexP11223 left a comment

Choose a reason for hiding this comment

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

I don't know if this solution is ok, not sure how these invoices work, what happens with the previous "errored" invoices, and whether it is ok to have IDs like this.

$this->session_handler->destroy_session_data();
wc_add_notice( $error_message, 'error' );

return $failure_data;
}

WC()->cart->empty_cart();
Copy link
Contributor

Choose a reason for hiding this comment

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

Why do we do this? 🤔

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 moved it from OrderProcessor::process to here because otherwise there were no chance to retry the payment when the payment is not saved on PayPal.

Copy link
Contributor Author

@Dinamiko Dinamiko Nov 18, 2021

Choose a reason for hiding this comment

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

@AlexP11223

In order to prevent subscriptions renewals to fail because no payment stored for customer we are introducing a check after the payment to see if the payment is saved on PayPal or not, if it´s not saved then we set the WC order as failed.

The problem is that if the customer tries again with the same order it gets a DUPLICATE_INVOICE_ID, here is how I currently implemented it:

  1. POST order with Auth intent
  2. PATCH
  3. Authorize
  4. Check if payment is saved, if so capture auth order.

The above works, however if point 4 fails, we void the auth order and start again:

  1. POST order with Auth intent
  2. PATCH
  3. Authorize, here we get DUPLICATE_INVOICE_ID

The error is because as the PayPal authorization was successful, that order ID is “used”, so we have to increment or otherwise alter the invoice ID.

I´ve implemented the later by adding a counter at the end, so if WC-001 is used, we alter it to WC-001-1.

@Dinamiko Dinamiko merged commit 5469a93 into trunk Nov 22, 2021
@Dinamiko Dinamiko deleted the PCP-423-when-paying-for-a-subscrition-an branch November 22, 2021 10:25
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.

[RC] When paying for a subscription and vaulting fails, cart is cleared (423)
2 participants