条纹为现有用户的购买创建新客户



我发现,如果用户第二次购买产品,就会在我的 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

您可以尝试先从 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块中,以确保一切顺利。

最新更新