Class: Spree::RazorpayController

Inherits:
StoreController
  • Object
show all
Includes:
RazorPay
Defined in:
app/controllers/spree/razorpay_controller.rb

Instance Method Summary collapse

Methods included from RazorPay

#update_razorpay_checkout, #update_razorpay_response

Instance Method Details

#create_orderObject

Step 1: Create Razorpay Order before payment



8
9
10
11
12
13
14
15
16
# File 'app/controllers/spree/razorpay_controller.rb', line 8

def create_order
  razorpay_order_id = ::Razorpay::RpOrder::Api.new.create(params[:order_id])

  if razorpay_order_id.present?
    render json: { success: true, razorpay_order_id: razorpay_order_id }
  else
    render json: { success: false, error: "Failed to create Razorpay order" }, status: :unprocessable_entity
  end
end

#razor_responseObject

Step 2: Razorpay callback after payment



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/controllers/spree/razorpay_controller.rb', line 19

def razor_response
  if valid_signature? && razorpay_payment_id.present?
    begin
      gateway.verify_and_capture_razorpay_payment(order, razorpay_payment_id)

      #Update the record created during create_order
      checkout_record = Spree::RazorpayCheckout.find_by(
        order_id: order.id,
        razorpay_order_id: params[:razorpay_order_id]
      )

      if checkout_record
        checkout_record.update!(
          razorpay_payment_id: razorpay_payment_id,
          razorpay_signature: params[:razorpay_signature],
          status: razorpay_payment.status,
          payment_method: razorpay_payment.method,
          card_id: razorpay_payment.card_id,
          bank: razorpay_payment.bank,
          wallet: razorpay_payment.wallet,
          vpa: razorpay_payment.vpa,
          email: razorpay_payment.email,
          contact: razorpay_payment.contact
        )
      else
        Rails.logger.warn("RazorpayCheckout record not found for order #{order.id}")
      end

      # Add payment to Spree order
      order.razor_payment(razorpay_payment, payment_method, params[:razorpay_signature])
      order.next

      flash['order_completed'] = true if order.completed?
      redirect_to checkout_state_path_or_completion and return
    rescue StandardError => e
      Rails.logger.error("Razorpay Error: #{e.message}")
      flash[:error] = "Razorpay Error: #{e.message}"
    end
  else
    flash[:error] = 'Razorpay payment verification failed'
  end

  redirect_to checkout_state_path(order.state)
end