0

所以我目前有这个预订功能,我正在尝试添加一个支付系统来使用Stripe

但是,当我尝试提交我的信用卡详细信息表单时,我收到此错误:

NoMethodError (undefined method `customer_id' for #<User:0x552abc0>):

app/services/credit_card_service.rb:8:in `create_credit_card'
app/controllers/charges_controller.rb:9:in `create' 

当我查看上面错误中指定的文件中的代码时,这就是:

#app/controllers/charges_controller.rb


class ChargesController < ApplicationController

  before_action :authenticate_user!
  before_action :find_product

  def create
    stripe_card_id =
      if params[:credit_card].present?
        CreditCardService.new(current_user.id, card_params).create_credit_card
      else
        charge_params[:card_id]
      end

    Stripe::Charge.create(
      customer: current_user.customer_id,
      source:   stripe_card_id,
      amount:   @booking.price_in_cents,
      currency: 'usd'
    )

    if params[:credit_card].present? && stripe_card_id
      current_user.credit_cards.create_with(card_params).find_or_create_by(stripe_id: stripe_card_id)
    end
  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to @booking
  end

  private

  def card_params
    params.require(:credit_card).permit(:number, :month, :year, :cvc)
  end

  def charge_params
    params.require(:charge).permit(:card_id)
  end

  def find_product
    @booking = Booking.find(params[:booking_id])
  rescue ActiveRecord::RecordNotFound => e
    flash[:error] = 'Booking not found!'
    redirect_to root_path
  end
end

class CreditCardService
  def initialize(user_id, card)
    @user = User.find(user_id)
    @card = card
  end

  def create_credit_card
    customer = Stripe::Customer.retrieve(@user.customer_id)
    customer.sources.create(source: generate_token).id
  end

  def generate_token
    Stripe::Token.create(
      card: {
        number: @card[:number],
        exp_month: @card[:month],
        exp_year: @card[:year],
        cvc: @card[:cvc]
      }
    ).id
  end
end

任何有关如何解决此问题的帮助或提示将不胜感激。

我已将设计用于我的用户登录/注册

4

2 回答 2

0

AFAIK,

您需要在 Stripe 本身中创建一个客户

前任:

response = Stripe::Customer.create({ email: 'email@example.com' })

然后使用将响应存储在新的迁移列中,

response[:id] which return customer_id from stripe

于 2018-09-18T07:02:05.123 回答
0

如果我没看错,看起来你的User-model 根本没有customer_id属性。您需要定义它并存储 Stripe 客户 ID(如上面 Nithin 建议的那样)。

于 2018-09-19T22:32:10.930 回答