Rails Stripe webhook 更新钱包余额

Rails Stripe webhook to update wallet balance

最近怎么样?我需要一点帮助。

条纹初始化程序

Rails.configuration.stripe = {
  publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'],
  secret_key:      ENV['STRIPE_SECRET_KEY'],
  signing_secret:  ENV['STRIPE_WEBHOOK_SECRET_KEY']
}

Stripe.api_key = Rails.configuration.stripe[:secret_key]
StripeEvent.signing_secret = Rails.configuration.stripe[:signing_secret]

StripeEvent.configure do |events|
  events.subscribe 'checkout.session.completed', StripeCheckoutSessionService.new
end

条纹结帐会话服务

class StripeCheckoutSessionService
  def call(event)
    ActiveRecord::Base.transaction do
      order = Order.find_by(checkout_session_id: event.data.object.id)
      order.update(state: 'paid')
      # Extra stuff that breaks code
      wallet = current_user.wallet
      wallet_entry = WalletEntry.create!(type: "Deposit", total_credits: order.credit_package.number_of_credits, wallet: wallet, entryable: order)
      wallet.credit_total += wallet_entry.total_credits
    end
  end
end

支付控制器

class PaymentsController < ApplicationController
  before_action :authenticate_user!
  def new
    @order = Order.where(state: 'pending').find(params[:order_id])
  end
end

订单控制器

class OrdersController < ApplicationController
  def create
    credit_package = CreditPackage.find(params[:credit_package_id].to_i)
    order = Order.create!(credit_package: credit_package, amount: credit_package.price, state: 'pending', amount_of_packages: 1 )

    session = Stripe::Checkout::Session.create(
      payment_method_types: ['card'],
      line_items: [{
        name: credit_package.name,
        amount: credit_package.price_cents,
        currency: 'eur',
        quantity: order.amount_of_packages
    }],
    success_url: order_url(order),
    cancel_url: order_url(order)
    )

    order.update(checkout_session_id: session.id)
    redirect_to new_order_payment_path(order)
  end

  def show
    @order = Order.find(params[:id])
  end
end

路线

Rails.application.routes.draw do
  get 'user_interests/destroy'

  # Admin dashboard routes
  namespace :admin do
    resources :activities
    resources :bookings
    resources :coaches
    resources :coach_profiles, except: :index
    resources :coach_activities, except: :index
    resources :activity_sessions
    resources :taggings, except: :index
    resources :tags
    resources :users
    resources :user_profiles, except: :index
    resources :user_interests, except: :index

    root to: 'coaches#index'
  end

  devise_for :coaches, controllers: {
    sessions: 'coaches/sessions'
  }

  devise_for :users, controllers: {
    sessions: 'users/sessions'
  }

  match '/users/:id', :to => 'users#destroy', :as => :destroy_user, :via => :delete

  root 'pages#home'

  # static pages
  get 'pages/contact'
  get 'pages/nousrejoindre'
  get 'pages/notrehistoire'
  get 'pages/mentionslegales'
  get 'pages/politiques'
  get 'pages/listeactivites'
  resources :activities do
    resources :sessions, only: [:index]
  end

  resources :activity_sessions do
    resources :bookings, only: [:create]
  end
  
  resources :orders, only: [:show, :create] do
    resources :payments, only: :new
  end

  resources :bookings, only: [:destroy]
  resources :contacts
  resources :users
  resources :user_profiles
  resources :coach_profiles
  resources :user_interests, only: [:destroy]
  resources :credit_packages, only: [:index]

  # route for stripe endpoint
  mount StripeEvent::Engine, at: '/stripe-webhooks'
end

对于 Stripe webhook,请求是由 Stripe 向您自己的应用程序发出的。在此请求的上下文中,没有登录用户,因此 current_user 在执行 wallet = current_user.wallet.

的行上不可用

可能您需要做的是使用不同的方法来获取链接到此订单的用户。我可以想象你的 Order 模型以某种方式链接到用户,在这种情况下你可以这样做:

order = Order.find_by(checkout_session_id: event.data.object.id)
order.update(state: 'paid')      
wallet = order.user.wallet