рд░реЗрд▓реЛрдХреИрд╕рд╛ рдХреЛ рд░реЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рдЫрд╡рд┐
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рджреЛрд╕реНрдд рдиреЗ рдкреВрдЫрд╛ рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд░реЙрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд░реЛрдмреЛрдХреИрд╕рд╛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЛрдб рдерд╛, рдФрд░ рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдерд╛ред рдореИрдВрдиреЗ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдпрд╣рд╛рдБ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред

рдирд┐рдпрдВрддреНрд░рдХ


рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдореЗрдВ 4 рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


class PaymentsController < ApplicationController def pay #     ,  : @order = Order.find(params[:id]) unless @order.blank? && @order.payment.blank? #    @pay_desc = Hash.new @pay_desc['mrh_url'] = Payment::MERCHANT_URL @pay_desc['mrh_login'] = Payment::MERCHANT_LOGIN @pay_desc['mrh_pass1'] = Payment::MERCHANT_PASS_1 @pay_desc['inv_id'] = 0 @pay_desc['inv_desc'] = @order.payment.desc @pay_desc['out_summ'] = @order.payment.price.to_s @pay_desc['shp_item'] = @order.id @pay_desc['in_curr'] = "WMRM" @pay_desc['culture'] = "ru" @pay_desc['encoding'] = "utf-8" #    @pay_desc['crc'] = Payment.get_hash(@pay_desc['mrh_login'], @pay_desc['out_summ'], @pay_desc['inv_id'], @pay_desc['mrh_pass1'], "Shp_item=#{@pay_desc['shp_item']}") end end def result crc = Payment.get_hash(params['OutSum'], params['InvId'], Payment::MERCHANT_PASS_2, "Shp_item=#{params['Shp_item']}") @result = "FAIL" begin #   ,     break if params['SignatureValue'].blank? || crc.casecmp(params['SignatureValue']) != 0 @order = Order.where(:id => params['Shp_item']).first #   break if @order.blank? || @order.payment.price != params['OutSum'].to_f #        @order.payment.invid = params['InvId'].to_i @order.payment.status = Payment::STATUS_OK @order.payment.save # ... #  ,    @result = "OK#{params['InvId']}" end while false end def success #       end def fail #  ,   ... end end 


рджреГрд╢реНрдп


рднреБрдЧрддрд╛рди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо:
 <form action="<%= @pay_desc['mrh_url'] %>" method="post"> <input type=hidden name=MrchLogin value="<%= @pay_desc['mrh_login'] %>"> <input type=hidden name=OutSum value="<%= @pay_desc['out_summ'] %>"> <input type=hidden name=InvId value="<%= @pay_desc['inv_id'] %>"> <input type=hidden name=Desc value="<%= @pay_desc['inv_desc'] %>"> <input type=hidden name=SignatureValue value="<%= @pay_desc['crc'] %>"> <input type=hidden name=Shp_item value="<%= @pay_desc['shp_item'] %>"> <input type=hidden name=IncCurrLabel value="<%= @pay_desc['in_curr'] %>"> <input type=hidden name=Culture value="<%= @pay_desc['culture'] %>"> <input type=submit value=''> </form> 

рдпрд╣рд╛рдВ рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореИрдВ рд░реВрдкреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрд▓ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рд╣реИ, рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд░реЗрд▓ рдЕрднреА рднреА CSRF рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдбреЗрд╕реНрдХ рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдХреИрдк, рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рджреГрд╢реНрдп рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
  <%= @result %> 

рд╕рдлрд▓рддрд╛ рдФрд░ рдЕрд╕рдлрд▓рддрд╛ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрджрд░реНрд╢


рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ, рдореИрдВ рдореЙрдиреНрдбреЙрдпрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдУрдЖрд░рдПрдо рдХреЗ рддрд╣рдд рд░реАрдореЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рд░реЛрдмреЛрдХреИрд╢ рдбреЗрд╕реНрдХ рдХреЗ рдПрдХреНрд╕рдПрдордПрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рдореБрдЭреЗ рд░реЗрд▓ рдХреЗ рддрд╣рдд рдкрд░реНрдпрд╛рдкреНрдд рдПрд╕рдУрдПрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ рдорд┐рд▓реЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдХреЛрд░ рдХрд┐рдпрд╛ рдФрд░ рдиреЛрдЦреЗрд░реА рдкрд░ рдмрд╕ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
 require 'open-uri' require 'digest/md5' class Payment include Mongoid::Document include Mongoid::Timestamps field :status, :type => Integer field :invid, :type => Integer field :price, :type => Float field :desc # ... MERCHANT_URL = 'https://merchant.roboxchange.com/Index.aspx' # test interface: http://test.robokassa.ru/Index.aspx SERVICES_URL = 'https://merchant.roboxchange.com/WebService/Service.asmx' #test interface: http://test.robokassa.ru/Webservice/Service.asmx MERCHANT_LOGIN = 'login' MERCHANT_PASS_1 = 'your_pass_1' MERCHANT_PASS_2 = 'your_pass_2' def self.get_currencies(lang = "ru") svc_url = "#{SERVICES_URL}/GetCurrencies?MerchantLogin=#{MERCHANT_LOGIN}&Language=#{lang}" doc = Nokogiri::XML(open(svc_url)) doc.xpath("//xmlns:Group").map {|g|{ 'code' => g['Code'], 'desc' => g['Description'], 'items' => g.xpath('.//xmlns:Currency').map {|c| { 'label' => c['Label'], 'name' => c['Name'] }} }} if doc.xpath("//xmlns:Result/xmlns:Code").text.to_i == 0 end def self.get_payment_methods(lang = "ru") svc_url = "#{SERVICES_URL}/GetPaymentMethods?MerchantLogin=#{MERCHANT_LOGIN}&Language=#{lang}" doc = Nokogiri::XML(open(svc_url)) doc.xpath("//xmlns:Method").map {|g| { 'code' => g['Code'], 'desc' => g['Description'] }} if doc.xpath("//xmlns:Result/xmlns:Code").text.to_i == 0 end def self.get_rates(sum = 1, curr = '', lang="ru") svc_url = "#{SERVICES_URL}/GetRates?MerchantLogin=#{MERCHANT_LOGIN}&IncCurrLabel=#{curr}&OutSum=#{sum}&Language=#{lang}" doc = Nokogiri::XML(open(svc_url)) doc.xpath("//xmlns:Group").map {|g| { 'code' => g['Code'], 'desc' => g['Description'], 'items' => g.xpath('.//xmlns:Currency').map {|c| { 'label' => c['Label'], 'name' => c['Name'], 'rate' => c.xpath('./xmlns:Rate')[0]['IncSum'] }} }} if doc.xpath("//xmlns:Result/xmlns:Code").text.to_i == 0 end def self.operation_state(id) crc = get_hash(MERCHANT_LOGIN, id.to_s, MERCHANT_PASS_2) svc_url = "#{SERVICES_URL}/OpState?MerchantLogin=#{MERCHANT_LOGIN}&InvoiceID=#{id}&Signature=#{crc}&StateCode=80" doc = Nokogiri::XML(open(svc_url)) return nil unless doc.xpath("//xmlns:Result/xmlns:Code").text.to_i == 0 state_desc = { 1 => '     InvoiceID  ', 5 => ' ,   ', 10 => '   ,  ', 50 => ' ,     ', 60 => '     ', 80 => '  ', 100 => '  ', } s = doc.xpath("//xmlns:State")[0] code = s.xpath('./xmlns:Code').text.to_i state = { 'code' => code, 'desc' => state_desc[code], 'request_date' => s.xpath('./xmlns:RequestDate').text, 'state_date' => s.xpath('./xmlns:StateDate').text } end def self.get_hash(*s) Digest::MD5.hexdigest(s.join(':')) end end 


рд░реВрдЯрд░



рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдХреИрд╢ рдбреЗрд╕реНрдХ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛:
  match 'payment/result' => "payments#result" match 'payment/success' => "payments#success" match 'payment/fail' => "payments#fail" match 'payment' => "payments#pay" 


рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ


рд╕рднреА рдкреНрд░рд╕реНрддреБрдд рдХреЛрдб рдПрдХ рд╣рд┐рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/In128922/


All Articles