offsite_payments 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b93c09319f5c58335021b513de7d370d04369846
4
- data.tar.gz: 27db91e8bc8007d62fd62c10bbedbc301b5e87e8
3
+ metadata.gz: 9f3751c70ad135fce78fe690b43bd5f14cbabd90
4
+ data.tar.gz: 6f1a39ec1021b73443533901f56110e91b943ad9
5
5
  SHA512:
6
- metadata.gz: 2e3892c9fc35ef7949b8b98ea8521bdf33d98c58b2e8a8ff220d3d7fcabd5efc4de1d0bca75ca9431d1df4374d14d938aa58e7fba60cd0a4693d46180ab5db53
7
- data.tar.gz: cc5bb2b3a068fb481f6a09365ad359005fd31d5a2d202d93e143b00287653b7a5ea76533b41d90c0cbe43b375bf33eb4aa3a9b30bd89bb448b0cf4bb0fdf7223
6
+ metadata.gz: 63a6d6d932073822f7ac36ea377991e0f9af6ffd33cf3a0ae9662ffedd606af5625e5bb11052544d6d50c75e061c5e44243801ceb610e873398de7aee7e5aa69
7
+ data.tar.gz: 1197aa56f07ce913018dbde66b41186040a8c892657c1739079fe6cc194d990e753d6ef336a65bcb9fdded91367b4368e50fe6e20ce0124cfc2b037f7ee24efb
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Offsite Payments
2
- [![Build Status](https://travis-ci.org/activemerchant/offsite_payments.png?branch=master)](https://travis-ci.org/activemerchant/offsite_payments)
3
- [![Code Climate](https://codeclimate.com/github/activemerchant/offsite_payments.png)](https://codeclimate.com/github/activemerchant/offsite_payments)
2
+ [![Build Status](https://travis-ci.org/activemerchant/offsite_payments.svg?branch=master)](https://travis-ci.org/activemerchant/offsite_payments)
3
+ [![Code Climate](https://codeclimate.com/github/activemerchant/offsite_payments/badges/gpa.svg)](https://codeclimate.com/github/activemerchant/offsite_payments)
4
4
 
5
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
6
 
@@ -2,6 +2,8 @@ require 'securerandom'
2
2
  require 'cgi'
3
3
  require "timeout"
4
4
  require "socket"
5
+ require 'bigdecimal'
6
+ require 'bigdecimal/util'
5
7
 
6
8
  require 'active_utils'
7
9
 
@@ -0,0 +1,166 @@
1
+ module OffsitePayments #:nodoc:
2
+ module Integrations #:nodoc:
3
+ module CheckoutFinland
4
+
5
+ mattr_accessor :service_url
6
+ self.service_url = 'https://payment.checkout.fi/'
7
+
8
+ def self.notification(post)
9
+ Notification.new(post)
10
+ end
11
+
12
+ class Helper < OffsitePayments::Helper
13
+ include ActiveUtils::PostsData
14
+ self.country_format = :alpha3
15
+
16
+ def initialize(order, account, options = {})
17
+ md5secret options.delete(:credential2)
18
+ super
19
+
20
+ # Add default fields
21
+ add_field("VERSION", "0001") # API version
22
+ add_field("ALGORITHM", "3") # Return MAC version (3 is HMAC-SHA256)
23
+ add_field("TYPE", "0")
24
+ add_field("DEVICE", "1") # Offsite payment by default
25
+ end
26
+
27
+ def md5secret(value)
28
+ @md5secret = value
29
+ end
30
+
31
+ # Add MAC to form fields
32
+ def form_fields
33
+ @fields.merge("MAC" => generate_md5string)
34
+ end
35
+
36
+ # Apply parameter length limitations recommended by Checkout.fi
37
+ def add_field(name, value)
38
+ return if name.blank? || value.blank?
39
+ @fields[name.to_s] = check_param_length(name_to_s, value.to_s)
40
+ end
41
+
42
+ # API parameter length limitations specified by Checkout.fi
43
+ # Parameters longer than this cause the HTTP POST to fail
44
+ def check_param_length(name, value)
45
+ # Soft limitations, fields that can be clipped
46
+ max_length_substring = { "FIRSTNAME" => 40, "FAMILYNAME" => 40, "ADDRESS" => 40, "POSTCODE" => 14, "POSTOFFICE" => 18, "MESSAGE" => 1000, "EMAIL" => 200, "PHONE" => 30 }
47
+ # Hard limitations, fields that cannot be clipped
48
+ max_length_exception = { "RETURN" => 300, "CANCEL" => 300, "REJECT" => 300, "DELAYED" => 300, "STAMP" => 20, "AMOUNT" => 8, "REFERENCE" => 20, "CONTENT" => 2, "LANGUAGE" => 2, "MERCHANT" => 20, "COUNTRY" => 3, "CURRENCY" => 3, "DELIVERY_DATE" => 8 }
49
+ if max_length_substring.include? name
50
+ return value.to_s[0, max_length_substring[name]]
51
+ end
52
+ if max_length_exception.include? name
53
+ if value.to_s.length > max_length_exception[name]
54
+ raise ArgumentError, "Field #{name} length #{value.length} is longer than permitted by provider API. Maximum length #{max_length_exception[name]}."
55
+ else
56
+ return value
57
+ end
58
+ end
59
+ value
60
+ end
61
+
62
+ # Calculate MAC
63
+ def generate_md5string
64
+ fields = [@fields["VERSION"], @fields["STAMP"], @fields["AMOUNT"], @fields["REFERENCE"],
65
+ @fields["MESSAGE"], @fields["LANGUAGE"], @fields["MERCHANT"], @fields["RETURN"],
66
+ @fields["CANCEL"], @fields["REJECT"], @fields["DELAYED"], @fields["COUNTRY"],
67
+ @fields["CURRENCY"], @fields["DEVICE"], @fields["CONTENT"], @fields["TYPE"],
68
+ @fields["ALGORITHM"], @fields["DELIVERY_DATE"], @fields["FIRSTNAME"], @fields["FAMILYNAME"],
69
+ @fields["ADDRESS"], @fields["POSTCODE"], @fields["POSTOFFICE"], @md5secret]
70
+ fields = fields.join("+")
71
+ Digest::MD5.hexdigest(fields).upcase
72
+ end
73
+
74
+ # Mappings
75
+ mapping :order, 'STAMP' # Unique order number for each payment
76
+ mapping :account, 'MERCHANT' # Checkout Merchant ID
77
+ mapping :amount, 'AMOUNT' # Amount in cents
78
+ mapping :reference, 'REFERENCE' # Reference for bank statement
79
+ mapping :language, 'LANGUAGE' # "FI" / "SE" / "EN"
80
+ mapping :currency, 'CURRENCY' # "EUR" currently only
81
+ mapping :device, 'DEVICE' # "1" = HTML / "10" = XML
82
+ mapping :content, 'CONTENT' # "1" = NORMAL "2" = ADULT CONTENT
83
+ mapping :delivery_date, 'DELIVERY_DATE' # "YYYYMMDD"
84
+ mapping :description, 'MESSAGE' # Description of the order
85
+
86
+ # Optional customer data supported by API (not mandatory)
87
+ mapping :customer, :first_name => 'FIRSTNAME',
88
+ :last_name => 'FAMILYNAME',
89
+ :email => 'EMAIL',
90
+ :phone => 'PHONE'
91
+
92
+ # Optional fields supported by API (not mandatory)
93
+ mapping :billing_address, :city => 'POSTOFFICE',
94
+ :address1 => 'ADDRESS',
95
+ :zip => 'POSTCODE',
96
+ :country => 'COUNTRY'
97
+
98
+ mapping :notify_url, 'DELAYED' # Delayed payment URL (mandatory)
99
+ mapping :reject_url, 'REJECT' # Rejected payment URL (mandatory)
100
+ mapping :return_url, 'RETURN' # Payment URL (optional)
101
+ mapping :cancel_return_url, 'CANCEL' # Cancelled payment URL (optional)
102
+ end
103
+
104
+ class Notification < OffsitePayments::Notification
105
+ # Payment can be market complete with the following status codes
106
+ def complete?
107
+ ["2", "5", "6", "8", "9", "10"].include? params["STATUS"]
108
+ end
109
+
110
+ # Did the customer choose delayed payment method
111
+ def delayed?
112
+ params['STATUS'] == "3"
113
+ end
114
+
115
+ # Did the customer cancel the payment
116
+ def cancelled?
117
+ params['STATUS'] == "-1"
118
+ end
119
+
120
+ # Payment requires manual activation (fraud check etc)
121
+ def activation?
122
+ params['STATUS'] == "7"
123
+ end
124
+
125
+ # Reference specified by the client when sending payment
126
+ def reference
127
+ params['REFERENCE']
128
+ end
129
+
130
+ # Unique ID assigned by Checkout
131
+ def transaction_id
132
+ params['PAYMENT']
133
+ end
134
+
135
+ # Unique ID assigned by customer
136
+ def stamp
137
+ params['STAMP']
138
+ end
139
+
140
+ # Returned Message Authentication Code
141
+ def mac
142
+ params['MAC']
143
+ end
144
+
145
+ def status
146
+ params['STATUS']
147
+ end
148
+
149
+ # Verify authenticity of returned data
150
+ def acknowledge(authcode = nil)
151
+ return_authcode = [params["VERSION"], params["STAMP"], params["REFERENCE"], params["PAYMENT"], params["STATUS"], params["ALGORITHM"]].join("&")
152
+ OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), authcode, return_authcode).upcase == params["MAC"]
153
+ end
154
+
155
+ private
156
+
157
+ # Take the posted data and move the data into params
158
+ def parse(post)
159
+ post.each do |key, value|
160
+ params[key] = value
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -97,7 +97,7 @@ module OffsitePayments
97
97
  end
98
98
 
99
99
  def amount_ok?( order_amount )
100
- BigDecimal.new( amount ) == order_amount
100
+ amount.to_d == order_amount
101
101
  end
102
102
 
103
103
  def item_id
@@ -120,7 +120,7 @@ module OffsitePayments
120
120
  end
121
121
 
122
122
  def amount
123
- gross
123
+ Money.from_amount(BigDecimal.new(gross), currency)
124
124
  end
125
125
 
126
126
  def transaction_id
@@ -182,7 +182,7 @@ module OffsitePayments
182
182
  end
183
183
 
184
184
  def checksum_ok?
185
- fields = [invoice, transaction_status, amount.to_s, transaction_id, issuerrefno, authidcode, customer_first_name, customer_last_name, pgrespcode, customer_address[:zip]].join
185
+ fields = [invoice, transaction_status, sprintf('%.2f', amount), transaction_id, issuerrefno, authidcode, customer_first_name, customer_last_name, pgrespcode, customer_address[:zip]].join
186
186
 
187
187
  unless Citrus.checksum(@secret_key, fields ) == checksum
188
188
  @message = 'checksum mismatch...'
@@ -101,7 +101,7 @@ module OffsitePayments #:nodoc:
101
101
  end
102
102
 
103
103
  def amount
104
- BigDecimal.new(gross)
104
+ Money.from_amount(BigDecimal.new(gross), currency)
105
105
  end
106
106
 
107
107
  def item_id
@@ -131,6 +131,10 @@ module OffsitePayments #:nodoc:
131
131
  def success_response(*args)
132
132
  { :nothing => true }
133
133
  end
134
+
135
+ def currency
136
+ 'BYR'
137
+ end
134
138
  end
135
139
  end
136
140
  end
@@ -80,7 +80,7 @@ module OffsitePayments #:nodoc:
80
80
  end
81
81
 
82
82
  def amount
83
- BigDecimal.new(gross)
83
+ Money.from_amount(BigDecimal.new(gross), currency)
84
84
  end
85
85
 
86
86
  def item_id
@@ -7,7 +7,7 @@ module OffsitePayments #:nodoc:
7
7
  self.live_issuers = [
8
8
  ["ABN AMRO", "ideal_ABNANL2A"],
9
9
  ["ASN Bank", "ideal_ASNBNL21"],
10
- ["Friesland Bank", "ideal_FRBKNL2L"],
10
+ ["Bunq", "ideal_BUNQNL2A"],
11
11
  ["ING", "ideal_INGBNL2A"],
12
12
  ["Knab", "ideal_KNABNL2H"],
13
13
  ["Rabobank", "ideal_RABONL2U"],
@@ -212,7 +212,7 @@ module OffsitePayments #:nodoc:
212
212
 
213
213
  # The net amount credited to the receiver's account.
214
214
  def amount
215
- params['amount_net']
215
+ Money.from_amount(BigDecimal.new(params['amount_net']), currency)
216
216
  end
217
217
 
218
218
  # The name of the item being charged for.
@@ -226,7 +226,7 @@ module OffsitePayments #:nodoc:
226
226
  end
227
227
 
228
228
  def currency
229
- nil
229
+ 'ZAR'
230
230
  end
231
231
 
232
232
  # Generated hash depends on params order so use OrderedHash instead of Hash
@@ -2,26 +2,56 @@ module OffsitePayments #:nodoc:
2
2
  module Integrations #:nodoc:
3
3
  module Paydollar
4
4
  CURRENCY_MAP = {
5
- 'AED' => '784',
6
- 'AUD' => '036',
7
- 'BND' => '096',
8
- 'CAD' => '124',
5
+ 'HKD' => '344',
6
+ 'USD' => '840',
7
+ 'SGD' => '702',
9
8
  'CNY' => '156',
9
+ 'JPY' => '392',
10
+ 'TWD' => '901',
11
+ 'AUD' => '036',
10
12
  'EUR' => '978',
11
13
  'GBP' => '826',
12
- 'HKD' => '344',
13
- 'IDR' => '360',
14
- 'JPY' => '392',
15
- 'KRW' => '410',
14
+ 'CAD' => '124',
16
15
  'MOP' => '446',
16
+ 'PHP' => '608',
17
+ 'THB' => '764',
17
18
  'MYR' => '458',
19
+ 'IDR' => '360',
20
+ 'KRW' => '410',
21
+ 'BND' => '096',
18
22
  'NZD' => '554',
19
- 'PHP' => '608',
20
23
  'SAR' => '682',
21
- 'SGD' => '702',
22
- 'THB' => '764',
23
- 'TWD' => '901',
24
- 'USD' => '840',
24
+ 'AED' => '784',
25
+ 'BRL' => '986',
26
+ 'INR' => '356',
27
+ 'TRY' => '949',
28
+ 'ZAR' => '710',
29
+ 'VND' => '704',
30
+ 'DKK' => '208',
31
+ 'ILS' => '376',
32
+ 'NOK' => '578',
33
+ 'RUB' => '643',
34
+ 'SEK' => '752',
35
+ 'CHF' => '756',
36
+ 'ARS' => '032',
37
+ 'CLP' => '152',
38
+ 'COP' => '170',
39
+ 'CZK' => '203',
40
+ 'EGP' => '818',
41
+ 'HUF' => '348',
42
+ 'KZT' => '398',
43
+ 'LBP' => '422',
44
+ 'MXN' => '484',
45
+ 'NGN' => '566',
46
+ 'PKR' => '586',
47
+ 'PEN' => '604',
48
+ 'PLN' => '985',
49
+ 'QAR' => '634',
50
+ 'RON' => '946',
51
+ 'UAH' => '980',
52
+ 'VEF' => '937',
53
+ 'LKR' => '144',
54
+ 'KWD' => '414',
25
55
  }
26
56
 
27
57
  def self.service_url
@@ -0,0 +1,168 @@
1
+ module OffsitePayments #:nodoc:
2
+ module Integrations #:nodoc:
3
+ module Paytm
4
+
5
+ def self.notification(post, options = {})
6
+ Notification.new(post, options)
7
+ end
8
+
9
+ def self.return(query_string, options = {})
10
+ Return.new(query_string, options)
11
+ end
12
+
13
+ def self.sign(fields, key)
14
+ Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, key, fields.sort.join)).delete("\n")
15
+ end
16
+
17
+ class Helper < OffsitePayments::Helper
18
+ CURRENCY_SPECIAL_MINOR_UNITS = {
19
+ 'BIF' => 0,
20
+ 'BYR' => 0,
21
+ 'CLF' => 0,
22
+ 'CLP' => 0,
23
+ 'CVE' => 0,
24
+ 'DJF' => 0,
25
+ 'GNF' => 0,
26
+ 'HUF' => 0,
27
+ 'ISK' => 0,
28
+ 'JPY' => 0,
29
+ 'KMF' => 0,
30
+ 'KRW' => 0,
31
+ 'PYG' => 0,
32
+ 'RWF' => 0,
33
+ 'UGX' => 0,
34
+ 'UYI' => 0,
35
+ 'VND' => 0,
36
+ 'VUV' => 0,
37
+ 'XAF' => 0,
38
+ 'XOF' => 0,
39
+ 'XPF' => 0,
40
+ 'BHD' => 3,
41
+ 'IQD' => 3,
42
+ 'JOD' => 3,
43
+ 'KWD' => 3,
44
+ 'LYD' => 3,
45
+ 'OMR' => 3,
46
+ 'TND' => 3,
47
+ 'COU' => 4
48
+ }
49
+
50
+ def initialize(order, account, options = {})
51
+ mid_param = { MID: account }.to_query
52
+ @forward_url_stag = "https://pguat.paytm.com/oltp-web/genericPT?#{mid_param}"
53
+ @forward_url_prod = "https://secure.paytm.in/oltp-web/genericPT?#{mid_param}"
54
+ @key = options[:credential2]
55
+ @currency = options[:currency]
56
+
57
+ super
58
+ add_field 'x_test', @test.to_s
59
+ end
60
+
61
+ def credential_based_url
62
+ @test ? @forward_url_stag : @forward_url_prod
63
+ end
64
+
65
+ def form_fields
66
+ sign_fields
67
+ end
68
+
69
+ def amount=(amount)
70
+ add_field 'x_amount', format_amount(amount, @currency)
71
+ end
72
+
73
+ def sign_fields
74
+ @fields.merge!('x_signature' => generate_signature)
75
+ end
76
+
77
+ def generate_signature
78
+ Paytm.sign(@fields, @key)
79
+ end
80
+
81
+ mapping :account, 'x_account_id'
82
+ mapping :currency, 'x_currency'
83
+ mapping :order, 'x_reference'
84
+ mapping :description, 'x_description'
85
+ mapping :invoice, 'x_invoice'
86
+ mapping :credential3, 'x_credential3'
87
+ mapping :credential4, 'x_credential4'
88
+
89
+ mapping :customer, :email => 'x_customer_email',
90
+ :phone => 'x_customer_phone'
91
+
92
+ mapping :notify_url, 'x_url_callback'
93
+ mapping :return_url, 'x_url_complete'
94
+ mapping :cancel_return_url, 'x_url_cancel'
95
+
96
+ private
97
+
98
+ def format_amount(amount, currency)
99
+ units = CURRENCY_SPECIAL_MINOR_UNITS[currency] || 2
100
+ sprintf("%.#{units}f", amount)
101
+ end
102
+ end
103
+
104
+ class Notification < OffsitePayments::Notification
105
+ def initialize(post, options = {})
106
+ super
107
+ @key = options[:credential2]
108
+ end
109
+
110
+ def acknowledge(authcode = nil)
111
+ signature = @params['x_signature']
112
+ signature == generate_signature ? true : false
113
+ end
114
+
115
+ def item_id
116
+ @params['x_reference']
117
+ end
118
+
119
+ def currency
120
+ @params['x_currency']
121
+ end
122
+
123
+ def gross
124
+ @params['x_amount']
125
+ end
126
+
127
+ def transaction_id
128
+ @params['x_gateway_reference']
129
+ end
130
+
131
+ def status
132
+ result = @params['x_result']
133
+ result && result.capitalize
134
+ end
135
+
136
+ def message
137
+ @params['x_message']
138
+ end
139
+
140
+ def test?
141
+ @params['x_test'] == 'true'
142
+ end
143
+
144
+ private
145
+
146
+ def generate_signature
147
+ signature_params = @params.select { |k| k.start_with? 'x_' }.reject { |k| k == 'x_signature' }
148
+ Paytm.sign(signature_params, @key)
149
+ end
150
+ end
151
+
152
+ class Return < OffsitePayments::Return
153
+ def initialize(query_string, options = {})
154
+ super
155
+ @notification = Notification.new(query_string, options)
156
+ end
157
+
158
+ def success?
159
+ @notification.acknowledge
160
+ end
161
+
162
+ def message
163
+ @notification.message
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
@@ -84,8 +84,9 @@ module OffsitePayments #:nodoc:
84
84
  end
85
85
 
86
86
  def sanitize_fields
87
- ['address1', 'address2', 'city', 'state', 'country', 'productinfo', 'email', 'phone'].each do |field|
88
- @fields[field].gsub!(/[^a-zA-Z0-9\-_@\/\s.]/, '') if @fields[field]
87
+ @fields['phone'] = @fields['phone'].gsub(/[^0-9]/, '') if @fields['phone']
88
+ ['address1', 'address2', 'city', 'state', 'country', 'productinfo', 'email'].each do |field|
89
+ @fields[field] = @fields[field].gsub(/[^a-zA-Z0-9\-_@\/\s.]/, '') if @fields[field]
89
90
  end
90
91
  end
91
92
 
@@ -120,7 +120,7 @@ module OffsitePayments #:nodoc:
120
120
  end
121
121
 
122
122
  def amount
123
- params['pg_amount']
123
+ Money.from_amount(BigDecimal.new(params['pg_amount']), currency)
124
124
  end
125
125
 
126
126
  def secret
@@ -71,20 +71,20 @@ module OffsitePayments #:nodoc:
71
71
  end
72
72
 
73
73
  # Realex accepts currency amounts as an integer in the lowest value
74
- # e.g.
74
+ # e.g.
75
75
  # format_amount(110.56, 'GBP')
76
76
  # => 11056
77
77
  def format_amount(amount, currency)
78
78
  units = CURRENCY_SPECIAL_MINOR_UNITS[currency] || 2
79
79
  multiple = 10**units
80
- return (amount.to_f * multiple.to_f).to_i
80
+ return ((amount || 0).to_d * multiple.to_d).to_i
81
81
  end
82
82
 
83
83
  # Realex returns currency amount as an integer
84
84
  def format_amount_as_float(amount, currency)
85
85
  units = CURRENCY_SPECIAL_MINOR_UNITS[currency] || 2
86
86
  divisor = 10**units
87
- return (amount.to_f / divisor.to_f)
87
+ return ((amount || 0).to_d / divisor.to_d)
88
88
  end
89
89
 
90
90
  def extract_digits(value)
@@ -103,10 +103,6 @@ module OffsitePayments #:nodoc:
103
103
  true
104
104
  end
105
105
 
106
- def amount
107
- BigDecimal.new(gross)
108
- end
109
-
110
106
  def item_id
111
107
  params['InvId']
112
108
  end
@@ -138,6 +134,10 @@ module OffsitePayments #:nodoc:
138
134
  def success_response(*args)
139
135
  "OK#{item_id}"
140
136
  end
137
+
138
+ def currency
139
+ 'RUB'
140
+ end
141
141
  end
142
142
 
143
143
  class Return < OffsitePayments::Return
@@ -160,8 +160,8 @@ module OffsitePayments #:nodoc:
160
160
  parts = fields.map { |k, v| "#{k}=#{sanitize(k, v)}" unless v.nil? }.compact.shuffle
161
161
  parts.unshift(sage_encrypt_salt(key.length, key.length * 2))
162
162
  sage_encrypt(parts.join('&'), key)
163
- rescue OpenSSL::Cipher::CipherError => e
164
- if e.message == 'key length too short'
163
+ rescue OpenSSL::Cipher::CipherError, ArgumentError => e
164
+ if e.message == 'key length too short' || e.message == 'key must be 16 bytes'
165
165
  raise ActionViewHelperError, 'Invalid encryption key.'
166
166
  else
167
167
  raise
@@ -73,14 +73,6 @@ module OffsitePayments #:nodoc:
73
73
  add_field 'x_amount', format_amount(amount, @currency)
74
74
  end
75
75
 
76
- def shipping(amount)
77
- add_field 'x_amount_shipping', format_amount(amount, @currency)
78
- end
79
-
80
- def tax(amount)
81
- add_field 'x_amount_tax', format_amount(amount, @currency)
82
- end
83
-
84
76
  def sign_fields
85
77
  @fields.merge!('x_signature' => generate_signature)
86
78
  end
@@ -105,6 +97,17 @@ module OffsitePayments #:nodoc:
105
97
  :email => 'x_customer_email',
106
98
  :phone => 'x_customer_phone'
107
99
 
100
+ mapping :billing_address, :first_name => 'x_customer_billing_first_name',
101
+ :last_name => 'x_customer_billing_last_name',
102
+ :city => 'x_customer_billing_city',
103
+ :company => 'x_customer_billing_company',
104
+ :address1 => 'x_customer_billing_address1',
105
+ :address2 => 'x_customer_billing_address2',
106
+ :state => 'x_customer_billing_state',
107
+ :zip => 'x_customer_billing_zip',
108
+ :country => 'x_customer_billing_country',
109
+ :phone => 'x_customer_billing_phone'
110
+
108
111
  mapping :shipping_address, :first_name => 'x_customer_shipping_first_name',
109
112
  :last_name => 'x_customer_shipping_last_name',
110
113
  :city => 'x_customer_shipping_city',
@@ -160,6 +163,10 @@ module OffsitePayments #:nodoc:
160
163
  result && result.capitalize
161
164
  end
162
165
 
166
+ def message
167
+ @params['x_message']
168
+ end
169
+
163
170
  def test?
164
171
  @params['x_test'] == 'true'
165
172
  end
@@ -181,6 +188,10 @@ module OffsitePayments #:nodoc:
181
188
  def success?
182
189
  @notification.acknowledge
183
190
  end
191
+
192
+ def message
193
+ @notification.message
194
+ end
184
195
  end
185
196
  end
186
197
  end
@@ -150,7 +150,7 @@ module OffsitePayments #:nodoc:
150
150
  end
151
151
 
152
152
  def amount
153
- BigDecimal.new(gross)
153
+ Money.from_amount(BigDecimal.new(gross), currency)
154
154
  end
155
155
 
156
156
  def item_id
@@ -180,6 +180,10 @@ module OffsitePayments #:nodoc:
180
180
  def success_response(*args)
181
181
  {:nothing => true}
182
182
  end
183
+
184
+ def currency
185
+ params['currency_id']
186
+ end
183
187
  end
184
188
  end
185
189
  end
@@ -83,7 +83,7 @@ module OffsitePayments #:nodoc:
83
83
  end
84
84
 
85
85
  def amount
86
- BigDecimal.new(gross)
86
+ Money.from_amount(BigDecimal.new(gross), currency)
87
87
  end
88
88
 
89
89
  def key_present?
@@ -113,6 +113,10 @@ module OffsitePayments #:nodoc:
113
113
  def success_response(*args)
114
114
  {:nothing => true}
115
115
  end
116
+
117
+ def currency
118
+ 'RUB'
119
+ end
116
120
  end
117
121
  end
118
122
  end
@@ -25,9 +25,9 @@ module OffsitePayments #:nodoc:
25
25
  return {} if query_string.blank?
26
26
 
27
27
  query_string.split('&').inject({}) do |memo, chunk|
28
- next if chunk.empty?
28
+ next memo if chunk.empty?
29
29
  key, value = chunk.split('=', 2)
30
- next if key.empty?
30
+ next memo if key.empty?
31
31
  value = value.nil? ? nil : CGI.unescape(value)
32
32
  memo[CGI.unescape(key)] = value
33
33
  memo
@@ -1,3 +1,3 @@
1
1
  module OffsitePayments
2
- VERSION = "2.3.0"
2
+ VERSION = "2.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: offsite_payments
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-08 00:00:00.000000000 Z
11
+ date: 2017-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -98,14 +98,14 @@ dependencies:
98
98
  requirements:
99
99
  - - "~>"
100
100
  - !ruby/object:Gem::Version
101
- version: '1.4'
101
+ version: '1.6'
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '1.4'
108
+ version: '1.6'
109
109
  - !ruby/object:Gem::Dependency
110
110
  name: actionpack
111
111
  requirement: !ruby/object:Gem::Requirement
@@ -216,6 +216,7 @@ files:
216
216
  - lib/offsite_payments/integrations/authorize_net_sim.rb
217
217
  - lib/offsite_payments/integrations/bit_pay.rb
218
218
  - lib/offsite_payments/integrations/bogus.rb
219
+ - lib/offsite_payments/integrations/checkout_finland.rb
219
220
  - lib/offsite_payments/integrations/chronopay.rb
220
221
  - lib/offsite_payments/integrations/citrus.rb
221
222
  - lib/offsite_payments/integrations/coinbase.rb
@@ -248,6 +249,7 @@ files:
248
249
  - lib/offsite_payments/integrations/paypal.rb
249
250
  - lib/offsite_payments/integrations/paypal_payments_advanced.rb
250
251
  - lib/offsite_payments/integrations/paysbuy.rb
252
+ - lib/offsite_payments/integrations/paytm.rb
251
253
  - lib/offsite_payments/integrations/payu_in.rb
252
254
  - lib/offsite_payments/integrations/payu_in_paisa.rb
253
255
  - lib/offsite_payments/integrations/platron.rb
@@ -288,7 +290,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
288
290
  version: '0'
289
291
  requirements: []
290
292
  rubyforge_project:
291
- rubygems_version: 2.2.3
293
+ rubygems_version: 2.5.2
292
294
  signing_key:
293
295
  specification_version: 4
294
296
  summary: Framework and tools for dealing with offsite (hosted) payment pages.