Я пытаюсь реализовать кнопки оформления платежей PayPal в шаблоне Play Scala с помощью Webjars. Это определение в SBT:
"org.webjars" %% "webjars-play"% "2.6.1",
"org.webjars"% "bootstrap"% "4.2.1" exclude ("org.webjars", "jquery"),
"org.webjars"% "jquery"% "3.2.1",
Это импорт в шаблоне:
@import org.webjars.play.WebJarsUtil
Я также включаю сценарии плагинов javaScript для jQuery, Popper.js и начальной загрузки.
Следующий HTML-код хорошо работает в браузере:
<!DOCTYPE html>
<html>
<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script
src="https://www.paypal.com/sdk/js?client-id=sb">
</script>
</head>
<body>
<div id="paypal-button-container"></div>
<script>
paypal.Buttons().render('#paypal-button-container');
</script>
</body>
</html>
но он не рендерит в шаблоне воспроизведения. Спасибо за вашу помощь в решении этой проблемы
Кшиштоф, проблема решена с помощью следующей модификации конфигурации Play:
# Security Filter Configuration - Content Security Policy
play.filters.headers {
contentSecurityPolicy = "default-src 'self' * .paypal.com;"
contentSecurityPolicy = $ {play.filters.headers.contentSecurityPolicy} "img-src 'self' data: * .fbcdn.net * .twimg.com * .googleusercontent.com * .xingassets.com vk.com * .yimg.com secure .gravatar.com; "
contentSecurityPolicy = $ {play.filters.headers.contentSecurityPolicy} "style-src 'self' 'unsafe-inline' cdnjs.cloudflare.com maxcdn.bootstrapcdn.com cdn.jsdelivr.net fonts.googleapis.com;"
contentSecurityPolicy = $ {play.filters.headers.contentSecurityPolicy} "font-src 'self' fonts.gstatic.com fonts.googleapis.com cdnjs.cloudflare.com;"
contentSecurityPolicy = $ {play.filters.headers.contentSecurityPolicy} "script-src 'self' 'unsafe-inline' 'unsafe-eval' cdnjs.cloudflare.com * .paypal.com;"
contentSecurityPolicy = $ {play.filters.headers.contentSecurityPolicy} "connect-src 'self' twitter.com * .xing.com * .paypal.com;"
Спасибо
Я также хотел перейти с Play 2.6.11 на Play 2.7.0. Однако после включения плагинов и зависимости Requirejs я получаю следующую ошибку при выполнении:
ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.AbstractMethodError: Method org / webjars / play / RequireJS.play $ api $ mvc $ Results $ _setter_ $ PreconditionRequired_ $ eq (Lplay / api / mvc / Results $ Status;) V is abstract at org.webjars.play.RequireJS. <init> (RequireJS.scala: 9) at org.webjars.play.RequireJS.class (RequireJS.scala: 9) while locating org. webjars.play.RequireJS for the 2nd parameter of webjars.Routes. <init> (Routes.scala: .........
Интересно, в чем может быть трудность Большое спасибо
Ваша проблема вызвана CspFilter в вашем игровом приложении. Если вы играете в 2.7 или выше, вы можете добавить csp nonce в каждый скрипт, который вы добавляете на страницу. Допустим, это ваш шаблон:
@* At the beggining import CSPNonce *@
@import views.html.helper.CSPNonce
@* It important that you pass implicit request to your view, without script won't compile *@
@(title: String)(content: Html)(implicit request: RequestHeader)
<!DOCTYPE html>
<html lang="en">
<head>
@* Adding @{CSPNonce.attr} would generate nonce for external script *@
<script @{CSPNonce.attr} src="https://www.paypal.com/sdk/js?client-id=sb"></script>
</head>
<body>
<div id="paypal-button-container"></div>
@* Adding @{CSPNonce.attr} would generate nonce for inline script *@
<script @{CSPNonce.attr}>
paypal.Buttons().render('#paypal-button-container');
</script>
</body>
</html>
В игре 2.6 и до этого одноразовые номера не были реализованы, поэтому вам придется реализовать это самостоятельно или разрешить выполнение встроенных сценариев без одноразовых номеров.
play.filters.headers.contentSecurityPolicy = "default-src 'self'; script-src 'self' 'unsafe-inline' https://www.paypal.com"
ctrl+u
Вы проверяли вывод консоли? Обычно вы можете открыть консоль браузера с помощьюctrl+c
илиF12
.