在 Laravel Blade 上嵌入 Checkout
Embedding Checkout on Laravel Blade
我正在尝试显示来自 Stripe (https://stripe.com/docs/checkout) 的嵌入式结帐表单。我注意到,如果我将嵌入代码放在 @section('content')
和 @endsection
之间,当我单击 用卡支付 按钮时,它不会显示表单。但是,如果我删除 @section('content')
或将嵌入代码放在它外面,那么它会完美地显示表单,但是,这会破坏我的布局结构。
index.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Billing</div>
<div class="panel-body">
<h1>Stripe</h1>
//EMBEDDED CODE STARTS HERE
<form action="/your-server-side-code" method="POST">
<script
src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="pk_test_sTxf2K6z6oemUXlC0NRcowxO"
data-amount="2000"
data-name="Demo Site"
data-description="2 widgets"
data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
data-locale="auto"
data-zip-code="true"
data-currency="gbp">
</script>
</form>
//EMBEDDED CODE ENDS HERE
</div>
</div>
</div>
</div>
</div>
@endsection
谢谢!
已编辑:
layout.app
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<div id="app">
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Collapsed Hamburger -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
<span class="sr-only">Toggle Navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- Branding Image -->
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
</div>
<div class="collapse navbar-collapse" id="app-navbar-collapse">
<!-- Left Side Of Navbar -->
<ul class="nav navbar-nav">
</ul>
<!-- Right Side Of Navbar -->
<ul class="nav navbar-nav navbar-right">
<!-- Authentication Links -->
@guest
<li><a href="{{ route('login') }}">Login</a></li>
<li><a href="{{ route('register') }}">Register</a></li>
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<a href="{{ route('home') }}">Home</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
@endguest
</ul>
</div>
</div>
</nav>
@yield('content')
</div>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>
所以我想通了是什么问题,是因为<script>
标签和Vue组件冲突了。
所以有两种解法:
1) 创建一个没有 Vue 元素标识符的重复布局 <div id="app"></div>
或
2) 在 Vue 组件中使用 mount() 钩子创建脚本标签。
createStripeScript () {
const script = document.createElement('script')
script.src = 'https://checkout.stripe.com/checkout.js'
script.onload = () => this.initStripe()
document.body.appendChild(script)
}
我 运行 遇到了与 Laravel 8 和 vue 脚手架相同的问题。如果您将脚本标签从 <script>
更改为 <script type="application/javascript">
或在 vue 组件加载后将脚本标签放在文件末尾也有效。
我正在尝试显示来自 Stripe (https://stripe.com/docs/checkout) 的嵌入式结帐表单。我注意到,如果我将嵌入代码放在 @section('content')
和 @endsection
之间,当我单击 用卡支付 按钮时,它不会显示表单。但是,如果我删除 @section('content')
或将嵌入代码放在它外面,那么它会完美地显示表单,但是,这会破坏我的布局结构。
index.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Billing</div>
<div class="panel-body">
<h1>Stripe</h1>
//EMBEDDED CODE STARTS HERE
<form action="/your-server-side-code" method="POST">
<script
src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="pk_test_sTxf2K6z6oemUXlC0NRcowxO"
data-amount="2000"
data-name="Demo Site"
data-description="2 widgets"
data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
data-locale="auto"
data-zip-code="true"
data-currency="gbp">
</script>
</form>
//EMBEDDED CODE ENDS HERE
</div>
</div>
</div>
</div>
</div>
@endsection
谢谢!
已编辑: layout.app
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<div id="app">
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Collapsed Hamburger -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
<span class="sr-only">Toggle Navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- Branding Image -->
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
</div>
<div class="collapse navbar-collapse" id="app-navbar-collapse">
<!-- Left Side Of Navbar -->
<ul class="nav navbar-nav">
</ul>
<!-- Right Side Of Navbar -->
<ul class="nav navbar-nav navbar-right">
<!-- Authentication Links -->
@guest
<li><a href="{{ route('login') }}">Login</a></li>
<li><a href="{{ route('register') }}">Register</a></li>
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<a href="{{ route('home') }}">Home</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
@endguest
</ul>
</div>
</div>
</nav>
@yield('content')
</div>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>
所以我想通了是什么问题,是因为<script>
标签和Vue组件冲突了。
所以有两种解法:
1) 创建一个没有 Vue 元素标识符的重复布局 <div id="app"></div>
或
2) 在 Vue 组件中使用 mount() 钩子创建脚本标签。
createStripeScript () {
const script = document.createElement('script')
script.src = 'https://checkout.stripe.com/checkout.js'
script.onload = () => this.initStripe()
document.body.appendChild(script)
}
我 运行 遇到了与 Laravel 8 和 vue 脚手架相同的问题。如果您将脚本标签从 <script>
更改为 <script type="application/javascript">
或在 vue 组件加载后将脚本标签放在文件末尾也有效。