条纹自定义付款表单:ActiveRecord::RecordNotFound

Posted

技术标签:

【中文标题】条纹自定义付款表单:ActiveRecord::RecordNotFound【英文标题】:Stripe Custom Payment Form: ActiveRecord::RecordNotFound 【发布时间】:2016-07-18 20:15:48 【问题描述】:

我正在按照 Stripe 文档(Stripe Documentation、Stripe Git Repository)中的描述实现 Stripe 的自定义付款表单,但在表单提交后设置实例变量 @user 时遇到问题。

控制器

def payment
  @user = User.find(session[:user_id])
  if params[:stripeToken] != nil
    @token = params[:stripeToken]
    if @user.update(:stripe_pmt_token => @token)
      create_stripe_customer
      redirect_to confirm_path
    else
      render 'payment'
    end  
  end  
end

def create_stripe_customer
  Stripe.api_key = "<TOKEN>"   
  #Create a Customer
  @customer = Stripe::Customer.create(
    :source => @user[:stripe_pmt_token],
    :description => "#@user.first_name"
  )
  @user.update(:stripe_customer_id => @customer.id)
end 

路线

 get 'payment' => 'checkout#payment'
 post 'payment' => 'checkout#payment'

服务器日志

Started POST "/payment" for 69.23.75.159 at 2016-03-31 11:49:01 +0000
Processing by CheckoutController#payment as html
Parameters: "stripeToken"=>"tok_17v<TOKEN>"
Can't verify CSRF token authenticity
User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id"       = ? LIMIT 1  [["id", nil]]
Completed 404 Not Found in 2ms (ActiveRecord: 0.2ms)

ActiveRecord::RecordNotFound (Couldn't find User with 'id'=):
app/controllers/checkout_controller.rb:5:in `payment'

当支付页面第一次加载时,实例变量@user = User.find(session[:user_id])得到正确设置。但是,当提交支付表单并且def payment的代码第二次执行时,实例变量设置不正确。

错误消息:ActiveRecord::RecordNotFoundCouldn't find User with 'id'=

rails 无法从会话中检索 [:user_id] 值,即使它已设置并且我可以使用 &lt;%= session[:user_id] %&gt; 在支付页面上显示它。请让我知道为什么会这样以及我需要改变什么。谢谢!

【问题讨论】:

能否请您发布开发日志中的错误。出于兴趣,您是否同时使用 payment 方法作为 GET 和 POST? 嗨 Robin,我用路由和服务器日志数据更新了原始帖子。数据显示成功接收到 Stripe 令牌,但未设置 @user 变量。我需要将令牌与现有的 user 相关联,然后将该令牌发送回 Stripe 以在 Stripe 中创建 customer 【参考方案1】:

这个问题似乎与 Stripe 无关,但与 User.find(session[:user_id]) 相关,session[:user_id] 为空。

您如何处理用户身份验证和会话?您可以使用 Devise gem 来查看。

另外,使用User.find 意味着您需要在应用程序的某处(最好是通用的)处理异常ActiveRecord::RecordNotFound。否则,使用User.find_by 并检查结果是否返回nil 是一种替代方法。

【讨论】:

以上是关于条纹自定义付款表单:ActiveRecord::RecordNotFound的主要内容,如果未能解决你的问题,请参考以下文章

条纹结帐自定义按钮不充电

条纹结帐键盘隐藏付款按钮

magento 自定义付款方式表单未显示

条纹禁用支付按钮和微调器不工作

用于付款的 PayPal 自定义表单,而不是默认的弹出窗口

更新 Stripe 付款金额