securetrading 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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