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

Rails中如何为Stripe CheckoutSession条件传入customer或customer_email参数

错误原因

你原代码的写法不符合Ruby哈希构造规则:直接在哈希字面量中插入包裹了方括号的条件判断,会将生成的键值对封装为数组元素,Stripe SDK无法识别这种非法参数结构。

正确实现

方案1:先构造基础参数再条件合并(可读性最高,推荐)

def create_checkout_session
  # 初始化通用参数
  checkout_params = {
    line_items: [{
      price_data: {
        currency: 'usd',
        product_data: {
          name: 'T-shirt S Black'
        },
        unit_amount: 2000
      },
      adjustable_quantity: {
        enabled: true,
        maximum: 10
      },
      quantity: 1
    }],
    mode: 'payment',
    success_url: "http://localhost:3000/success?session_id={CHECKOUT_SESSION_ID}",
    cancel_url: "http://localhost:3000/"
  }

  # 条件追加身份识别参数
  if current_user.stripe_ip.nil?
    checkout_params[:customer_email] = current_user.email
  else
    checkout_params[:customer] = current_user.stripe_ip
  end

  session = Stripe::Checkout::Session.create(checkout_params)
  redirect_to session.url
end

方案2:哈希展开语法(代码更简洁,要求Ruby 2.3及以上版本)

def create_checkout_session
  session = Stripe::Checkout::Session.create(
    # 条件展开对应的身份参数哈希
    **(current_user.stripe_ip.nil? ? { customer_email: current_user.email } : { customer: current_user.stripe_ip }),
    line_items: [{
      price_data: {
        currency: 'usd',
        product_data: {
          name: 'T-shirt S Black'
        },
        unit_amount: 2000
      },
      adjustable_quantity: {
        enabled: true,
        maximum: 10
      },
      quantity: 1
    }],
    mode: 'payment',
    success_url: "http://localhost:3000/success?session_id={CHECKOUT_SESSION_ID}",
    cancel_url: "http://localhost:3000/"
  )
  redirect_to session.url
end

优化建议

后续可以通过Rails数据库迁移将stripe_ip字段重命名为stripe_customer_id,避免命名歧义降低后续维护成本。

内容的提问来源于stack exchange,提问作者Patrick Vellia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:05