-
Notifications
You must be signed in to change notification settings - Fork 50
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
Conversation
There was a problem hiding this 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(); |
There was a problem hiding this comment.
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? 🤔
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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:
- POST order with Auth intent
- PATCH
- Authorize
- 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:
- POST order with Auth intent
- PATCH
- 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
.
Fixes #367.