Techioz Blog

レール7 | GET リクエストが本番環境で機能しない

概要

Rails 7アプリがあり、ユーザーがボタンをクリックすると、GETリクエストを介してオンラインで支払いを行うための支払いゲートウェイにリダイレクトされます。開発モードでは、ローカルマシン(localhost:3000上)で、完全に正常に動作します。

def paye
        @payment_response = Easebuzz::Payment.initiate({
          "txnid" => "#{@order.id}",
          "amount" => amount.to_f,
          "firstname" => current_user.name,
          "email" => current_user.email,
          "phone" => current_user.phone_number,
          "productinfo" => "Payment for Order#{@order.id}",
          "surl" => "http://localhost:3000/orders/#{@order.id}/successE",
          "furl" => "http://localhost:3000/orders/#{@order.id}/failedTransaction",
        })

        if @payment_response['status'] == 1
          data = @payment_response['data']
          redirect_to("https://testpay.easebuzz.in/pay/#{data}", allow_other_host: true, status: 303)
        end

       puts @payment_response
end
resources :orders do
  member do
      get '/paye', to: 'orders#paye'
  end
 end
<%= link_to paye_order_path(order) %>

先ほども言いましたが、開発モードではまったく問題なく動作していますが、AWS ec2、Apache、Passenger を使用してデプロイされ、変更されたばかりの本番環境で使用すると、

def paye
     .....
          "surl" => "http://(Main Domain.in)/orders/#{@order.id}/successE",
          "furl" => "http://(Main Domain.in)/orders/#{@order.id}/failedTransaction",
     ......

     .......
          redirect_to("https://pay.easebuzz.in/pay/#{data}", allow_other_host: true, status: 303) 
          #using pay.easebuzz in production
       .....
  puts @payment_response
end

実稼働環境で動作したのは 1 回目だけで、2 回目からは動作しなくなりました。

GET リクエストが表示されています (OrdersController#payE にリクエスト形式のテンプレートがありません: text/html)

しかし、開発中はまったく問題なく動作しているのに、本番環境では GET リクエストが実行されないのはなぜですか??

@payment_response もログに何も表示されません。

したがって、私の主な問題は、GETリクエスト(order_controller.rbのpayEメソッド)が開発では機能しているが、運用環境で使用すると機能せず、Easebuzz::Payment.initiateを読み取らないことです。

また、@payment_response が配置されるかどうかを確認するために、payE を GET から POST リクエストに変更しましたが、ログに OrdersController#payE のテンプレートが見つかりませんと表示されます。

私はここでどんな愚かなことをしているのでしょうか?

解決策

つまり、テンプレートの問題でエラーが発生しているということは、 @payment_response ['status'] == 1 が true ではないことを意味します。 STDOUT が本番環境のログに関連付けられていないため、puts @payment_response はおそらく機能しません。Rails.logger.debug @payment_response.inspect を試してください。

これは応答を確認するのに役立つはずです。私の推測では、Easebuzz の設定が運用環境で適切なマーチャント キーなどを使用するように適切に設定されていないのではないかと考えられますが、ログを見れば詳細がわかります。

最後に、コードはエラーをより適切に処理する必要があります。そのチェックには、フラッシュ エラーを伴うローカル リダイレクト、またはユーザーに表示されるエラーを伴うテンプレートのいずれかを使用する else が必要です。