Url () is not a fully qualified URL

lietuvonis
Contributor
Contributor

Most bizarre thing my PAYPAL SDK was working fine and then just stopped... most important it's intermittent...sometimes it processes the transaction sometimes it doesn't I have tried to log the living sh@@ out of my code and stil can't figure out what happened anyone can help?


<p[Removed. Phone #s not permitted]28:52] production.INFO: Received payment status request. {"request_data":{"checkout_type":"normal","paymentId":"PAYID-MU5ILLQ97Y87414M89180333","token":"EC-8CG89272NR3317133","PayerID":"YTC8Z2VQ9P82E"}}
\"id\": \"PAYID-MU5ILLQ97Y87414M89180333\",
\"intent\": \"sale\",
\"state\": \"approved\",
\"cart\": \"8CG89272NR3317133\",
\"payer\": {
\"payment_method\": \"paypal\",
\"status\": \"VERIFIED\",
\"payer_info\": {
\"email\": \"\",
\"first_name\": \"testmm\",
\"last_name\": \"buyer\",
\"payer_id\": \"YTC8Z2VQ9P82E\",
\"shipping_address\": {
\"recipient_name\": \"testmm buyer\",
\"id\": \"6948461615652027625\",
\"line1\": \"1 Main St\",
\"city\": \"San Jose\",
\"state\": \"CA\",
\"postal_code\": \"95131\",
\"country_code\": \"US\",
\"type\": \"HOME_OR_WORK\",
\"default_address\": false,
\"preferred_address\": true,
\"primary_address\": true,
\"disable_for_transaction\": false
},
\"country_code\": \"US\"
}
},
\"transactions\": [
{
\"amount\": {
\"total\": \"50.00\",
\"currency\": \"EUR\",
\"details\": {
\"subtotal\": \"50.00\",
\"shipping\": \"0.00\",
\"insurance\": \"0.00\",
\"handling_fee\": \"0.00\",
\"shipping_discount\": \"0.00\",
\"discount\": \"0.00\"
}
},
\"payee\": {
\"merchant_id\": \"CBJJDC847SYHQ\",
\"email\": \"\"
},
\"description\": \"file-tuning\",
\"item_list\": {
\"items\": [
{
\"name\": \"50.00 CRD\",
\"price\": \"50.00\",
\"currency\": \"EUR\",
\"tax\": \"0.00\",
\"quantity\": 1
}
],
\"shipping_address\": {
\"recipient_name\": \"testmm buyer\",
\"id\": \"6948461615652027625\",
\"line1\": \"1 Main St\",
\"city\": \"San Jose\",
\"state\": \"CA\",
\"postal_code\": \"95131\",
\"country_code\": \"US\",
\"type\": \"HOME_OR_WORK\",
\"default_address\": false,
\"preferred_address\": true,
\"primary_address\": true,
\"disable_for_transaction\": false
}
},
\"related_resources\": [
{
\"sale\": {
\"id\": \"2HD038396N1595005\",
\"state\": \"completed\",
\"amount\": {
\"total\": \"50.00\",
\"currency\": \"EUR\",
\"details\": {
\"subtotal\": \"50.00\",
\"shipping\": \"0.00\",
\"insurance\": \"0.00\",
\"handling_fee\": \"0.00\",
\"shipping_discount\": \"0.00\",
\"discount\": \"0.00\"
}
},
\"payment_mode\": \"INSTANT_TRANSFER\",
\"reason_code\": \"RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION\",
\"protection_eligibility\": \"ELIGIBLE\",
\"protection_eligibility_type\": \"ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE\",
\"receivable_amount\": {
\"value\": \"50.00\",
\"currency\": \"EUR\"
},
\"exchange_rate\": \"[Removed. Phone #s not permitted]",
\"parent_payment\": \"PAYID-MU5ILLQ97Y87414M89180333\",
\"create_time\": \"2023-10-26T15:28:54Z\",
\"update_time\": \"2023-10-26T15:28:54Z\",
\"links\": [
{
\"href\": \"https://api.sandbox.paypal.com/v1/payments/sale/2HD038396N1595005\",
\"rel\": \"self\",
\"method\": \"GET\"
},
{
\"href\": \"https://api.sandbox.paypal.com/v1/payments/sale/2HD038396N1595005/refund\",
\"rel\": \"refund\",
\"method\": \"POST\"
},
{
\"href\": \"https://api.sandbox.paypal.com/v1/payments/payment/PAYID-MU5ILLQ97Y87414M89180333\",
\"rel\": \"parent_payment\",
\"method\": \"GET\"
}
]
}
}
]
}
],
\"redirect_urls\": {
\"return_url\": \"/paypal/status/success?checkout_type=normal&paymentId=PAYID-MU5ILLQ97Y87414M89180333\",
\"cancel_url\": \"/paypal/status/cancel?checkout_type=normal\"
},
\"create_time\": \"2023-10-26T15:28:46Z\",
\"update_time\": \"2023-10-26T15:28:54Z\",
\"links\": [
{
\"href\": \"https://api.sandbox.paypal.com/v1/payments/payment/PAYID-MU5ILLQ97Y87414M89180333\",
\"rel\": \"self\",
\"method\": \"GET\"
}
],
\"failed_transactions\": []
}"}}
[stacktrace]
#0 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Api/Item.php(202): PayPal\\Validation\\UrlValidator::validate()
#1 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalModel.php(256): PayPal\\Api\\Item->setUrl()
#2 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalModel.php(244): PayPal\\Common\\PayPalModel->assignValue()
#3 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalModel.php(232): PayPal\\Common\\PayPalModel->fromArray()
#4 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalModel.php(223): PayPal\\Common\\PayPalModel->fromArray()
#5 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalModel.php(232): PayPal\\Common\\PayPalModel->fromArray()
#6 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalModel.php(270): PayPal\\Common\\PayPalModel->fromArray()
#7 /home/fsdfs52343534sfg/public_html/file_apps/vendor/paypal/rest-api-sdk-php/lib/PayPal/Api/Payment.php(652): PayPal\\Common\\PayPalModel->fromJson()
#8 /home/fsdfs52343534sfg/public_html/file_apps/app/Services/PayPalService.php(261): PayPal\\Api\\Payment->execute()
#9 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Controllers/Dashboard/CreditController.php(686): App\\Services\\PayPalService->getPaymentStatus()
#10 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\Dashboard\\CreditController->paypalStatus()
#11 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()
#12 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()
#13 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()
#14 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\\Routing\\Route->run()
#15 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#16 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Controllers/Dashboard/CreditController.php(52): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#17 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\\Http\\Controllers\\Dashboard\\CreditController->App\\Http\\Controllers\\Dashboard\\{closure}()
#18 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Middleware/CheckOtp.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#19 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\CheckOtp->handle()
#20 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Middleware/setCurrency.php(42): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#21 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\setCurrency->handle()
#22 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Middleware/IsVerified.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#23 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\IsVerified->handle()
#24 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Middleware/Authenticate.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#25 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\Authenticate->handle()
#26 /home/fsdfs52343534sfg/public_html/file_apps/app/Http/Middleware/Languages.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#27 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): App\\Http\\Middleware\\Languages->handle()
#28 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#29 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#30 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#31 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#32 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#33 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#34 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#35 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#36 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Session\\Middleware\\StartSession->handle()
#37 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#38 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#39 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#40 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#41 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#42 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\\Pipeline\\Pipeline->then()
#43 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\\Routing\\Router->runRouteWithinStack()
#44 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRoute()
#45 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\\Routing\\Router->dispatchToRoute()
#46 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()
#47 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#48 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#49 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#50 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#51 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#52 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#53 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#54 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#55 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()
#56 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#57 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#58 /home/fsdfs52343534sfg/public_html/file_apps/vendor/fruitcake/laravel-cors/src/HandleCors.php(38): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#59 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle()
#60 /home/fsdfs52343534sfg/public_html/file_apps/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#61 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fideloper\\Proxy\\TrustProxies->handle()
#62 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#63 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()
#64 /home/fsdfs52343534sfg/public_html/file_apps/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#65 /home/fsdfs52343534sfg/public_html/index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle()
#66 {main}
"}

 

Login to Me Too
9 REPLIES 9

yabdab
Contributor
Contributor

Having exact same issue starting late yesterday.

 

I temporarily stopped the error by commenting out the code  in rest-api-sdk-php/lib/PayPal/Validation/ UrlValidator.php

 

if (filter_var($url, FILTER_VALIDATE_URL) === false) {
            //throw new \InvalidArgumentException("$urlName is not a fully qualified URL");
        }

 

Hopefully PayPal will have more permanent fix ASAP.

Login to Me Too

lietuvonis
Contributor
Contributor
Good to know I'm not alone... Spent whole day trying to figure this out while getting abused by customer 🫡
Login to Me Too

jakeqz
Contributor
Contributor

> Hopefully PayPal will have more permanent fix ASAP.

 

I doubt it.  They're useless.  And I think they've been trying to deprecate the REST API in favour of the Javascript-based Braintree for years.

 

We already planned to switch to Stripe, and will be prioritizing that more now.

Login to Me Too

DarkZaioN
New Community Member

Thank you for solution.... same here hope they fixed soon, planning to move to v2.

Login to Me Too

SeriousJ
Contributor
Contributor

I have the same exact issue since yesterday. Getting error "Url is not a fully qualified URL" randomly while payments are being succesfully processed. Customers are getting angry.

Login to Me Too

jakeqz
Contributor
Contributor

It's worse than it seems.  The payment goes through, but the customer is told that it failed, and invited to try again.  Some customers have tried 3-4 times, and presumably been billed for each attempt.  We will have to refund them, but take the hit on the seller fees, which is unacceptable, along with time taken that could have been spent gainfully.

 

There is no means of contacting PayPal.  Would people be interested in pursuing a class action lawsuit against PayPal regarding this issue?

Login to Me Too

simarilius
Contributor
Contributor

Had the same issue on two webshops of my Customers. 
Instead of commenting out the Exception, i'll check if a empty element is give to the function, so on other cases (invalid URL)  it should work as intended.

 

public static function validate($url, $urlName = null)
{
// Paypal added new empty items to the items object
// "url": "",
// "image_url": ""
// which crashed the payment
if (!empty($url) && filter_var($url, FILTER_VALIDATE_URL) === false) {
throw new \InvalidArgumentException("$url: $urlName is not a fully qualified URL");
}

 

 

Login to Me Too

jakeqz
Contributor
Contributor

> Instead of commenting out the Exception, i'll check if a empty element is give to the function, so on other cases (invalid URL) it should work as intended.

 

That won't fix the problem, which is caused by the URL being missing a hostname and scheme.  E.g. PayPal returns `/checkout/complete?id=ABC` instead of `https://example.com/checkout/complete?id=ABC`.  From the PHP doc:

 

> The FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED flags for the FILTER_VALIDATE_URL filter have been removed. The scheme and host are (and have been) always required.

 

So there is no option to use `filter_var` to allow the URL returned by PayPal to pass the test.  The URL is not untrusted user input.  All this test is doing is helping diagnose a programming error in which you (or in this case PayPal) are not supplying a fully-qualified URL, mitigating against a harder-to-diagnose failure downstream.  So it is not required, but may be useful during development.

Login to Me Too

yabdab
Contributor
Contributor

This is 100% an issue from PayPal servers that started on October 25, 2023, mid-day eastern time.

 

If that is not enough info to fix the issue, then IO am not sure what else to do 🤷‍♂️

Login to Me Too

Haven't Found your Answer?

It happens. Hit the "Login to Ask the community" button to create a question for the PayPal community.