securetrading 0.2.0 → 0.3.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: 79415e27c8e12d4d5c2665453b2b297fb747eaf0
4
- data.tar.gz: 7d83ddb86ca77c924e264c7a0ca0b7f65b319c44
3
+ metadata.gz: fa0b858de02b3d93f7394e6b2b2b86de5bd544c7
4
+ data.tar.gz: de7c1bc1b95797567c9789ee960af85b7b498cc2
5
5
  SHA512:
6
- metadata.gz: 6ad10220ac03be131c8b22fc5378ffadaa1c320097a7d25b54dc1943935b428d77678eeef6756fe803382626902c9d2e109f9d26620017cfa4b5cabd2fd0333c
7
- data.tar.gz: 1c817f6c672cfde5c01e7afe71c2409cb50751a2bc4d8decc25eecdb89e505064ddc85a770256fc0e28b5585df57c5e04ae337973d2bc378d994286ae6bc5923
6
+ metadata.gz: 6b8441e9c2d9edfef640a416d84dfa10a52fba29417361652e53376f275fad4a121cc54ac3347bd769b1707a8cd263dcaf9d3c2bb683dd9a52fa7de28c0f962b
7
+ data.tar.gz: 9fb7c71a6538567f39e6f9a5acc986c535b481e82920a994fb1c460a7164968b426b661e865528918049d75baedc12a383a87455b68bf5f5414d0a1aa01d2a43
@@ -1,8 +1,8 @@
1
1
  # Securetrading change log
2
2
 
3
- ## 0.2.0 / Unreleased
3
+ ## 0.4.0 / Unreleased
4
4
 
5
- * [Added] Filter - query API for transactions details.
5
+ * [Added]
6
6
 
7
7
  * [Deprecated]
8
8
 
@@ -10,6 +10,21 @@
10
10
 
11
11
  * [Fixed]
12
12
 
13
+ ## 0.3.0 / 2015-08-25
14
+
15
+ * [Added]
16
+ * Securetrading::SiteSecurity.hash(fields) to return SHA256 encoded sitesecurity value from hash of fields to encode.
17
+ * auth_method configuration value
18
+ * site_security_password configuration value
19
+ * Securetrading::Response to objectify response from httparty
20
+
21
+ * [Deprecated]
22
+ * Renamed Filter class to TransactionQuery class as much more relevant.
23
+
24
+ ## 0.2.0 / 2015-08-14
25
+
26
+ * [Added] Filter - query API for transactions details.
27
+
13
28
  ## 0.1.0 / 2015-08-13
14
29
 
15
30
  * [Added] Possibility to send REFUND request to API.
data/README.md CHANGED
@@ -75,7 +75,7 @@ Will send post request with xml:
75
75
  </requestblock>
76
76
  ```
77
77
 
78
- #### FILTER
78
+ #### TRANSACTIONQUERY
79
79
 
80
80
  Parameters:
81
81
  - filters - list of filter xml subtags. You may find full list of filters in this doc: [http://www.securetrading.com/support/document/xml-reference-transaction-query/](http://www.securetrading.com/support/document/xml-reference-transaction-query/)
@@ -83,8 +83,8 @@ Parameters:
83
83
  Example:
84
84
 
85
85
  ```ruby
86
- > filter = Securetrading::Filter.new({ transactionreference: [ '5-9-1982481', '5-9-1980795'] })
87
- > filter.perform
86
+ > query = Securetrading::TransactionQuery.new(transactionreference: [ '5-9-1982481', '5-9-1980795'])
87
+ > query.perform
88
88
  ```
89
89
  It will send post request with xml:
90
90
 
@@ -100,6 +100,14 @@ It will send post request with xml:
100
100
  </requestblock>
101
101
  ```
102
102
 
103
+ #### SiteSecurity
104
+
105
+ Helper class for sitesecurity value calculation.
106
+ More details in [STPP-Payment-Pages-Setup-Guide-V2](http://www.securetrading.com/files/documentation/STPP-Payment-Pages-Setup-Guide-V2.pdf) chapter 6.
107
+
108
+ Methods:
109
+ * hash(fields) - calculates SHA256 hash from fields. List of fields you can check in doc above.
110
+
103
111
  ## Development
104
112
 
105
113
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -25,4 +25,6 @@ end
25
25
  require 'securetrading/connection'
26
26
  require 'securetrading/xml_doc'
27
27
  require 'securetrading/refund'
28
- require 'securetrading/filter'
28
+ require 'securetrading/transaction_query'
29
+ require 'securetrading/site_security'
30
+ require 'securetrading/models'
@@ -0,0 +1,13 @@
1
+ module Securetrading
2
+ class Amount < BaseModel
3
+ def value
4
+ attributes_hash['__content__']
5
+ end
6
+
7
+ def ox_xml
8
+ el = XmlDoc.new_element(xml_tag_name)
9
+ el['currencycode'] = currencycode
10
+ el << value.to_s
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,39 @@
1
+ module Securetrading
2
+ class BaseModel
3
+ def initialize(attrs_hash = {})
4
+ @attributes_hash = attrs_hash.presence && attrs_hash.stringify_keys
5
+ end
6
+
7
+ def ox_xml
8
+ XmlDoc.elements(xml_tag_name => @attributes_hash).first
9
+ end
10
+
11
+ private
12
+
13
+ def xml_tag_name
14
+ self.class.name.demodulize.downcase
15
+ end
16
+
17
+ def method_missing(m, *args, &block)
18
+ return super unless attributes_hash.key?(m.to_s)
19
+ determine_value(m.to_s)
20
+ end
21
+
22
+ def determine_value(name)
23
+ if name == 'error'
24
+ Securetrading::ResponseError.new(attributes_hash[name])
25
+ elsif name.in?(sub_classes)
26
+ "Securetrading::#{name.capitalize}".constantize
27
+ .public_send(:new, attributes_hash[name])
28
+ else
29
+ attributes_hash[name]
30
+ end
31
+ end
32
+
33
+ def sub_classes
34
+ []
35
+ end
36
+
37
+ attr_reader :attributes_hash
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ module Securetrading
2
+ class Billing < BaseModel
3
+ private
4
+
5
+ def sub_classes
6
+ %w(amount name dcc payment)
7
+ end
8
+ end
9
+ end
@@ -2,7 +2,17 @@ module Securetrading
2
2
  class ConfigurationError < StandardError; end
3
3
  class Configuration
4
4
  attr_accessor :user, :password
5
- attr_writer :site_reference
5
+ attr_writer :site_reference, :auth_method, :site_security_password
6
+
7
+ def site_security_password
8
+ return @site_security_password if @site_security_password.present?
9
+ fail ConfigurationError, 'You are trying to use site security '\
10
+ 'but your password is empty. Please check gem configuration.'
11
+ end
12
+
13
+ def auth_method
14
+ @auth_method ||= 'FINAL'.freeze
15
+ end
6
16
 
7
17
  def site_reference
8
18
  return @site_reference if @site_reference.present?
@@ -24,18 +24,18 @@ module Securetrading
24
24
  end
25
25
 
26
26
  def request_type
27
- fail NotImplementedError, 'Implement :request_type method in subclas!'
27
+ fail NotImplementedError, 'Implement :request_type method in sub-class!'
28
28
  end
29
29
 
30
30
  def ox_xml
31
- fail NotImplementedError, 'Implement :ox_xml method in subclas!'
31
+ fail NotImplementedError, 'Implement :ox_xml method in sub-class!'
32
32
  end
33
33
 
34
34
  def perform_with(method, xml, options = {})
35
- self.class.public_send(method,
36
- '/',
37
- options.merge(body: xml,
38
- headers: dynamic_headers))
35
+ party = self.class.public_send(
36
+ method, '/', options.merge(body: xml, headers: dynamic_headers)
37
+ )
38
+ Securetrading::Response.new(party)
39
39
  end
40
40
 
41
41
  def dynamic_headers
@@ -0,0 +1,18 @@
1
+ require 'securetrading/base_model'
2
+
3
+ module Securetrading
4
+ class Customer < BaseModel; end
5
+ class Dcc < BaseModel; end
6
+ class Merchant < BaseModel; end
7
+ class Name < BaseModel; end
8
+ class Operation < BaseModel; end
9
+ class Payment < BaseModel; end
10
+ class ResponseError < BaseModel; end
11
+ class Settlement < BaseModel; end
12
+ class Security < BaseModel; end
13
+ end
14
+
15
+ require 'securetrading/amount'
16
+ require 'securetrading/billing'
17
+ require 'securetrading/record'
18
+ require 'securetrading/response'
@@ -0,0 +1,9 @@
1
+ module Securetrading
2
+ class Record < BaseModel
3
+ private
4
+
5
+ def sub_classes
6
+ %w(operation settlement billing merchant customer)
7
+ end
8
+ end
9
+ end
@@ -25,22 +25,20 @@ module Securetrading
25
25
  end
26
26
 
27
27
  def operation
28
- XmlDoc.elements(
29
- operation: {
30
- sitereference: Securetrading.config.site_reference,
31
- accounttypedescription: @account_type,
32
- parenttransactionreference: @parent_transaction
33
- }
34
- ).first
28
+ Operation.new(
29
+ sitereference: Securetrading.config.site_reference,
30
+ accounttypedescription: @account_type,
31
+ parenttransactionreference: @parent_transaction
32
+ ).ox_xml
35
33
  end
36
34
 
37
35
  def billing
38
- XmlDoc.elements(billing: { amount: @amount }).first
36
+ Billing.new(amount: @amount).ox_xml
39
37
  end
40
38
 
41
39
  def merchant
42
40
  return '' unless @options[:merchant].present?
43
- XmlDoc.elements(merchant: @options[:merchant]).first
41
+ Merchant.new(@options[:merchant]).ox_xml
44
42
  end
45
43
  end
46
44
  end
@@ -0,0 +1,47 @@
1
+ module Securetrading
2
+ class Response < BaseModel
3
+ attr_reader :httparty
4
+
5
+ def initialize(httparty)
6
+ @httparty = httparty
7
+ end
8
+
9
+ def data
10
+ rows.map { |row| Record.new(row) }
11
+ end
12
+
13
+ def found
14
+ attributes_hash['found'].to_i
15
+ end
16
+
17
+ private
18
+
19
+ def rows
20
+ case found
21
+ when 0 then []
22
+ when 1 then [record]
23
+ else record
24
+ end
25
+ end
26
+
27
+ def attributes_hash
28
+ return @attributes_hash if @attributes_hash.present?
29
+ @attributes_hash = responseblock
30
+ @attributes_hash.merge!(additional_attributes)
31
+ end
32
+
33
+ def additional_attributes
34
+ if responseblock['type'] == 'ERROR'
35
+ {}
36
+ elsif responseblock['response']['type'] == 'TRANSACTIONQUERY'
37
+ @attributes_hash.delete('response')
38
+ else
39
+ { 'record' => @attributes_hash.delete('response'), 'found' => '1' }
40
+ end
41
+ end
42
+
43
+ def responseblock
44
+ @responseblock ||= @httparty.parsed_response['responseblock']
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,20 @@
1
+ module Securetrading
2
+ class SiteSecurity
3
+ def self.hash(fields)
4
+ Digest::SHA256.hexdigest(str_to_encode(fields))
5
+ end
6
+
7
+ def self.str_to_encode(fields)
8
+ str = ''
9
+ fields.reverse_merge!(authmethod: Securetrading.config.auth_method)
10
+ [:currencyiso3a, :mainamount, :sitereference, :settlestatus,
11
+ :settleduedate, :authmethod, :paypaladdressoverride,
12
+ :strequiredfields, :version, :stprofile, :ruleidentifier,
13
+ :successfulurlredirect, :declinedurlredirect].each do |field|
14
+ str << fields[field].to_s
15
+ end
16
+ str << Securetrading.config.site_security_password
17
+ end
18
+ private_class_method :str_to_encode
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  module Securetrading
2
- class Filter < Connection
2
+ class TransactionQuery < Connection
3
3
  def initialize(filters)
4
4
  @filters = filters
5
5
  end
@@ -1,3 +1,3 @@
1
1
  module Securetrading
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: securetrading
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bitgamelabs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-14 00:00:00.000000000 Z
11
+ date: 2015-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -174,10 +174,17 @@ files:
174
174
  - bin/guard
175
175
  - bin/setup
176
176
  - lib/securetrading.rb
177
+ - lib/securetrading/amount.rb
178
+ - lib/securetrading/base_model.rb
179
+ - lib/securetrading/billing.rb
177
180
  - lib/securetrading/configuration.rb
178
181
  - lib/securetrading/connection.rb
179
- - lib/securetrading/filter.rb
182
+ - lib/securetrading/models.rb
183
+ - lib/securetrading/record.rb
180
184
  - lib/securetrading/refund.rb
185
+ - lib/securetrading/response.rb
186
+ - lib/securetrading/site_security.rb
187
+ - lib/securetrading/transaction_query.rb
181
188
  - lib/securetrading/version.rb
182
189
  - lib/securetrading/xml_doc.rb
183
190
  - securetrading.gemspec