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

Rails使用Pay Gem对接Stripe 支付成功后发送文件链接邮件如何实现?

Rails + Pay Gem 支付成功后发送主题文件下载邮件实现方案

第一步:创建Stripe Checkout Session时关联业务数据

在发起支付生成结账会话的代码中,通过metadata字段绑定当前购买的主题ID和用户ID,方便后续支付回调时获取对应的业务数据:

# 示例:app/controllers/themes_controller.rb 中的购买发起逻辑
def purchase
  @theme = Theme.find(params[:id])
  @checkout_session = Pay::Stripe::CheckoutSession.create(
    price: "你在Stripe后台创建的对应商品价格ID",
    success_url: 支付成功后跳转的页面地址,
    cancel_url: 支付取消后跳转的页面地址,
    # 关键配置:绑定业务关联数据
    metadata: {
      theme_id: @theme.id,
      user_id: current_user.id
    }
  )
  redirect_to @checkout_session.url, allow_other_host: true
end

第二步:完善履约处理类

将你找到的FulfillCheckout类放在app/services/fulfill_checkout.rb路径下,补充完整业务逻辑,同时增加幂等校验避免重复发送邮件:

# app/services/fulfill_checkout.rb
class FulfillCheckout
  def call(event)
    object = event.data.object
    # 仅处理支付成功的订单
    return unless object.payment_status == "paid"

    # 从回调元数据中取出关联的用户、主题ID
    theme_id = object.metadata.dig("theme_id")
    user_id = object.metadata.dig("user_id")
    return unless theme_id.present? && user_id.present?

    user = User.find_by(id: user_id)
    theme = Theme.find_by(id: theme_id)
    return unless user && theme

    # 可选:增加履约校验,避免重复处理(示例为假设你已经创建了UserTheme中间表记录用户购买关系)
    return if UserTheme.exists?(user: user, theme: theme)
    # 记录用户购买记录
    UserTheme.create(user: user, theme: theme)

    # 异步发送带下载链接的邮件
    ThemeMailer.with(user: user, theme: theme).download_notification.deliver_later
  end
end

第三步:注册Webhook监听

将回调监听的配置写到Pay Gem的初始器文件中,路径为config/initializers/pay.rb:

# config/initializers/pay.rb
Pay::Webhooks.delegator.subscribe "stripe.checkout.session.completed", FulfillCheckout.new
Pay::Webhooks.delegator.subscribe "stripe.checkout.session.async_payment_succeeded", FulfillCheckout.new

修改初始器后需要重启Rails服务生效。

第四步:创建邮件发送类

执行命令生成邮件类:rails g mailer ThemeMailer download_notification
完善邮件类逻辑:

# app/mailers/theme_mailer.rb
class ThemeMailer < ApplicationMailer
  def download_notification
    @user = params[:user]
    @theme = params[:theme]
    # 生成文件下载链接,示例为使用Active Storage存储主题文件,字段名为theme_file
    @download_url = rails_blob_url(@theme.theme_file, host: "你的生产环境站点域名")

    mail(to: @user.email, subject: "您购买的主题文件下载链接")
  end
end

编辑邮件模板app/views/theme_mailer/download_notification.html.erb,添加下载入口:

<p>您好 <%= @user.name %>:</p>
<p>您购买的主题《<%= @theme.name %>》已支付成功,点击下方链接即可下载文件:</p>
<%= link_to "下载主题文件", @download_url %>

第五步:配置Stripe Webhook端点

进入Stripe后台的Webhook配置页面,添加你的站点回调地址,格式为https://你的站点域名/pay/webhooks/stripe,勾选需要监听的两个事件:checkout.session.completed、checkout.session.async_payment_succeeded,将Stripe生成的签名密钥配置到Rails环境变量中,变量名为PAY_STRIPE_WEBHOOK_SECRET。

注意事项

  • 本地开发测试可以使用Stripe CLI转发Webhook事件到本地环境,无需部署即可调试完整流程
  • 如果文件需要鉴权下载,不要直接使用Active Storage的公开链接,可自行实现下载控制器,校验用户购买权限后再返回文件
  • 邮件发送使用deliver_later异步处理,避免Webhook处理超时被Stripe重复触发回调

内容的提问来源于stack exchange,提问作者Saleheen Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:18:02