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
相关产品推荐
相关产品推荐

