trustly-client-ruby 0.0.6

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c90e99723b00ef20870db739054224a2a736e30a
4
+ data.tar.gz: d11c19c43749183b921c8278b56572ee29d07ca0
5
+ SHA512:
6
+ metadata.gz: ac472acbd680ffcdb1696dab28c91031dc70f1f50b1002c4c55854c7c92233703c76597b59a54e1692d36556bfce1087285ec3565d1f767329850de9f2e9b2a4
7
+ data.tar.gz: 036fd6b47420f61653eaf025cca5f7d4edb20cd020fd31d9f2a414c0f136a66b1deb2e4ea287413de1e0e60d7059ea473101146cd182baa32552cac77d2a1fe3
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 TODO: Write your name
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Trustly::Client::Ruby
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/trustly/client/ruby`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'trustly-client-ruby'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install trustly-client-ruby
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ 1. Fork it ( https://github.com/[my-github-username]/trustly-client-ruby/fork )
36
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
37
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
38
+ 4. Push to the branch (`git push origin my-new-feature`)
39
+ 5. Create a new Pull Request
data/lib/trustly.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Trustly
2
+
3
+ end
@@ -0,0 +1,108 @@
1
+
2
+ class Trustly::Api
3
+
4
+ attr_accessor :api_host, :api_port, :api_is_https,:last_request,:trustly_publickey,:trustly_verifyer
5
+
6
+ def serialize_data(object)
7
+ serialized = ""
8
+ if object.is_a?(Array)
9
+ # Its an array
10
+ object.each do |obj|
11
+ serialized.concat(obj.is_a?(Hash) ? serialize_data(obj) : obj.to_s)
12
+ end
13
+ elsif object.is_a?(Hash)
14
+ # Its a Hash
15
+ object.sort.to_h.each do |key,value|
16
+ serialized.concat(key.to_s).concat(serialize_data(value))
17
+ end
18
+ else
19
+ # Anything else: numbers, symbols, values
20
+ serialized.concat object.to_s
21
+ end
22
+ return serialized
23
+ end
24
+
25
+ def initialize(host,port,is_https,pem_file)
26
+ self.api_host = host
27
+ self.api_port = port
28
+ self.api_is_https = is_https
29
+
30
+ self.load_trustly_publickey(pem_file)
31
+ end
32
+
33
+ def load_trustly_publickey(file)
34
+ self.trustly_publickey = OpenSSL::PKey::RSA.new(File.read(file)) #.public_key
35
+ end
36
+
37
+ def url_path(request=nil)
38
+ raise NotImplementedError
39
+ end
40
+
41
+ def handle_response(request,httpcall)
42
+ raise NotImplementedError
43
+ end
44
+
45
+ def insert_credentials(request)
46
+ raise NotImplementedError
47
+ end
48
+
49
+ protected
50
+
51
+ def _verify_trustly_signed_data(method, uuid, signature, data)
52
+ method = '' if method.nil?
53
+ uuid = '' if uuid.nil?
54
+ serial_data = "#{method}#{uuid}#{self.serialize_data(data)}"
55
+ raw_signature = Base64.decode64(signature)
56
+ return self.trustly_publickey.public_key.verify(OpenSSL::Digest::SHA1.new, raw_signature, serial_data)
57
+ end
58
+
59
+ def verify_trustly_signed_response(response)
60
+ method = response.get_method()
61
+ uuid = response.get_uuid()
62
+ signature = response.get_signature()
63
+ data = response.get_data()
64
+ return self._verify_trustly_signed_data(method, uuid, signature, data)
65
+ end
66
+
67
+ def verify_trustly_signed_notification(response)
68
+ method = response.get_method()
69
+ uuid = response.get_uuid()
70
+ signature = response.get_signature()
71
+ data = response.get_data()
72
+ return self._verify_trustly_signed_data(method, uuid, signature, data)
73
+ end
74
+
75
+ def set_host(host=nil,port=nil,is_https=nil)
76
+ self.api_host = host unless host.nil?
77
+ self.load_trustly_publickey() unless host.nil?
78
+ self.api_port = port unless port.nil?
79
+ self.is_https = is_https unless is_https.nil?
80
+ end
81
+
82
+ def base_url
83
+ if self.api_is_https
84
+ return (self.api_port == 443) ? "https://#{self.api_host}" : "https://#{self.api_host}:#{self.api_port}"
85
+ else
86
+ return (self.api_port == 80) ? "http://#{self.api_host}" : "http://#{self.api_host}:#{self.api_port}"
87
+ end
88
+ end
89
+
90
+ def uri(request)
91
+ return URI("#{self.base_url}#{self.url_path(request)}")
92
+ end
93
+
94
+ def call_rpc(request)
95
+ self.insert_credentials(request)
96
+ self.last_request = request
97
+ uri = self.uri(request)
98
+ http_req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/json'})
99
+ http_req.body = request.json()
100
+ http_res = Net::HTTP.start(uri.hostname, uri.port,{use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE}) { |http| http.request(http_req) }
101
+ return self.handle_response(request,http_res)
102
+ end
103
+
104
+
105
+
106
+ end
107
+
108
+
@@ -0,0 +1,117 @@
1
+ class Trustly::Api::Signed < Trustly::Api
2
+
3
+ attr_accessor :url_path,:api_username, :api_password, :merchant_privatekey, :is_https
4
+
5
+
6
+ def initialize(_options)
7
+ options = {
8
+ :host => 'test.trustly.com',
9
+ :port => 443,
10
+ :is_https => true,
11
+ :private_pem => "#{Rails.root}/certs/trustly/test.acuerdalo.private.pem",
12
+ :public_pem => "#{Rails.root}/certs/trustly/test.trustly.public.pem"
13
+ }.merge(_options)
14
+
15
+
16
+ raise Trustly::Exception::SignatureError, "File '#{options[:private_pem]}' does not exist" unless File.file?(options[:private_pem])
17
+ raise Trustly::Exception::SignatureError, "File '#{options[:public_pem]}' does not exist" unless File.file?(options[:public_pem])
18
+
19
+ super(options[:host],options[:port],options[:is_https],options[:public_pem])
20
+
21
+ self.api_username = options.try(:[],:username)
22
+ self.api_password = options.try(:[],:password)
23
+ self.is_https = options.try(:[],:is_https)
24
+ self.url_path = '/api/1'
25
+
26
+ raise Trustly::Exception::AuthentificationError, "Username not valid" if self.api_username.nil?
27
+ raise Trustly::Exception::AuthentificationError, "Password not valid" if self.api_password.nil?
28
+
29
+ self.load_merchant_privatekey(options[:private_pem])
30
+
31
+ end
32
+
33
+ def load_merchant_privatekey(filename)
34
+ self.merchant_privatekey = OpenSSL::PKey::RSA.new(File.read(filename))
35
+ end
36
+
37
+ def handle_response(request,httpcall)
38
+ response = Trustly::Data::JSONRPCResponse.new(httpcall)
39
+ raise Trustly::Exception::SignatureError,'Incoming message signature is not valid' unless self.verify_trustly_signed_response(response)
40
+ raise Trustly::Exception::DataError, 'Incoming response is not related to request. UUID mismatch.' if response.get_uuid() != request.get_uuid()
41
+ return response
42
+ end
43
+
44
+ def insert_credentials(request)
45
+ request.set_data( 'Username' , self.api_username)
46
+ request.set_data( 'Password' , self.api_password)
47
+ request.set_param('Signature', self.sign_merchant_request(request))
48
+ end
49
+
50
+ def sign_merchant_request(data)
51
+ raise Trustly::Exception::SignatureError, 'No private key has been loaded' if self.merchant_privatekey.nil?
52
+ method = data.get_method()
53
+ method = '' if method.nil?
54
+ uuid = data.get_uuid()
55
+ uuid = '' if uuid.nil?
56
+ data = data.get_data()
57
+ data = {} if data.nil?
58
+
59
+ serial_data = "#{method}#{uuid}#{self.serialize_data(data)}"
60
+ sha1hash = OpenSSL::Digest::SHA1.new
61
+ signature = self.merchant_privatekey.sign(sha1hash,serial_data)
62
+ return Base64.encode64(signature).chop #removes \n
63
+ end
64
+
65
+ def url_path(request=nil)
66
+ return '/api/1'
67
+ end
68
+
69
+ def call_rpc(request)
70
+ request.set_uuid(SecureRandom.uuid) if request.get_uuid().nil?
71
+ return super(request)
72
+ end
73
+
74
+ def void(orderid)
75
+ request = Trustly::Data::JSONRPCRequest.new('Void',{"OrderID"=>orderid},nil)
76
+ return self.call_rpc(request)
77
+ end
78
+
79
+ def deposit(_options)
80
+ options = {
81
+ "Locale" => "es_ES",
82
+ "Country" => "ES",
83
+ "Currency" => "EUR",
84
+ "SuccessURL" => "https://www.trustly.com/success",
85
+ "FailURL" => "https://www.trustly.com/fail",
86
+ "NotificationURL" => "https://test.trustly.com/demo/notifyd_test",
87
+ "Amount" => 0
88
+ }.merge(_options)
89
+
90
+ ["Locale","Country","Currency","SuccessURL","FailURL","Amount","NotificationURL","EndUserID","MessageID"].each do |req_attr|
91
+ raise Trustly::Exception::DataError, "Option not valid '#{req_attr}'" if options.try(:[],req_attr).nil?
92
+ end
93
+
94
+ raise Trustly::Exception::DataError, "Amount is 0" if options["Amount"].nil? || options["Amount"].to_f <= 0.0
95
+
96
+ attributes = options.slice(
97
+ "Locale","Country","Currency",
98
+ "SuggestedMinAmount","SuggestedMaxAmount","Amount",
99
+ "Currency","Country","IP",
100
+ "SuccessURL","FailURL","TemplateURL","URLTarget",
101
+ "MobilePhone","Firstname","Lastname","NationalIdentificationNumber",
102
+ "ShopperStatement"
103
+ )
104
+
105
+ data = options.slice("NotificationURL","EndUserID","MessageID")
106
+
107
+ # check required fields
108
+ request = Trustly::Data::JSONRPCRequest.new('Deposit',data,attributes)
109
+ return self.call_rpc(request)
110
+ #options["HoldNotifications"] = "1" unless
111
+ end
112
+
113
+ def withdraw(_options)
114
+
115
+ end
116
+
117
+ end
@@ -0,0 +1,65 @@
1
+ class Trustly::Data
2
+
3
+ attr_accessor :payload
4
+
5
+ def initialize
6
+ self.payload = {}
7
+ end
8
+ # Vacuum out all keys being set to Nil in the data to be communicated
9
+ def vacumm(data)
10
+ if data.is_a? Array
11
+ ret = []
12
+ data.each do |elem|
13
+ unless elem.nil?
14
+ v = self.vacumm elem
15
+ ret.append(v) unless v.nil?
16
+ end
17
+ end
18
+ return nil if ret.length == 0
19
+ return ret
20
+ elsif data.is_a? Hash
21
+ ret = {}
22
+ data.each do |key,elem|
23
+ unless elem.nil?
24
+ v = self.vacumm elem
25
+ ret[key.to_s] = elem unless v.nil?
26
+ end
27
+ end
28
+ return nil if ret.length == 0
29
+ return ret
30
+ else
31
+ return data
32
+ end
33
+ end
34
+
35
+ def get(name=nil)
36
+ return name.nil? ? self.payload.dup : self.payload.try(:[],name)
37
+ end
38
+
39
+ def get_from(sub,name)
40
+ return nil if sub.nil? || name.nil? || self.payload.try(:[],sub).nil? || self.payload[sub].try(:[],name).nil?
41
+ return self.payload[sub][name]
42
+ end
43
+
44
+ def set(name,value)
45
+ self.payload[name] = value
46
+ return value
47
+ end
48
+
49
+ def set_in(sub,name,value,parent=nil)
50
+ return nil if sub.nil? || name.nil?
51
+ self.payload[sub] = {} if self.payload.try(:[],sub).nil?
52
+ self.payload[sub][name] = value
53
+ end
54
+
55
+ def pop(name)
56
+ v = self.payload.try(:[],name)
57
+ delete self.payload[name] unless v.nil?
58
+ return v
59
+ end
60
+
61
+ def json()
62
+ self.payload.to_json
63
+ end
64
+
65
+ end
@@ -0,0 +1,92 @@
1
+ class Trustly::Data::JSONRPCRequest < Trustly::Data::Request
2
+
3
+ def initialize(method=nil,data=nil,attributes=nil)
4
+
5
+ if !data.nil? || !attributes.nil?
6
+ self.payload = {"params"=>{}}
7
+ unless data.nil?
8
+ if !data.is_a?(Hash) && !attributes.nil?
9
+ raise TypeError, "Data must be a Hash if attributes is provided"
10
+ else
11
+ self.payload["params"]["Data"] = data
12
+ end
13
+ else
14
+ self.payload["params"]["Data"] = {}
15
+ end
16
+
17
+ self.payload["params"]["Data"]["Attributes"] = attributes unless attributes.nil?
18
+ end
19
+
20
+ self.payload['method'] = method unless method.nil?
21
+ self.payload['params'] = {} unless self.get('params')
22
+ self.payload['version'] = '1.1'
23
+
24
+ end
25
+
26
+
27
+ def get_param(name)
28
+ return self.payload['params'].try(:[],name)
29
+ end
30
+
31
+ def get_data(name=nil)
32
+ data = self.get_param('Data')
33
+ return data if name.nil?
34
+ raise KeyError, "Not found #{name} in data" if data.nil?
35
+ return data.dup if name.nil?
36
+ return data.try(:[],name)
37
+ end
38
+
39
+ def get_attribute(name)
40
+ data = self.get_param('Data')
41
+ if data.nil?
42
+ attributes = nil
43
+ else
44
+ attributes = data.try(:[],'Attributes')
45
+ end
46
+ raise KeyError, "Not found 'Attributes' in data" if attributes.nil?
47
+ return attributes.dup if name.nil?
48
+ return attributes.try(:[],name)
49
+ end
50
+
51
+ def set_param(name,value)
52
+ self.payload['params'][name] = value
53
+ end
54
+
55
+ def set_data(name,value)
56
+ unless name.nil?
57
+ self.payload['params']['Data'] = {} if self.payload['params'].try(:[],'Data').nil?
58
+ self.payload['params']['Data'][name] = value
59
+ end
60
+ return value
61
+ end
62
+
63
+ def set_attributes(name,value)
64
+ unless name.nil?
65
+ self.payload['params']['Data'] = {} if self.payload['params'].try(:[],'Data').nil?
66
+ self.payload['params']['Data']['Attributes'] = {} if self.payload['params']['Data'].try(:[],'Attributes').nil?
67
+ self.payload['params']['Data']['Attributes'][name] = value
68
+ end
69
+ return value
70
+ end
71
+
72
+ def set_uuid(uuid)
73
+ return self.set_param('UUID',uuid)
74
+ end
75
+
76
+ def get_uuid
77
+ return self.get_param('UUID')
78
+ rescue KeyError => e
79
+ return nil
80
+ end
81
+
82
+ def set_method(method)
83
+ return self.set('method',method)
84
+ end
85
+
86
+ def get_method()
87
+ return self.get('method')
88
+ rescue KeyError => e
89
+ return nil
90
+ end
91
+
92
+ end
@@ -0,0 +1,15 @@
1
+ class Trustly::Data::JSONRPCResponse < Trustly::Data::Response
2
+
3
+ def initialize(http_response)
4
+ super(http_response)
5
+ version = self.get("version")
6
+ raise Trustly::Exception::JSONRPCVersionError, "JSON RPC Version is not supported" if version != '1.1'
7
+ end
8
+
9
+ def get_data(name=nil)
10
+ return self.response_result.try(:[],"data") if name.nil?
11
+ return Trustly::Exception::DataError, "Data not found or key is null" if self.response_result.try(:[],"data").nil? || name.nil?
12
+ return self.response_result["data"][name]
13
+ end
14
+
15
+ end
@@ -0,0 +1,48 @@
1
+ class Trustly::JSONRPCNotificationRequest < Trustly::Data
2
+
3
+ attr_accessor :notification_body, :payload
4
+
5
+ def initialize(notification_body)
6
+ super
7
+ self.notification_body = notification_body
8
+ begin
9
+ self.payload = JSON.parse(self.notification_body)
10
+ rescue JSON::ParserError => e
11
+ raise Trustly::Exception::DataError, e.message
12
+ end
13
+
14
+ raise Trustly::Exception::JSONRPCVersionError, 'JSON RPC Version #{(self.get_version()} is not supported' if self.get_version() != '1.1'
15
+ end
16
+
17
+ def get_version()
18
+ return self.get('version')
19
+ end
20
+
21
+ def get_method()
22
+ return self.get('method')
23
+ end
24
+
25
+ def get_uuid()
26
+ return self.get_params('uuid')
27
+ end
28
+
29
+ def get_signature()
30
+ return self.get_params('signature')
31
+ end
32
+
33
+ def get_params(name)
34
+ raise KeyError,"#{name} is not present in params" if name.nil? || self.payload.try(:[],"params").nil? || self.payload["params"].try(:[],name).nil?
35
+ return self.payload["params"][name]
36
+ end
37
+
38
+ def get_data(name=nil)
39
+ if name.nil?
40
+ raise KeyError,"Data not present" if self.payload.try(:[],"params").nil? || self.payload["params"].try(:[],"data").nil?
41
+ return self.payload["params"]["data"]
42
+ else
43
+ raise KeyError,"#{name} is not present in data" if name.nil? || self.payload.try(:[],"params").nil? || self.payload["params"].try(:[],"data").nil? || self.payload["params"]["data"].try(:[],name).nil?
44
+ return self.payload["params"]["data"][name]
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,59 @@
1
+ class Trustly::JSONRPCNotificationResponse < Trustly::Data
2
+
3
+ def initialize(request,success=nil)
4
+ super
5
+ uuid = request.get_uuid()
6
+ method = request.get_method()
7
+
8
+ self.set('version')
9
+ self.set_result('uuid',uuid) unless uuid.nil?
10
+ self.set_result('method',method) unless method.nil?
11
+ self.set_data('success', (!success.nil? && !success ? 'FAILED' : 'OK' ))
12
+ end
13
+
14
+ def set_result(name,value)
15
+ return nil if name.nil? || value.nil?
16
+ self.payload["result"] = {} if self.payload.try(:[],"result").nil?
17
+ self.payload["result"][name] = value
18
+ end
19
+
20
+ def set_data(name,value)
21
+ return nil if name.nil? || value.nil?
22
+ self.payload["result"] = {} if self.payload.try(:[],"result").nil?
23
+ self.payload["result"]["data"] = {} if self.payload["result"].try(:[],"data").nil?
24
+ self.payload["result"]["data"][name] = value
25
+ end
26
+
27
+ def get_result(name)
28
+ raise KeyError,"#{name} is not present in result" if name.nil? || self.payload.try(:[],"result").nil? || self.payload["result"].try(:[],name).nil?
29
+ return self.payload["result"][name]
30
+ end
31
+
32
+ def get_data(name=nil)
33
+ raise KeyError,"#{name} is not present in data" if name.nil? || self.payload.try(:[],"result").nil? || self.payload["result"].try(:[],"data").nil? || self.payload["result"]["data"].try(:[],name).nil?
34
+ return self.payload["result"]["data"][name]
35
+ end
36
+
37
+ def get_data(name=nil)
38
+ if name.nil?
39
+ raise KeyError,"Data not present" if self.payload.try(:[],"result").nil? || self.payload["result"].try(:[],"data").nil?
40
+ return self.payload["result"]["data"]
41
+ else
42
+ raise KeyError,"#{name} is not present in data" if name.nil? || self.payload.try(:[],"result").nil? || self.payload["result"].try(:[],"data").nil? || self.payload["result"]["data"].try(:[],name).nil?
43
+ return self.payload["result"]["data"][name]
44
+ end
45
+ end
46
+
47
+ def get_method
48
+ return self.get_result('method')
49
+ end
50
+
51
+ def get_uuid
52
+ return self.get_result('uuid')
53
+ end
54
+
55
+ def get_signature
56
+ return self.get_result('signature')
57
+ end
58
+
59
+ end
@@ -0,0 +1,33 @@
1
+ class Trustly::Data::Request < Trustly::Data
2
+
3
+ attr_accessor :method
4
+
5
+ def initialize(method=nil,payload=nil)
6
+ super
7
+ self.payload = self.vacuum(payload) unless payload.nil?
8
+ unless method.nil?
9
+ self.method = method
10
+ else
11
+ self.method = self.payload.get('method')
12
+ end
13
+ end
14
+
15
+ def get_method
16
+ return self.method
17
+ end
18
+
19
+ def set_method(method)
20
+ self.method = method
21
+ return method
22
+ end
23
+
24
+ def get_uuid
25
+ return self.payload.get('uuid')
26
+ end
27
+
28
+ def set_uuid
29
+ self.set('uuid',uuid)
30
+ return uuid
31
+ end
32
+
33
+ end
@@ -0,0 +1,80 @@
1
+ class Trustly::Data::Response < Trustly::Data
2
+ attr_accessor :response_status, :response_reason, :response_body, :response_result
3
+
4
+ def initialize(http_response) #called from Net::HTTP.get_response("trustly.com","/api_path") -> returns Net::HTTPResponse
5
+ super()
6
+ self.response_status = http_response.code
7
+ self.response_reason = http_response.class.name
8
+ self.response_body = http_response.body
9
+ begin
10
+ self.payload = JSON.parse(self.response_body)
11
+ rescue JSON::ParserError => e
12
+ if self.response_status != 200
13
+ raise Trustly::Exception::ConnectionError, "#{self.response_status}: #{self.response_reason} [#{self.response_body}]"
14
+ else
15
+ raise Trustly::Exception::DataError, e.message
16
+ end
17
+ end
18
+
19
+ begin
20
+ self.response_result = self.get('result')
21
+ rescue IndexError::KeyError => e
22
+ self.response_result = nil
23
+ end
24
+
25
+ if self.response_result.nil?
26
+ begin
27
+ self.response_result = self.payload["error"]["error"]
28
+ rescue IndexError::KeyError => e
29
+ end
30
+ end
31
+ raise Trustly::Exception::DataError, "No result or error in response #{self.payload}" if self.response_result.nil?
32
+ end
33
+
34
+ def error?
35
+ return !self.get('error').nil?
36
+ rescue IndexError::KeyError => e
37
+ return false
38
+ end
39
+
40
+ def error_code
41
+ return nil unless self.error?
42
+ return self.response_result["data"].try(:[],'code')
43
+ end
44
+
45
+ def error_msg
46
+ return nil unless self.error?
47
+ return self.response_result["data"].try(:[],'message')
48
+ end
49
+
50
+ def success?
51
+ return !self.get('result').nil?
52
+ rescue IndexError::KeyError => e
53
+ return false
54
+ end
55
+
56
+ def get_uuid
57
+ return self.response_result.try(:[],'uuid')
58
+ end
59
+
60
+ def get_method
61
+ return self.response_result.try(:[],'method')
62
+ end
63
+
64
+ def get_signature
65
+ return self.response_result.try(:[],"signature")
66
+ end
67
+
68
+ def get_result
69
+ unless name.nil?
70
+ if self.response_result.is_a?(Hash)
71
+ return self.response_result.try(:[],name)
72
+ else
73
+ raise StandardError::TypeError, "Result is not a Hash"
74
+ end
75
+ else
76
+ return self.response_result.dup
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,2 @@
1
+ class Trustly::Exception::AuthentificationError < Exception
2
+ end
@@ -0,0 +1,2 @@
1
+ class Trustly::Exception::ConnectionError < Exception
2
+ end
@@ -0,0 +1,3 @@
1
+ class Trustly::Exception::DataError < Exception
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Trustly::Exception::JSONRPCVersionError < Exception
2
+
3
+ end
@@ -0,0 +1,2 @@
1
+ class Trustly::Exception::SignatureError < Exception
2
+ end
@@ -0,0 +1,3 @@
1
+ module Trustly
2
+ VERSION = "0.0.6"
3
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trustly-client-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - Jorge Carretie
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.0
41
+ description: Support for Ruby use of trustly API
42
+ email: jorge@carretie.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - LICENSE.txt
48
+ - README.md
49
+ - lib/trustly.rb
50
+ - lib/trustly/api.rb
51
+ - lib/trustly/api/signed.rb
52
+ - lib/trustly/data.rb
53
+ - lib/trustly/data/jsonrpc_request.rb
54
+ - lib/trustly/data/jsonrpc_response.rb
55
+ - lib/trustly/data/jsonrpcnotificationrequest.rb
56
+ - lib/trustly/data/jsonrpcnotificationresponse.rb
57
+ - lib/trustly/data/request.rb
58
+ - lib/trustly/data/response.rb
59
+ - lib/trustly/exception/authentification_error.rb
60
+ - lib/trustly/exception/connection_error.rb
61
+ - lib/trustly/exception/data_error.rb
62
+ - lib/trustly/exception/jsonrpc_version_error.rb
63
+ - lib/trustly/exception/signature_error.rb
64
+ - lib/trustly/version.rb
65
+ homepage: https://github.com/jcarreti/trusty-client-ruby
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 2.4.5
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: Trustly Client Ruby Support
89
+ test_files: []