trustly-client-ruby 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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: []