You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade页面集成Stripe时card-element元素无法正常显示问题

问题修复方案

核心问题:脚本标签用法错误

你将Stripe SDK引入和自定义初始化逻辑写在了同一个script标签内,只要script标签设置了src属性,标签内部的JS代码会被浏览器完全忽略,所以你的初始化逻辑根本没有运行,自然不会渲染card元素,这也是控制台无报错的原因。

修复后的脚本写法如下:

<!-- 先单独引入Stripe SDK -->
<script src="https://js.stripe.com/v3/"></script>
<!-- 再单独编写自定义初始化逻辑 -->
<script>
(function(){
    // 创建Stripe客户端
    var stripe = Stripe('{{config('stripe.key')}}');

    // 创建Elements实例
    var elements = stripe.elements();

    // 卡片组件自定义样式
    var style = {
      base: {
        color: '#32325d',
        lineHeight: '18px',
        fontFamily: '"Roboto", "Helvetica Neue", Helvetica, sans-serif',
        fontSmoothing: 'antialiased',
        fontSize: '16px',
        '::placeholder': {
          color: '#aab7c4'
        }
      },
      invalid: {
        color: '#fa755a',
        iconColor: '#fa755a'
      }
    };

    // 创建卡片Element实例
    var card = elements.create('card', {
        style: style,
        hidePostalCode: true
    });

    // 把卡片组件挂载到card-element节点
    card.mount('#card-element');

    // 监听卡片组件实时校验错误
    card.addEventListener('change', function(event) {
      var displayError = document.getElementById('card-errors');
      if (event.error) {
        displayError.textContent = event.error.message;
      } else {
        displayError.textContent = '';
      }
    });

    // 监听表单提交
    var form = document.getElementById('payment-form');
    form.addEventListener('submit', function(event) {
      event.preventDefault();

      // 禁用提交按钮避免重复提交
      document.getElementById('complete-order').disabled = true;

      var options = {
        name: document.getElementById('name_on_card').value,
        address_line1: document.getElementById('address').value,
        address_city: document.getElementById('city').value,
        address_state: document.getElementById('province').value,
        address_zip: document.getElementById('postalcode').value
      }

      stripe.createToken(card, options).then(function(result) {
        if (result.error) {
          // 展示提交错误
          var errorElement = document.getElementById('card-errors');
          errorElement.textContent = result.error.message;
          // 恢复提交按钮可用
          document.getElementById('complete-order').disabled = false;
        } else {
          // 把token传递给服务端
          stripeTokenHandler(result.token);
        }
      });
    });

    function stripeTokenHandler(token) {
      // 把stripe token插入表单提交给服务端
      var form = document.getElementById('payment-form');
      var hiddenInput = document.createElement('input');
      hiddenInput.setAttribute('type', 'hidden');
      hiddenInput.setAttribute('name', 'stripeToken');
      hiddenInput.setAttribute('value', token.id);
      form.appendChild(hiddenInput);
      // 提交表单
      form.submit();
    }
})();
</script>

同步修复的细节问题

  • 原代码{{config('stripe.key)}}语法错误,右括号位置不对,修正为{{config('stripe.key')}}
  • Stripe构造函数参数需要是字符串类型,给配置输出加引号包裹,改为Stripe('{{config('stripe.key')}}')
  • 原fontFamily配置里Roboto前缺少双引号,修正为fontFamily: '"Roboto", "Helvetica Neue", Helvetica, sans-serif'

若仍未渲染可排查以下项

  • 确认#card-element没有被CSS设置为不可见,可手动添加基础样式保证容器可展示:
#card-element {
  border: 1px solid #e0e0e0;
  padding: 12px;
  min-height: 44px;
  border-radius: 4px;
}
  • 确认你使用的是Stripe公钥(pk_开头),前端不可使用sk_开头的私钥

内容的提问来源于stack exchange,提问作者Austin Sharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:57:01