Hi,
Thank you for the log file.
Your pages are currently sent with this header:
content-security-policy: default-src 'self' 'unsafe-inline'
That header tells the browser of your visitors to only load things coming from your own domain. It contains no script-src, no frame-src and no connect-src, so all three fall back on that default-src, and everything coming from PayPal is refused by the browser: the script
www.paypal.com/sdk/js
which draws the payment buttons, the frames the buttons are drawn inside, and the calls that script makes to PayPal. Your customer is then left with an empty payment area and no way to log into PayPal, which is exactly what they describe.
Where it comes from :
Not from the Joomla plugin this time, which is why disabling that plugin, as you did in February, does not fix it anymore. The header comes from your server, from the .htaccess file at the root of your website:
- your static files carry a Content-Security-Policy too (
www.mohairbearmakingsupplies.co.uk/media...hop/css/hikashop.css
answers with "default-src 'self'; script-src 'none';"), and those files are served by Apache without Joomla ever running, so the header can only come from the server configuration
- your pages also carry the same policy a second time under the old name x-content-security-policy, which the Joomla plugin never sends
If you use a security extension which writes your .htaccess file for you, Admin Tools and its .htaccess Maker being the usual one, change the setting there and let it write the file again. If you edit the .htaccess file directly, your change will be lost the next time that extension regenerates it.
How to configure it :
Keep the header, but allow PayPal in it. The value to use in place of the current one:
default-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://*.paypal.com https://*.paypalobjects.com; frame-src 'self' https://*.paypal.com; connect-src 'self' https://*.paypal.com; img-src 'self' data: https://*.paypal.com https://*.paypalobjects.com
Leave the rule for your static files alone, it is fine as it is and it does not concern PayPal.
If you ever go back to the "System - HTTP Headers" plugin of Joomla instead, the same thing is done in its "Content-Security-Policy (CSP)" tab, where you add one line per directive in the table at the bottom: script-src with the value 'self' 'unsafe-inline' https://*.paypal.com https://*.paypalobjects.com, then frame-src with 'self' https://*.paypal.com, then connect-src with 'self' https://*.paypal.com, and img-src with 'self' data: https://*.paypal.com https://*.paypalobjects.com.
One last thing, unrelated to the buttons :
Your log shows 62 payments refused by PayPal at the very last moment, against about 20 which went through. In each case the customer logged into PayPal and approved the payment, and when your website asked PayPal to take the money, PayPal answered:
DUPLICATE_INVOICE_ID: Duplicate Invoice ID detected. To avoid a potential duplicate transaction your account setting requires that Invoice Id be unique for each transaction.
The money is never taken and the order stays unpaid, while your customer believes they paid. The orders 92784, 92786, 92798, 92802, 92807, 92812, 92872, 92877, 92879 and 92884 are examples, and the most recent one is from the 4th of June. This is the setting I mentioned at the beginning of this thread: in your PayPal account, under Account Settings then Payment preferences, "Block accidental payments" has to be set to "No, allow multiple payments per invoice ID". PayPal names that setting itself in its answer, so it is still set the other way today.