ActiveMerchantでのロボカッサの統合

ご注意 翻訳者-ロボカッサとRailsの統合についての投稿すでにありました 、そこで提供されている方法は多くの人には適さないと思います。



Ruby on Railsで記述されたアプリケーションがあり、何らかの支払いシステム(たとえば、PayPal、Moneybookers、またはこの場合のロボカッサなど)を追加する予定がある場合、最初に考えるべき宝石はShopifyのactive_merchantです。



ActiveMerchantは、Shopifyが使用および支援する単純な抽象支払いライブラリです。



そのため、ロボカッサ経由で支払いをプロジェクトに追加する必要があるとき、サポートされている支払いシステムのリストを開きましたが、ロボカッサが含まれていなかったため少し失望しました。 少し後に、サポートを追加したフォークを見つけましたが、すでに廃止されているため、一部のテストではec801d3d4f8がクラッシュしました 。 だから私はこのコードを見て修正することを決め、すべてをゼロから書くことはしなかった。



実際、テストを修正するには、小さなタイプミス07fb5494134zbs-およそPer。 )を修正する必要がありました。 はい、簡単でした。 次に、テスト環境に異なるURLを追加し、以前のソリューションに本番環境を追加することにしました(Robokassaは、最初にサンドボックスでコードをテストし、その後すべてが機能する場合にのみライブモードで使用することをお勧めします)。 このコードはc2ec85d53cbで確認できます。



次に、プロジェクトにactive_merchantを追加します。 gemfileに追加します。



gem 'activemerchant', :require => 'active_merchant'
      
      





ActionViewヘルパー(payment_service_forなど)を使用するには、ファイルactivemerchant.rbをinitializersフォルダーに配置する必要があります。



 require 'active_merchant' require 'active_merchant/billing/integrations/action_view_helper' ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)
      
      





イニシャライザでプロダクションモードを使用するには、別の行を追加する必要があります。



 ActiveMerchant::Billing::Base.integration_mode = :production # :test for sandbox
      
      





次のステップはルートです。 Robokassaは、トランザクションが完了するとアプリケーションにプッシュリクエストを行うため、routes.rbに次の行を追加する必要があります。



 scope 'robokassa' do match 'paid' => 'robokassa#paid', :as => :robokassa_paid # to handle Robokassa push request match 'success' => 'robokassa#success', :as => :robokassa_success # to handle Robokassa success redirect match 'fail' => 'robokassa#fail', :as => :robokassa_fail # to handle Robokassa fail redirect end
      
      





次に、コントローラーを作成して機能させます。



 class RobokassaController < ApplicationController include ActiveMerchant::Billing::Integrations skip_before_filter :verify_authenticity_token # skip before filter if you chosen POST request for callbacks before_filter :create_notification before_filter :find_payment # Robokassa call this action after transaction def paid if @notification.acknowledge # check if it's genuine Robokassa request @payment.approve! # project-specific code render :text => @notification.success_response else head :bad_request end end # Robokassa redirect user to this action if it's all ok def success if !@payment.approved? && @notification.acknowledge @payment.approve! end redirect_to @payment, :notice => I18n.t("notice.robokassa.success") end # Robokassa redirect user to this action if it's not def fail redirect_to @payment, :notice => I18n.t("notice.robokassa.fail") end private def create_notification @notification = Robokassa::Notification.new(request.raw_post, :secret => AppConfig.robokassa_secret) end def find_payment @payment = Payment.find(@notification.item_id) end end
      
      





最後に、フォームをページに追加します。



 <%= payment_service_for @payment.id, AppConfig.robokassa_login, :amount => @payment.amount, :service => :robokassa, :secret => AppConfig.robokassa_secret do |s| %> <%= submit_tag "Submit" %> <% end %>
      
      





以上です! @payment



オブジェクトがある場合、フォームを送信すると、Robocassa Webサイトへのリダイレクトが発生し、そこで@payment.amount



指定された金額を支払うことができます。



All Articles