【问题标题】:Stripe creating new customer for existing users' purchasesStripe 为现有用户的购买创建新客户
【发布时间】:2014-03-28 09:37:36
【问题描述】:

我发现如果用户第二次购买产品,我的 Stripe 仪表板中就会创建一个新客户。我希望这样,一旦客户进行了第一次购买,后续购买将向该现有客户及其保存的卡收取费用。 我的应用正在运行 Rails 4。

charges_controller.rb

def create
  @user = current_user
  @gift = Gift.friendly.find(params[:gift_id])
  @charge = Charge.new(charge_params)
  @codes = Code.all
  @code = @gift.codes.where(:used => false).order("created_at ASC").first
  token = params[:stripeToken]
  if @user.customer_id.nil?
    # Create customer
      customer = Stripe::Customer.create(
      :card => token,
      :email => @user.email
    )
    # Charge the customer instead of the card
    Stripe::Charge.create(
      :amount => (@gift.price * 100).to_i,
      :currency => "cad",
      :customer => customer.id
    )
    # Customer_id is set to the Stripe customer.id
    customer_id = customer.id
    # If the transaction is approved
    if @charge.save
      # And user selects save_cc
      if @charge.save_cc == true
        # Update User's cusomter_id field to the var
        @user.update_attributes(:customer_id => customer_id)
        send_code(@user, @gift, @charge, @code)
      else 
        send_code(@user, @gift, @charge, @code)                     
      end 
    else 
      render 'charges/new'
    end 
  else
    # If user already has customer_id
    Stripe::Charge.create(
      :amount => (@gift.price * 100).to_i,
      :currency => "cad",
      :customer => @user.customer_id
    )
    if @charge.save 
      send_code(@user, @gift, @charge, @code)
    else 
      render 'charges/new'
    end 
  end 
end

【问题讨论】:

  • 请允许我正面批评。这段代码很难看,你重复了很多代码,对于控制器操作来说太多了。尝试先将其干燥,我相信会修复一些错误。

标签: ruby-on-rails ruby-on-rails-4 stripe-payments


【解决方案1】:

您可以尝试先从 Stripe 检索客户(如果她已经存在),然后进行交易。

在本例中,customer_token 是我存储在数据库中的客户 ID。

customer = nil
if self.customer_token.present?
  customer = Stripe::Customer.retrieve(self.customer_token)
else
  customer = Stripe::Customer.create(
    :email => self.manager.email,
    :card  => stripe_token
  )
end

charge = Stripe::Charge.create(
  :customer    => customer.id,
  :amount      => total_amount_cents,
  :description => "...",
  :currency    => 'cad'
)

self.update_attributes(has_membership: true,
                       customer_token: customer.id,
                       last_payment_at: Time.zone.now)

PS:我建议将其包含在 transaction 块中,以确保一切顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 2022-10-19
    • 2023-01-18
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2015-12-26
    相关资源
    最近更新 更多