BUG: No Delayed Capture for Payflow Pro Credit Cards
We have finally switched from Magento 1.x to 2.4 and found a nasty bug in the way Magento 2.4 handles calls to the Payflow Pro server. It has to be a bug because we got the correct results when processing credit cards via Magento 1.x and Payflow Pro.
We had to custom code a listener to "fix" it because there does not seem to be any other workaround. If there is anyone else in the community that has come across this issue, please let me know and if/how you resolved it.
While PayPal Express is properly doing “Delayed Capture” for every closing transaction in Magento 2, PayFlow Pro credit card processing only seems to be issuing a “Sale”, regardless of if the 'Payment Action' is set to 'Authorization' or 'Sale'.
What a “Sale” does, according to Payflow Developer Support, is act as a NEW transaction on the customer’s credit card account, leaving the prior Authorization to be held for 72 hours (or longer depending on the credit card company) resulting in customers’ card companies sometimes declining the sale (if double the balance is not available) or leaving the customer thinking they have been double-billed. This is particularly bad when the products are in the thousand dollars range. Say a customer has a $5,000 credit limit and they want to buy a $3,000 product from us... they'll get declined because the Auth and Sale need $6,000 available on that account!
The proper way is to issue an Authorization, followed by a Delayed Capture. This simply converts the hold on funds into a final capture, and it's how EVERYONE (including PayPal Express Checkout) operates.
Here are the codes Magento 1 would send to Payflow Pro to complete credit card transactions:
[trxtype] => A
[trxtype] => D
Here’s what we see now with Magento 2 for credit card transactions when the 'Payment Action' is set to 'Authorization':
'TRXTYPE' => 'A',
'TRXTYPE' => 'S'
See the difference? ‘A’ for Authorization and ‘S’ for Sale, where ‘D’ is for Delayed Capture. The "S" code should ONLY be used when 'Payment Action' is set to 'Sale', right?
Is this a flaw in Magento 2's Payflow Pro API?
"Sale" should only be issued if 'Payment Action' in Magento = "Sale" otherwise, if 'Payment Action' = "Authorization" the next step should be "Delayed Capture"