Skip to content
This repository has been archived by the owner on Nov 5, 2021. It is now read-only.

Commit

Permalink
Added simple payment forms support
Browse files Browse the repository at this point in the history
  • Loading branch information
shaggyone committed Jun 1, 2012
1 parent 4cddc08 commit 47107af
Show file tree
Hide file tree
Showing 2 changed files with 146 additions and 9 deletions.
129 changes: 123 additions & 6 deletions app/helpers/robokassa_helper.rb
Expand Up @@ -2,12 +2,129 @@ module RobokassaHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::CaptureHelper
include ActionView::Helpers::FormTagHelper

PAYMENT_SYSTEMS = {
:bank_card => 'BANKOCEANMR', # Банковской картой
:platezh_ru => 'OceanBankOceanR', # Банковской картой через Platezh.ru
:qiwi => 'QiwiR', # QIWI Кошелек
:yandex => 'PCR', # Яндекс.Деньги
:wmr => 'WMRM', # WMR
:wmz => 'WMZM', # WMZ
:wme => 'WMEM', # WME
:wmu => 'WMUM', # WMU
:wmb => 'WMBM', # WMB
:wmg => 'WMGM', # WMG
:money_mail_ru => 'MoneyMailR', # RUR MoneyMail
:rur_rbk_money => 'RuPayR', # RUR RBK Money
:w1r => 'W1R', # RUR Единый Кошелек
:easy_pay => 'EasyPayB', # EasyPay
:liq_pay_usd => 'LiqPayZ', # USD LiqPay
:money_mail_ru => 'MailRuR', # Деньги@Mail.Ru
:z_payment => 'ZPaymentR', # RUR Z-Payment
:tele_money => 'TeleMoneyR', # RUR TeleMoney
:alfabank => 'AlfaBankR', # Альфа-Клик
:pskbr => 'PSKBR', # Промсвязьбанк
:handy_bank => 'HandyBankMerchantR', # HandyBank
:innivation => 'BSSFederalBankForInnovationAndDevelopmentR', # АК ФБ Инноваций и Развития (ЗАО)
:energobank => 'BSSMezhtopenergobankR', # Межтопэнергобанк
:svyaznoy => 'RapidaOceanSvyaznoyR', # Через Связной
:euroset => 'RapidaOceanEurosetR', # Через Евросеть
:elecsnet_r => 'ElecsnetR', # Элекснет
:kassira_net => 'TerminalsUnikassaR', # Кассира.нет
:mobil_element => 'TerminalsMElementR', # Мобил Элемент
:baltika => 'TerminalsNovoplatR', # Банк Балтика
:absolut_plat => 'TerminalsAbsolutplatR', # Absolutplat
:pinpay => 'TerminalsPinpayR', # Pinpay
:money_money => 'TerminalsMoneyMoneyR', # Money-Money
:petrocommerce => 'TerminalsPkbR', # Петрокоммерц
:vtb24 => 'VTB24R', # ВТБ24
:mts => 'MtsR', # МТС
:megafon => 'MegafonR', # Мегафон
:iphone => 'BANKOCEANCHECKR', # Через iPhone
:contact => 'ContactR', # Переводом по системе Контакт
:online_credit => 'OnlineCreditR'
}

def payment_form(interface, invoice_id, amount, description, custom_options = {})
render 'payment_method/robokassa/init',
:interface => interface,
:invoice_id => invoice_id,
:amount => amount,
:description => description,
:custom_options => custom_options
payment_base_url = interface.init_payment_base_url
payment_options = interface.init_payment_options(invoice_id, amount, description, custom_options)

@__robokassa_vars = {
:interface => interface,
:invoice_id => invoice_id,
:amount => amount,
:description => description,
:custom_options => custom_options,
:payment_base_url => payment_base_url,
:payment_options => payment_options
}

if block_given?
yield payment_base_url, payment_options
else
render 'payment_method/robokassa/init',
:interface => interface,
:invoice_id => invoice_id,
:amount => amount,
:description => description,
:custom_options => custom_options,
:payment_base_url => payment_base_url,
:payment_options => payment_options
end

@__robokassa_vars = nil
end

def robokassa_rates_hash
raise "rates_hash helper should be called inside of payment_form." if @__robokassa_vars.blank?
@__robokassa_vars[:rates_hash] ||= robokassa_interface.rates_linear(robokassa_amount)
end

def robokassa_payment_block currency
raise "payment_block should be called inside of payment_form." if @__robokassa_vars.blank?

currency = RobokassaHelper::PAYMENT_SYSTEMS[currency]
raise "wrong currency" unless currency
kept_rate = @__robokassa_vars[:currency_rate]
currency_rate = robokassa_rates_hash[currency]
return "" unless currency_rate
@__robokassa_vars[:currency_rate] = currency_rate

yield currency_rate

@__robokassa_vars[:currency_rate] = kept_rate
end

def robokassa_payment_link *args
raise "payment_link should be called inside of payment_form." if @__robokassa_vars.blank?
options = args.extract_options!
currency = options.delete(:currency)
if currency
return robokassa_currency currency do
payment_link args
end
end
payment_url = "#{ robokassa_payment_base_url }?#{ robokassa_payment_options.merge('IncCurrLabel' => robokassa_currency_rate[:name]).to_query}"

if block_given?
link_to payment_url, *args, options do
yield robokassa_currency_rate
end
else
title = args.shift
link_to title, payment_url, *args, options
end
end

[:interface, :invoice_id, :amount, :description, :custom_options, :payment_base_url, :payment_options].each do |method_name|
define_method "robokassa_#{method_name}".to_sym do
raise "robokassa_#{method_name} helper should be called inside of payment_form." if @__robokassa_vars.blank?
@__robokassa_vars[method_name]
end
end

def robokassa_currency_rate
raise "robokassa_currency_rate helper should be called inside of robokassa_payment_block." if @__robokassa_vars.blank? || @__robokassa_vars[:currency_rate].blank?
@__robokassa_vars[:currency_rate]
end
end
26 changes: 23 additions & 3 deletions lib/robokassa/interface.rb
Expand Up @@ -96,7 +96,7 @@ def payment_methods # :nodoc:
end

def rates_long(amount, currency='')
cache_key = "rates_long_#{currency}_#{amount}".to_sym
cache_key = "rates_long_#{currency}_#{amount}"
return @cache[cache_key] if @cache[cache_key]
xml = get_remote_xml(rates_url(amount, currency))
if xml.elements['RatesList/Result/Code'].text != '0'
Expand Down Expand Up @@ -128,17 +128,37 @@ def rates_long(amount, currency='')
end

def rates(amount, currency='')
cache_key = "rates_#{currency}_#{amount}".to_sym
cache_key = "rates_#{currency}_#{amount}"
@cache[cache_key] ||= Hash[rates_long(amount, currency).map do |key, value|
[key, {
:description => value[:description],
:currencies => Hash[(value[:currencies] || []).map do |k, v|
[k, v]
[k, v]
end]
}]
end]
end

def rates_linear(amount, currency='')
cache_key = "rates_linear#{currency}_#{amount}"
@cache[cache_key] ||= begin
retval = rates(amount, currency).map do |group|
group_name, group = group
group[:currencies].map do |currency|
currency_name, currency = currency
{
:name => currency_name,
:desc => currency[:currency_description],
:group_name => group[:name],
:group_desc => group[:description],
:amount => currency[:amount]
}
end
end
Hash[retval.flatten.map { |v| [v[:name], v] }]
end
end

def currencies_long
return @cache[:currencies_long] if @cache[:currencies_long]
xml = get_remote_xml(currencies_url)
Expand Down

0 comments on commit 47107af

Please sign in to comment.