offsite_payments 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +70 -0
- data/lib/offsite_payments.rb +46 -0
- data/lib/offsite_payments/action_view_helper.rb +72 -0
- data/lib/offsite_payments/helper.rb +119 -0
- data/lib/offsite_payments/integrations.rb +14 -0
- data/lib/offsite_payments/integrations/a1agregator.rb +245 -0
- data/lib/offsite_payments/integrations/authorize_net_sim.rb +580 -0
- data/lib/offsite_payments/integrations/bit_pay.rb +150 -0
- data/lib/offsite_payments/integrations/bogus.rb +32 -0
- data/lib/offsite_payments/integrations/chronopay.rb +283 -0
- data/lib/offsite_payments/integrations/citrus.rb +227 -0
- data/lib/offsite_payments/integrations/direc_pay.rb +339 -0
- data/lib/offsite_payments/integrations/directebanking.rb +237 -0
- data/lib/offsite_payments/integrations/doku.rb +171 -0
- data/lib/offsite_payments/integrations/dotpay.rb +166 -0
- data/lib/offsite_payments/integrations/dwolla.rb +160 -0
- data/lib/offsite_payments/integrations/e_payment_plans.rb +146 -0
- data/lib/offsite_payments/integrations/easy_pay.rb +137 -0
- data/lib/offsite_payments/integrations/epay.rb +161 -0
- data/lib/offsite_payments/integrations/first_data.rb +133 -0
- data/lib/offsite_payments/integrations/gestpay.rb +201 -0
- data/lib/offsite_payments/integrations/hi_trust.rb +179 -0
- data/lib/offsite_payments/integrations/ipay88.rb +240 -0
- data/lib/offsite_payments/integrations/klarna.rb +291 -0
- data/lib/offsite_payments/integrations/liqpay.rb +216 -0
- data/lib/offsite_payments/integrations/maksuturva.rb +231 -0
- data/lib/offsite_payments/integrations/mollie_ideal.rb +213 -0
- data/lib/offsite_payments/integrations/moneybookers.rb +199 -0
- data/lib/offsite_payments/integrations/nochex.rb +228 -0
- data/lib/offsite_payments/integrations/pag_seguro.rb +255 -0
- data/lib/offsite_payments/integrations/paxum.rb +114 -0
- data/lib/offsite_payments/integrations/pay_fast.rb +269 -0
- data/lib/offsite_payments/integrations/paydollar.rb +142 -0
- data/lib/offsite_payments/integrations/payflow_link.rb +194 -0
- data/lib/offsite_payments/integrations/paypal.rb +362 -0
- data/lib/offsite_payments/integrations/paypal_payments_advanced.rb +23 -0
- data/lib/offsite_payments/integrations/paysbuy.rb +71 -0
- data/lib/offsite_payments/integrations/payu_in.rb +266 -0
- data/lib/offsite_payments/integrations/payu_in_paisa.rb +46 -0
- data/lib/offsite_payments/integrations/platron.rb +153 -0
- data/lib/offsite_payments/integrations/pxpay.rb +271 -0
- data/lib/offsite_payments/integrations/quickpay.rb +232 -0
- data/lib/offsite_payments/integrations/rbkmoney.rb +110 -0
- data/lib/offsite_payments/integrations/robokassa.rb +154 -0
- data/lib/offsite_payments/integrations/sage_pay_form.rb +425 -0
- data/lib/offsite_payments/integrations/two_checkout.rb +332 -0
- data/lib/offsite_payments/integrations/universal.rb +180 -0
- data/lib/offsite_payments/integrations/valitor.rb +200 -0
- data/lib/offsite_payments/integrations/verkkomaksut.rb +143 -0
- data/lib/offsite_payments/integrations/web_pay.rb +186 -0
- data/lib/offsite_payments/integrations/webmoney.rb +119 -0
- data/lib/offsite_payments/integrations/wirecard_checkout_page.rb +359 -0
- data/lib/offsite_payments/integrations/world_pay.rb +273 -0
- data/lib/offsite_payments/notification.rb +71 -0
- data/lib/offsite_payments/return.rb +37 -0
- data/lib/offsite_payments/version.rb +3 -0
- metadata +270 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 60fab7379e2aa8af845311fceb0297f9de6e3d23
|
4
|
+
data.tar.gz: d29d896b0ba13ff9c9a7107259e943119fea1ab9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7086fa9f0af0f153a4acea72ab207dc95f359fa3e469fc27d206f5965a83c04e130374940dd8717c361490839b84314862330210a636db32991bb00737a2d51e
|
7
|
+
data.tar.gz: 2453d36da9d1ab052608ca92c59f2ffeac1025f8466fa2543b49039bc7dd5d6b737f82d3d2b07a80379f22638d4f6696a004b8b4b7db34a03a8e9936fe9ab380
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2005-2014 Tobias Luetke
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Offsite Payments
|
2
|
+
[![Build Status](https://travis-ci.org/Shopify/offsite_payments.png?branch=master)](https://travis-ci.org/Shopify/offsite_payments)
|
3
|
+
[![Code Climate](https://codeclimate.com/github/Shopify/offsite_payments.png)](https://codeclimate.com/github/Shopify/offsite_payments)
|
4
|
+
|
5
|
+
Offsite Payments is an extraction from the ecommerce system [Shopify](http://www.shopify.com). Shopify's requirements for a simple and unified API to handle dozens of different offsite payment pages (often called hosted payment pages) with very different exposed APIs was the chief principle in designing the library.
|
6
|
+
|
7
|
+
It was developed for usage in Ruby on Rails web applications and integrates seamlessly
|
8
|
+
as a Rails plugin. It should also work as a stand alone Ruby library, but much of the benefit is in the ActionView helpers which are Rails-specific.
|
9
|
+
|
10
|
+
Offsite Payments has been in production use (originally as part of the [ActiveMerchant](https://github.com/Shopify/active_merchant) project) since June 2006. It is maintained by the [Shopify](http://www.shopify.com) team, with much help from an ever-growing set of contributors.
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
### From Git
|
15
|
+
|
16
|
+
You can check out the latest source from git:
|
17
|
+
|
18
|
+
git clone https://github.com/Shopify/offsite_payments.git
|
19
|
+
|
20
|
+
### From RubyGems
|
21
|
+
|
22
|
+
Installation from RubyGems:
|
23
|
+
|
24
|
+
gem install offsite_payments
|
25
|
+
|
26
|
+
Or, if you're using Bundler, just add the following to your Gemfile:
|
27
|
+
|
28
|
+
gem 'offsite_payments'
|
29
|
+
|
30
|
+
[API documentation](http://rubydoc.info/github/Shopify/offsite_payments/master/file/README.md).
|
31
|
+
|
32
|
+
## Supported Integrations
|
33
|
+
|
34
|
+
* [2 Checkout](http://www.2checkout.com)
|
35
|
+
* [A1Agregator](http://a1agregator.ru/) - RU
|
36
|
+
* [Authorize.Net SIM](http://developer.authorize.net/api/sim/) - US
|
37
|
+
* [Banca Sella GestPay](https://www.gestpay.it/)
|
38
|
+
* [Chronopay](http://www.chronopay.com)
|
39
|
+
* [DirecPay](http://www.timesofmoney.com/direcpay/jsp/home.jsp)
|
40
|
+
* [Direct-eBanking / sofortueberweisung.de by Payment-Networks AG](https://www.payment-network.com/deb_com_en/merchantarea/home) - DE, AT, CH, BE, UK, NL
|
41
|
+
* [Dotpay](http://dotpay.pl)
|
42
|
+
* [Doku](http://doku.com)
|
43
|
+
* [Dwolla](https://www.dwolla.com/default.aspx)
|
44
|
+
* [ePay](http://www.epay.dk/epay-payment-solutions/)
|
45
|
+
* [First Data](https://firstdata.zendesk.com/entries/407522-first-data-global-gateway-e4sm-payment-pages-integration-manual)
|
46
|
+
* [HiTRUST](http://www.hitrust.com.hk/)
|
47
|
+
* [Moneybookers](http://www.moneybookers.com)
|
48
|
+
* [Nochex](http://www.nochex.com)
|
49
|
+
* [PagSeguro](http://www.pagseguro.com.br/) - BR
|
50
|
+
* [Paxum](https://www.paxum.com/)
|
51
|
+
* [PayPal Website Payments Standard](https://www.paypal.com/cgi-bin/webscr?cmd#_wp-standard-overview-outside)
|
52
|
+
* [Paysbuy](https://www.paysbuy.com/) - TH
|
53
|
+
* [Platron](https://www.platron.ru/) - RU
|
54
|
+
* [RBK Money](https://rbkmoney.ru/) - RU
|
55
|
+
* [Robokassa](http://robokassa.ru/) - RU
|
56
|
+
* [SagePay Form](http://www.sagepay.com/products_services/sage_pay_go/integration/form)
|
57
|
+
* [Suomen Maksuturva](https://www.maksuturva.fi/services/vendor_services/integration_guidelines.html)
|
58
|
+
* [Valitor](http://www.valitor.is/) - IS
|
59
|
+
* [Verkkomaksut](http://www.verkkomaksut.fi) - FI
|
60
|
+
* [WebMoney](http://www.webmoney.ru) - RU
|
61
|
+
* [WebPay](http://webpay.by/)
|
62
|
+
* [WorldPay](http://www.worldpay.com)
|
63
|
+
|
64
|
+
## Contributing
|
65
|
+
|
66
|
+
The source code is hosted at [GitHub](http://github.com/Shopify/offsite_payments), and can be fetched using:
|
67
|
+
|
68
|
+
git clone https://github.com/Shopify/offsite_payments.git
|
69
|
+
|
70
|
+
Please don't touch the CHANGELOG in your pull requests, we'll add the appropriate CHANGELOG entries at release time.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
require 'active_support/core_ext/class/delegating_attributes'
|
5
|
+
|
6
|
+
require 'active_utils/common/network_connection_retries'
|
7
|
+
require 'active_utils/common/connection'
|
8
|
+
require 'active_utils/common/requires_parameters'
|
9
|
+
require 'active_utils/common/country'
|
10
|
+
require 'active_utils/common/error'
|
11
|
+
require 'active_utils/common/post_data'
|
12
|
+
require 'active_utils/common/posts_data'
|
13
|
+
require 'active_utils/common/currency_code'
|
14
|
+
|
15
|
+
require "offsite_payments/helper"
|
16
|
+
require "offsite_payments/notification"
|
17
|
+
require "offsite_payments/return"
|
18
|
+
require "offsite_payments/integrations"
|
19
|
+
require "offsite_payments/action_view_helper"
|
20
|
+
|
21
|
+
I18n.enforce_available_locales = false
|
22
|
+
|
23
|
+
module OffsitePayments
|
24
|
+
# Return the matching integration module
|
25
|
+
# You can then get the notification from the module
|
26
|
+
# * <tt>bogus</tt>: Bogus - Does nothing (for testing)
|
27
|
+
# * <tt>chronopay</tt>: Chronopay
|
28
|
+
# * <tt>paypal</tt>: Paypal
|
29
|
+
#
|
30
|
+
# chronopay = OffsitePayments.integration('chronopay')
|
31
|
+
# notification = chronopay.notification(raw_post)
|
32
|
+
#
|
33
|
+
def self.integration(name)
|
34
|
+
Integrations.const_get("#{name.to_s.downcase}".camelize)
|
35
|
+
end
|
36
|
+
|
37
|
+
mattr_accessor :mode
|
38
|
+
self.mode = :production
|
39
|
+
|
40
|
+
# A check to see if we're in test mode
|
41
|
+
def self.test?
|
42
|
+
self.mode == :test
|
43
|
+
end
|
44
|
+
|
45
|
+
CURRENCIES_WITHOUT_FRACTIONS = [ 'BIF', 'BYR', 'CLP', 'CVE', 'DJF', 'GNF', 'HUF', 'ISK', 'JPY', 'KMF', 'KRW', 'PYG', 'RWF', 'TWD', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF' ]
|
46
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'action_pack'
|
2
|
+
|
3
|
+
module OffsitePayments #:nodoc:
|
4
|
+
ActionViewHelperError = Class.new(StandardError)
|
5
|
+
|
6
|
+
module ActionViewHelper
|
7
|
+
# This helper allows the usage of different payment integrations
|
8
|
+
# through a single form helper. Payment integrations are the
|
9
|
+
# type of service where the user is redirected to the secure
|
10
|
+
# site of the service, like Paypal or Chronopay.
|
11
|
+
#
|
12
|
+
# The helper creates a scope around a payment service helper
|
13
|
+
# which provides the specific mapping for that service.
|
14
|
+
#
|
15
|
+
# <% payment_service_for 1000, 'paypalemail@mystore.com',
|
16
|
+
# :amount => 50.00,
|
17
|
+
# :currency => 'CAD',
|
18
|
+
# :service => :paypal,
|
19
|
+
# :html => { :id => 'payment-form' } do |service| %>
|
20
|
+
#
|
21
|
+
# <% service.customer :first_name => 'Cody',
|
22
|
+
# :last_name => 'Fauser',
|
23
|
+
# :phone => '(555)555-5555',
|
24
|
+
# :email => 'cody@example.com' %>
|
25
|
+
#
|
26
|
+
# <% service.billing_address :city => 'Ottawa',
|
27
|
+
# :address1 => '21 Snowy Brook Lane',
|
28
|
+
# :address2 => 'Apt. 36',
|
29
|
+
# :state => 'ON',
|
30
|
+
# :country => 'CA',
|
31
|
+
# :zip => 'K1J1E5' %>
|
32
|
+
#
|
33
|
+
# <% service.invoice '#1000' %>
|
34
|
+
# <% service.shipping '0.00' %>
|
35
|
+
# <% service.tax '0.00' %>
|
36
|
+
#
|
37
|
+
# <% service.notify_url url_for(:only_path => false, :action => 'notify') %>
|
38
|
+
# <% service.return_url url_for(:only_path => false, :action => 'done') %>
|
39
|
+
# <% service.cancel_return_url 'http://mystore.com' %>
|
40
|
+
# <% end %>
|
41
|
+
#
|
42
|
+
def payment_service_for(order, account, options = {}, &proc)
|
43
|
+
raise ArgumentError, "Missing block" unless block_given?
|
44
|
+
|
45
|
+
integration_module = OffsitePayments::integration(options.delete(:service).to_s)
|
46
|
+
service_class = integration_module.const_get('Helper')
|
47
|
+
|
48
|
+
form_options = options.delete(:html) || {}
|
49
|
+
service = service_class.new(order, account, options)
|
50
|
+
form_options[:method] = service.form_method
|
51
|
+
result = []
|
52
|
+
service_url = service.respond_to?(:credential_based_url) ? service.credential_based_url : integration_module.service_url
|
53
|
+
result << form_tag(service_url, form_options)
|
54
|
+
|
55
|
+
result << capture(service, &proc)
|
56
|
+
|
57
|
+
service.form_fields.each do |field, value|
|
58
|
+
result << hidden_field_tag(field, value)
|
59
|
+
end
|
60
|
+
|
61
|
+
service.raw_html_fields.each do |field, value|
|
62
|
+
result << "<input id=\"#{field}\" name=\"#{field}\" type=\"hidden\" value=\"#{value}\" />\n"
|
63
|
+
end
|
64
|
+
|
65
|
+
result << '</form>'
|
66
|
+
result= result.join("\n")
|
67
|
+
|
68
|
+
concat(result.respond_to?(:html_safe) ? result.html_safe : result)
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module OffsitePayments #:nodoc:
|
2
|
+
class Helper #:nodoc:
|
3
|
+
attr_reader :fields
|
4
|
+
class_attribute :service_url
|
5
|
+
class_attribute :mappings
|
6
|
+
class_attribute :country_format
|
7
|
+
self.country_format = :alpha2
|
8
|
+
|
9
|
+
# The application making the calls to the gateway
|
10
|
+
# Useful for things like the PayPal build notation (BN) id fields
|
11
|
+
class_attribute :application_id
|
12
|
+
self.application_id = 'ActiveMerchant'
|
13
|
+
|
14
|
+
def self.inherited(subclass)
|
15
|
+
subclass.mappings ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(order, account, options = {})
|
19
|
+
options.assert_valid_keys([:amount, :currency, :test, :credential2, :credential3, :credential4, :country, :account_name, :description, :transaction_type, :authcode, :notify_url, :return_url, :redirect_param, :forward_url])
|
20
|
+
@fields = {}
|
21
|
+
@raw_html_fields = []
|
22
|
+
@test = options[:test]
|
23
|
+
self.order = order
|
24
|
+
self.account = account
|
25
|
+
self.amount = options[:amount]
|
26
|
+
self.currency = options[:currency]
|
27
|
+
self.credential2 = options[:credential2]
|
28
|
+
self.credential3 = options[:credential3]
|
29
|
+
self.credential4 = options[:credential4]
|
30
|
+
self.notify_url = options[:notify_url]
|
31
|
+
self.return_url = options[:return_url]
|
32
|
+
self.redirect_param = options[:redirect_param]
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.mapping(attribute, options = {})
|
36
|
+
self.mappings[attribute] = options
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_field(name, value)
|
40
|
+
return if name.blank? || value.blank?
|
41
|
+
@fields[name.to_s] = value.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_fields(subkey, params = {})
|
45
|
+
params.each do |k, v|
|
46
|
+
field = mappings[subkey][k]
|
47
|
+
add_field(field, v) unless field.blank?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Add a field that has characters that CGI::escape would mangle. Allows
|
52
|
+
# for multiple fields with the same name (e.g., to support line items).
|
53
|
+
def add_raw_html_field(name, value)
|
54
|
+
return if name.blank? || value.blank?
|
55
|
+
@raw_html_fields << [name, value]
|
56
|
+
end
|
57
|
+
|
58
|
+
def raw_html_fields
|
59
|
+
@raw_html_fields
|
60
|
+
end
|
61
|
+
|
62
|
+
def billing_address(params = {})
|
63
|
+
add_address(:billing_address, params)
|
64
|
+
end
|
65
|
+
|
66
|
+
def shipping_address(params = {})
|
67
|
+
add_address(:shipping_address, params)
|
68
|
+
end
|
69
|
+
|
70
|
+
def form_fields
|
71
|
+
@fields
|
72
|
+
end
|
73
|
+
|
74
|
+
def test?
|
75
|
+
@test_mode ||= OffsitePayments.mode == :test || !!@test
|
76
|
+
end
|
77
|
+
|
78
|
+
def form_method
|
79
|
+
"POST"
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def add_address(key, params)
|
85
|
+
return if mappings[key].nil?
|
86
|
+
|
87
|
+
code = lookup_country_code(params.delete(:country))
|
88
|
+
add_field(mappings[key][:country], code)
|
89
|
+
add_fields(key, params)
|
90
|
+
end
|
91
|
+
|
92
|
+
def lookup_country_code(name_or_code, format = country_format)
|
93
|
+
country = ActiveMerchant::Country.find(name_or_code)
|
94
|
+
country.code(format).to_s
|
95
|
+
rescue ActiveMerchant::InvalidCountryCodeError
|
96
|
+
name_or_code
|
97
|
+
end
|
98
|
+
|
99
|
+
def method_missing(method_id, *args)
|
100
|
+
method_id = method_id.to_s.gsub(/=$/, '').to_sym
|
101
|
+
# Return and do nothing if the mapping was not found. This allows
|
102
|
+
# for easy substitution of the different integrations
|
103
|
+
return if mappings[method_id].nil?
|
104
|
+
|
105
|
+
mapping = mappings[method_id]
|
106
|
+
|
107
|
+
case mapping
|
108
|
+
when Array
|
109
|
+
mapping.each{ |field| add_field(field, args.last) }
|
110
|
+
when Hash
|
111
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
112
|
+
|
113
|
+
mapping.each{ |key, field| add_field(field, options[key]) }
|
114
|
+
else
|
115
|
+
add_field(mapping, args.last)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module OffsitePayments
|
2
|
+
module Integrations
|
3
|
+
Dir[File.dirname(__FILE__) + '/integrations/*.rb'].each do |f|
|
4
|
+
# Get camelized class name
|
5
|
+
filename = File.basename(f, '.rb')
|
6
|
+
|
7
|
+
# Camelize the string to get the class name
|
8
|
+
integration_class = filename.camelize.to_sym
|
9
|
+
|
10
|
+
# Register for autoloading
|
11
|
+
autoload integration_class, f
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,245 @@
|
|
1
|
+
module OffsitePayments #:nodoc:
|
2
|
+
module Integrations #:nodoc:
|
3
|
+
module A1agregator
|
4
|
+
mattr_accessor :service_url
|
5
|
+
self.service_url = 'https://partner.a1agregator.ru/a1lite/input/'
|
6
|
+
|
7
|
+
mattr_accessor :signature_parameter_name
|
8
|
+
self.signature_parameter_name = 'check'
|
9
|
+
|
10
|
+
def self.notification(*args)
|
11
|
+
Notification.new(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.status(login, password)
|
15
|
+
Status.new(login, password)
|
16
|
+
end
|
17
|
+
|
18
|
+
class Helper < OffsitePayments::Helper
|
19
|
+
# public key
|
20
|
+
mapping :account, 'key'
|
21
|
+
|
22
|
+
mapping :amount, 'cost'
|
23
|
+
|
24
|
+
mapping :order, 'order_id'
|
25
|
+
|
26
|
+
mapping :customer, :email => 'email',
|
27
|
+
:phone => 'phone_number'
|
28
|
+
|
29
|
+
# payment description
|
30
|
+
mapping :credential2, 'name'
|
31
|
+
|
32
|
+
mapping :credential3, 'comment'
|
33
|
+
|
34
|
+
# on error
|
35
|
+
# 1 - raise error
|
36
|
+
# 0 - redirect
|
37
|
+
mapping :credential4, 'verbose'
|
38
|
+
end
|
39
|
+
|
40
|
+
class Notification < OffsitePayments::Notification
|
41
|
+
self.production_ips = [
|
42
|
+
'78.108.178.206',
|
43
|
+
'79.137.235.129',
|
44
|
+
'95.163.96.79',
|
45
|
+
'212.24.38.100'
|
46
|
+
]
|
47
|
+
|
48
|
+
def initialize(*args)
|
49
|
+
super
|
50
|
+
guess_notification_type
|
51
|
+
end
|
52
|
+
|
53
|
+
# Simple notification request params:
|
54
|
+
# tid
|
55
|
+
# name
|
56
|
+
# comment
|
57
|
+
# partner_id
|
58
|
+
# service_id
|
59
|
+
# order_id
|
60
|
+
# type
|
61
|
+
# partner_income
|
62
|
+
# system_income
|
63
|
+
|
64
|
+
def complete?
|
65
|
+
true
|
66
|
+
end
|
67
|
+
|
68
|
+
def transaction_id
|
69
|
+
params['tid']
|
70
|
+
end
|
71
|
+
|
72
|
+
def title
|
73
|
+
params['name']
|
74
|
+
end
|
75
|
+
|
76
|
+
def comment
|
77
|
+
params['comment']
|
78
|
+
end
|
79
|
+
|
80
|
+
def partner_id
|
81
|
+
params['partner_id']
|
82
|
+
end
|
83
|
+
|
84
|
+
def service_id
|
85
|
+
params['service_id']
|
86
|
+
end
|
87
|
+
|
88
|
+
def item_id
|
89
|
+
params['order_id']
|
90
|
+
end
|
91
|
+
|
92
|
+
def type
|
93
|
+
params['type']
|
94
|
+
end
|
95
|
+
|
96
|
+
def partner_income
|
97
|
+
params['partner_income']
|
98
|
+
end
|
99
|
+
|
100
|
+
def system_income
|
101
|
+
params['system_income']
|
102
|
+
end
|
103
|
+
|
104
|
+
# Additional notification request params:
|
105
|
+
# tid
|
106
|
+
# name
|
107
|
+
# comment
|
108
|
+
# partner_id
|
109
|
+
# service_id
|
110
|
+
# order_id
|
111
|
+
# type
|
112
|
+
# cost
|
113
|
+
# income_total
|
114
|
+
# income
|
115
|
+
# partner_income
|
116
|
+
# system_income
|
117
|
+
# command
|
118
|
+
# phone_number
|
119
|
+
# email
|
120
|
+
# resultStr
|
121
|
+
# date_created
|
122
|
+
# version
|
123
|
+
# check
|
124
|
+
|
125
|
+
def inclome_total
|
126
|
+
params['income_total']
|
127
|
+
end
|
128
|
+
|
129
|
+
def income
|
130
|
+
params['income']
|
131
|
+
end
|
132
|
+
|
133
|
+
def partner_income
|
134
|
+
params['partner_income']
|
135
|
+
end
|
136
|
+
|
137
|
+
def system_income
|
138
|
+
params['system_income']
|
139
|
+
end
|
140
|
+
|
141
|
+
def command
|
142
|
+
params['command']
|
143
|
+
end
|
144
|
+
|
145
|
+
def phone_number
|
146
|
+
params['phone_number']
|
147
|
+
end
|
148
|
+
|
149
|
+
def payer_email
|
150
|
+
params['email']
|
151
|
+
end
|
152
|
+
|
153
|
+
def result_string
|
154
|
+
params['resultStr']
|
155
|
+
end
|
156
|
+
|
157
|
+
def received_at
|
158
|
+
params['date_created']
|
159
|
+
end
|
160
|
+
|
161
|
+
def version
|
162
|
+
params['version']
|
163
|
+
end
|
164
|
+
|
165
|
+
def security_key
|
166
|
+
params[A1agregator.signature_parameter_name].to_s.downcase
|
167
|
+
end
|
168
|
+
|
169
|
+
# the money amount we received in X.2 decimal.
|
170
|
+
alias_method :gross, :system_income
|
171
|
+
|
172
|
+
def currency
|
173
|
+
'RUB'
|
174
|
+
end
|
175
|
+
|
176
|
+
# Was this a test transaction?
|
177
|
+
def test?
|
178
|
+
params['test'] == '1'
|
179
|
+
end
|
180
|
+
|
181
|
+
def simple_notification?
|
182
|
+
@notification_type == :simple
|
183
|
+
end
|
184
|
+
|
185
|
+
def additional_notification?
|
186
|
+
@notification_type == :additional
|
187
|
+
end
|
188
|
+
|
189
|
+
def acknowledge(authcode = nil)
|
190
|
+
security_key == signature
|
191
|
+
end
|
192
|
+
|
193
|
+
private
|
194
|
+
|
195
|
+
def signature
|
196
|
+
data = "#{params['tid']}\
|
197
|
+
#{params['name']}\
|
198
|
+
#{params['comment']}\
|
199
|
+
#{params['partner_id']}\
|
200
|
+
#{params['service_id']}\
|
201
|
+
#{params['order_id']}\
|
202
|
+
#{params['type']}\
|
203
|
+
#{params['partner_income']}\
|
204
|
+
#{params['system_income']}\
|
205
|
+
#{params['test']}\
|
206
|
+
#{@options[:secret]}"
|
207
|
+
Digest::MD5.hexdigest(data)
|
208
|
+
end
|
209
|
+
|
210
|
+
def guess_notification_type
|
211
|
+
@notification_type = params['version'] ? :additional : :simple
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
class Status
|
216
|
+
include ActiveMerchant::PostsData
|
217
|
+
|
218
|
+
STATUS_TEST_URL = 'https://partner.a1pay.ru/a1lite/info/'
|
219
|
+
|
220
|
+
attr_accessor :login, :password
|
221
|
+
|
222
|
+
def initialize(login, password)
|
223
|
+
@login, @password = login, password
|
224
|
+
end
|
225
|
+
|
226
|
+
# agregator provides two methods:
|
227
|
+
# by tid - transaction id
|
228
|
+
# by order_id & service_id
|
229
|
+
def update(options = {})
|
230
|
+
data = PostData.new
|
231
|
+
data[:user] = @login
|
232
|
+
data[:pass] = @password
|
233
|
+
if options[:tid]
|
234
|
+
data[:tid] = options[:tid]
|
235
|
+
else
|
236
|
+
data[:ord_id] = options[:ord_id]
|
237
|
+
data[:service_id] = options[:service_id]
|
238
|
+
end
|
239
|
+
|
240
|
+
ssl_post(STATUS_TEST_URL, data.to_post_data)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|