Just installed this on 1.5.8a, php 7.4.33, OPC 2.5.4
We were looking for 3DS verification so I placed an order with a card that is enrolled and it just went straight to checkout_success. OK, small amount, I guess PayPal didn't see any flags so it allowed the transaction.
I then started to look for an option to force 3DS, but the option wasn't there so I looked in paypalr.php - I commented the if statement on lines 1262 and 1282, as well as the if statement in includes/modules/payment/paypal/PayPalRestful/Zc2Pp/CreatePayPalOrderRequest.php on line 456
I believe this is all there is related to SCA_ALWAYS.
I started checkout, it went to confirmation and then to paypal where I was requested to do the 3DS verification. I clicked the provided "cancel" button, it took me back to the website and to checkout_success page. My card was charged.
Tried again, got to 3DS verification, entered my bank app and clicked Decline in the app, the app warned me the transaction will be cancelled if I confirm, I confirmed and landed on checkout_success with my card charged.
No matter what I tried, even if 3DS fails, the order is still created and card is charged. Is this a bug or expected behavior? I would expect the transaction to fail if 3DS fails... Or am I missing something stupid here?
In debug logs, I have the following (happy to PM full log if needed):
CreatePayPalOrderRequest::__construct(card, ...) finished, request:
...
'payment_source' =>
'attributes' =>
array (
'verification' =>
array (
'method' => 'SCA_ALWAYS',
),
),
),
),
2025-02-18 18:28:12: (checkout_process) ==> Start createOrder
TokenCache::get, using saved access-token; expires in 28843 seconds.
The curlPost (v2/checkout/orders) request was successful (201).
{
"id": "38Y93193YUxxxxxxx",
"status": "PAYER_ACTION_REQUIRED",
"purchase_units": [
{
"reference_id": "default"
}
],
"links": [
{
"href": "https:\/\/api.paypal.com\/v2\/checkout\/orders\/38Y93193YUxxxxxxx",
"rel": "self",
"method": "GET"
},
{
"href": "https:\/\/www.paypal.com\/webapps\/helios?action=verify&flow=3ds&cart_id=38Y93193YUxxxxxxx",
"rel": "payer-action",
"method": "GET"
}
]
}
2025-02-18 18:28:13: (checkout_process) ==> End createOrder
2025-02-18 18:28:13: (checkout_process) before_process, sending the customer off to a 3DS link (https://www.paypal.com/webapps/helios?action=verify&flow=3ds&cart_id=38Y93193YUxxxxxxx).
2025-02-18 18:28:27: (index) ppr_webhook_main (3ds_return, live) starts.
{
"op": "3ds_return",
"error": "error",
"error_description": "error",
"liability_shift": "NO",
"main_page": "index"
}
2025-02-18 18:28:28: (checkout_process) ==> Start captureOrder