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

Stripe与Rails自定义UI集成:如何展示已保存的支付方式

Rails 集成 Stripe 自定义UI展示已保存支付方式实现方案

后端前置准备

首先确保你已经完成基础配置:

  • Gemfile中引入Stripe官方SDK:gem 'stripe',执行bundle install完成安装
  • 在Rails配置中初始化Stripe密钥,建议存放在Rails凭据或环境变量中,不要硬编码提交到代码库
  • User表已经添加stripe_customer_id字段,和Stripe侧的客户ID一一绑定

支付方式拉取接口实现

你可以在用户相关控制器中新增接口拉取当前用户的支付方式,示例代码如下:

# app/controllers/users_controller.rb
def payment_methods
  # 从Stripe拉取当前用户的所有银行卡支付方式
  payment_methods = Stripe::PaymentMethod.list(
    customer: current_user.stripe_customer_id,
    type: 'card'
  )
  # 提取用户需要的非敏感字段,同时匹配默认支付方式
  default_pm_id = current_user.stripe_default_payment_method_id # 你可以存在本地字段,或者调用Stripe::Customer.retrieve获取invoice_settings.default_payment_method
  @payment_methods = payment_methods.data.map do |pm|
    {
      id: pm.id,
      card: {
        brand: pm.card.brand,
        last4: pm.card.last4,
        exp_month: pm.card.exp_month,
        exp_year: pm.card.exp_year
      },
      default: pm.id == default_pm_id
    }
  end
  # 接口请求的话返回json,ERB渲染的话直接用@payment_methods变量即可
  respond_to do |format|
    format.html
    format.json { render json: @payment_methods }
  end
end

前端自定义UI实现

你可以完全自定义支付方式列表的样式,不需要依赖Stripe的内置组件,核心只需要展示非敏感的卡信息即可,这里给一个ERB实现示例:

<!-- app/views/users/payment_methods.html.erb -->
<div class="payment-methods-container">
  <h3>我的支付方式</h3>
  <div class="payment-methods-list">
    <% @payment_methods.each do |pm| %>
      <div class="payment-method-card <%= pm[:default] ? 'default-card' : '' %>">
        <div class="card-brand-area">
          <!-- 自行准备对应卡品牌的图标存放在assets目录即可 -->
          <img src="<%= asset_path("card_brands/#{pm[:card][:brand]}.svg") %>" alt="<%= pm[:card][:brand] %>卡">
        </div>
        <div class="card-info-area">
          <p class="card-number">•••• •••• •••• <%= pm[:card][:last4] %></p>
          <p class="card-expire">到期时间 <%= pm[:card][:exp_month] %>/<%= pm[:card][:exp_year] %></p>
          <% if pm[:default] %>
            <span class="default-tag">*默认*</span>
          <% end %>
        </div>
        <div class="card-action-area">
          <button class="btn-sm set-default-btn" data-pm-id="<%= pm[:id] %>">设为默认</button>
          <button class="btn-sm delete-pm-btn" data-pm-id="<%= pm[:id] %>">删除</button>
        </div>
      </div>
    <% end %>
  </div>
  <button class="add-pm-btn">新增支付方式</button>
</div>

如果是前后端分离的架构,直接用JS拉取后端返回的JSON数据,遍历渲染对应组件即可,逻辑完全一致。

注意事项

  • 绝对不要存储银行卡的完整卡号、CVV等敏感信息,所有敏感数据都保存在Stripe侧,你只需要维护Stripe返回的支付方式ID和非敏感展示字段即可
  • 可以在后端对支付方式列表做缓存,减少重复请求Stripe接口的延迟,用户新增、删除、修改支付方式时清理对应缓存即可
  • 如果需要在下单页面嵌入支付方式选择,只需要在列表的每个支付方式卡片前加单选框,选中后记录对应支付方式ID提交给后端调用Stripe接口发起支付即可

内容的提问来源于stack exchange,提问作者Ashita Mahajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:54:00