We are running WooCommerce DPM - and about 1 in 10 transactions get this error:
Order status changed from Pending Payment to Completed.
--- then seconds later ---
Payment failure: code 3 – This transaction cannot be accepted. (98). Order status changed from Completed to Failed.
In every case the customer is double billed.
There are no logged errors anywhere...
I did speak with support (who are super helpful, btw) - but they pointed out the error is likely coming from re-using hash codes (clicking back and going to the wrong page). It seems like a bug between Woo and Authorize, not a transaction error.
On the customer side I think they get an error message along with "Transaction Approved" and then re-enter it. I have not been able to duplicate it.
I have heard of this happening to other sites by Googling around....
I just encountered the same problem with the Woocommerce Authorize.net DPM plugin this past weekend and came across this thread while trying to figure out what happened.
Since I hate finding old forum posts describing my problem but with no solution, I thought I'd share what I think the problem is:
1. When a customer checks out in Woocommerce, they are sent to an "order payment" page where they can enter their credit card info and a unique hash is generated that can only be used once. When the order is submitted, the customer is charged by Authorize.net and the Woocommerce DPM plugin changes the order status from "pending payment" to "processing" .
2. Next, the customer should be redirected to an "order received" page, but sometimes this can take longer than normal due to server load or some other reason. If the customer refreshes the page before the order received page loads, the order gets submitted to Authorize.net again with the same information, including the same unique hash.
3. Since the hash has already been used once, the resubmitted order gets rejected and here's where the problem happens: Woocommerce DPM receives the rejected message and changes the order status from "processing" to "failed" which triggers it to cancel loading the "order received" page and load the "order payment" page again.
4. The customer never gets the order received page and instead sees an error message and the payment page again asking them to re-enter their information. Because this is a new order payment page, a new hash is generated so when the customer re-enters their credit card info and submits it again, it is accepted by Authorize.net and they end up getting double billed.
The problem is that once the Woocommerce Authorize.net DPM plugin gets the message that payment is accepted and changes the order status from "Pending Payment" to "Processing", it needs to take server lag into account and ignore any other messages it gets from Authorize.net until the order received page has had time to load. I'm still working with Woocommerce to find a solution for this, but I hope someone finds this explantion helpful.