broke 0.1.1

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: 4d5952063ed7ee816901a359f848d4a7367cf958
4
+ data.tar.gz: 95971d9aa1f4cb9341f3a485549daf4dcb023f74
5
+ SHA512:
6
+ metadata.gz: 3c9ba2b289f7d4b0a1fced74e1e2dbc0455c4c263f0ba56e90dd0e4c66e525066ce1b68cd255b53731d174227ff30dc11b1a0152998627bd657177c16a544b0f
7
+ data.tar.gz: 39d3509f0586c1d1279adf0189dbdebe1e3425a4fc5e45f380d9771f872ccccfeccb984ef781af461d83218837dc540128d38cbe5adf9996e349f4a914f12a91
data/lib/broke.rb ADDED
@@ -0,0 +1,51 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+
4
+ class Broke
5
+
6
+ class << self
7
+ attr_accessor :api_key
8
+ end
9
+
10
+ def initialize api_key
11
+ @@api_key = api_key
12
+ @@conn = Faraday.new(:url => 'https://api.paymentwall.com/api') do |conn|
13
+ conn.request :url_encoded
14
+ conn.response :json, :content_type => 'application/json'
15
+ conn.adapter Faraday.default_adapter
16
+ end
17
+ end
18
+
19
+ def charge
20
+ Charge.new
21
+ end
22
+
23
+ def subscription
24
+ Subscription.new
25
+ end
26
+
27
+ def pingback
28
+ Pingback
29
+ end
30
+
31
+ private
32
+
33
+ def get path
34
+ @@conn.get do |req|
35
+ req.headers['X-ApiKey'] = @@api_key
36
+ req.url path
37
+ end
38
+ end
39
+
40
+ def post path, params
41
+ @@conn.post do |req|
42
+ req.headers['X-ApiKey'] = @@api_key
43
+ req.url path
44
+ req.body = params
45
+ end
46
+ end
47
+ end
48
+
49
+ require 'broke/subscription'
50
+ require 'broke/charge'
51
+ require 'broke/pingback'
@@ -0,0 +1,24 @@
1
+ class Broke::Charge < Broke
2
+
3
+ def initialize; end
4
+
5
+ def create params
6
+ post 'brick/charge', params
7
+ end
8
+
9
+ def details charge_id
10
+ get "brick/charge/#{charge_id}"
11
+ end
12
+
13
+ def refund charge_id
14
+ get "brick/charge/#{charge_id}/refund"
15
+ end
16
+
17
+ def capture charge_id
18
+ get "brick/charge/#{charge_id}/capture"
19
+ end
20
+
21
+ def void charge_id
22
+ get "brick/charge/#{charge_id}/void"
23
+ end
24
+ end
@@ -0,0 +1,197 @@
1
+ class Broke::Pingback < Broke
2
+
3
+ PINGBACK_TYPE_REGULAR = 0
4
+ PINGBACK_TYPE_GOODWILL = 1
5
+ PINGBACK_TYPE_NEGATIVE = 2
6
+
7
+ def initialize(parameters = {}, ipAddress = '')
8
+ @parameters = parameters
9
+ @ipAddress = ipAddress
10
+ end
11
+
12
+ def validate(skipIpWhitelistCheck = false)
13
+ validated = false
14
+
15
+ if self.isParametersValid()
16
+ if self.isIpAddressValid() || skipIpWhitelistCheck
17
+ if self.isSignatureValid()
18
+ validated = true
19
+ else
20
+ self.appendToErrors('Wrong signature')
21
+ end
22
+ else
23
+ self.appendToErrors('IP address is not whitelisted')
24
+ end
25
+ else
26
+ self.appendToErrors('Missing parameters')
27
+ end
28
+
29
+ validated
30
+ end
31
+
32
+ def isSignatureValid()
33
+ signatureParamsToSign = {}
34
+
35
+ if self.class::getApiType() == self.class::API_VC
36
+ signatureParams = Array['uid', 'currency', 'type', 'ref']
37
+ elsif self.class::getApiType() == self.class::API_GOODS
38
+ signatureParams = Array['uid', 'goodsid', 'slength', 'speriod', 'type', 'ref']
39
+ else
40
+ signatureParams = Array['uid', 'goodsid', 'type', 'ref']
41
+ @parameters['sign_version'] = self.class::SIGNATURE_VERSION_2
42
+
43
+ end
44
+
45
+ if !@parameters.include?('sign_version') || @parameters['sign_version'].to_i == self.class::SIGNATURE_VERSION_1
46
+ signatureParams.each do |field|
47
+ signatureParamsToSign[field] = @parameters.include?(field) ? @parameters[field] : nil
48
+ end
49
+
50
+ @parameters['sign_version'] = self.class::SIGNATURE_VERSION_1
51
+
52
+ else
53
+ signatureParamsToSign = @parameters
54
+ end
55
+
56
+ signatureCalculated = self.calculateSignature(signatureParamsToSign, self.class::api_key, @parameters['sign_version'])
57
+
58
+ signature = @parameters.include?('sig') ? @parameters['sig'] : nil
59
+
60
+ signature == signatureCalculated
61
+ end
62
+
63
+ def isIpAddressValid()
64
+ ipsWhitelist = [
65
+ '174.36.92.186',
66
+ '174.36.96.66',
67
+ '174.36.92.187',
68
+ '174.36.92.192',
69
+ '174.37.14.28'
70
+ ]
71
+
72
+ ipsWhitelist.include? @ipAddress
73
+ end
74
+
75
+ def isParametersValid()
76
+ errorsNumber = 0
77
+ requiredParams = []
78
+
79
+ if self.class::getApiType() == self.class::API_VC
80
+ requiredParams = ['uid', 'currency', 'type', 'ref', 'sig']
81
+ elsif self.class::getApiType() == self.class::API_GOODS
82
+ requiredParams = ['uid', 'goodsid', 'type', 'ref', 'sig']
83
+ else
84
+ requiredParams = ['uid', 'goodsid', 'type', 'ref', 'sig']
85
+ end
86
+
87
+ requiredParams.each do |field|
88
+ if !@parameters.include?(field) # || $parameters[field] === ''
89
+ self.appendToErrors("Parameter #{field} is missing")
90
+ errorsNumber += 1
91
+ end
92
+ end
93
+
94
+ errorsNumber == 0
95
+ end
96
+
97
+ def getParameter(param)
98
+ if @parameters.include?(param)
99
+ return @parameters[param]
100
+ else
101
+ return nil
102
+ end
103
+ end
104
+
105
+ def getType()
106
+ pingbackTypes = [
107
+ self.class::PINGBACK_TYPE_REGULAR,
108
+ self.class::PINGBACK_TYPE_GOODWILL,
109
+ self.class::PINGBACK_TYPE_NEGATIVE
110
+ ]
111
+
112
+ if @parameters.include?('type')
113
+ if pingbackTypes.include?(@parameters['type'].to_i)
114
+ return @parameters['type'].to_i
115
+ end
116
+ end
117
+
118
+ return nil
119
+ end
120
+
121
+ def getUserId
122
+ self.getParameter('uid').to_s
123
+ end
124
+
125
+ def getVirtualCurrencyAmount()
126
+ self.getParameter('currency').to_i
127
+ end
128
+
129
+ def getProductId()
130
+ self.getParameter('goodsid').to_s
131
+ end
132
+
133
+ def getProductPeriodLength()
134
+ self.getParameter('slength').to_i
135
+ end
136
+
137
+ def getProductPeriodType()
138
+ self.getParameter('speriod').to_s
139
+ end
140
+
141
+ def getReferenceId()
142
+ self.getParameter('ref').to_s
143
+ end
144
+
145
+ def getPingbackUniqueId()
146
+ self.getReferenceId().to_s + '_' + self.getType().to_s
147
+ end
148
+
149
+ def isDeliverable()
150
+ self.getType() == self.class::PINGBACK_TYPE_REGULAR || self.getType() == self.class::PINGBACK_TYPE_GOODWILL
151
+ end
152
+
153
+ def isCancelable()
154
+ self.getType() == self.class::PINGBACK_TYPE_NEGATIVE
155
+ end
156
+
157
+ protected
158
+
159
+ def calculateSignature(params, secret, version)
160
+
161
+ params = params.clone
162
+ params.delete('sig')
163
+
164
+ sortKeys = (version.to_i == self.class::SIGNATURE_VERSION_2 or version.to_i == self.class::SIGNATURE_VERSION_3)
165
+ keys = sortKeys ? params.keys.sort : params.keys
166
+
167
+ baseString = ''
168
+
169
+ keys.each do |name|
170
+ p = params[name]
171
+
172
+ # converting array to hash
173
+ if p.kind_of?(Array)
174
+ p = Hash[p.map.with_index { |key, value| [value, key] }]
175
+ end
176
+
177
+ if p.kind_of?(Hash)
178
+ subKeys = sortKeys ? p.keys.sort : p.keys;
179
+ subKeys.each do |key|
180
+ value = p[key]
181
+ baseString += "#{name}[#{key}]=#{value}"
182
+ end
183
+ else
184
+ baseString += "#{name}=#{p}"
185
+ end
186
+ end
187
+
188
+ baseString += secret
189
+
190
+ require 'digest'
191
+ if version.to_i == self.class::SIGNATURE_VERSION_3
192
+ return Digest::SHA256.hexdigest(baseString)
193
+ else
194
+ return Digest::MD5.hexdigest(baseString)
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,16 @@
1
+ class Broke::Subscription < Broke
2
+
3
+ def initialize; end
4
+
5
+ def create params
6
+ post 'brick/subscription', params
7
+ end
8
+
9
+ def details subscription_id
10
+ get "brick/subscription/#{subscription_id}"
11
+ end
12
+
13
+ def cancel subscription_id
14
+ get "brick/subscription/#{subscription_id}/cancel"
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: broke
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Youssef Kababe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.1
41
+ description: Simple Ruby library to interact with Paymentwall's Brick API
42
+ email: hello@youssefkababe.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/broke.rb
48
+ - lib/broke/charge.rb
49
+ - lib/broke/pingback.rb
50
+ - lib/broke/subscription.rb
51
+ homepage: https://github.com/YoussefKababe/broke
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.4.6
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: Paymentwall's Brick API Ruby library
75
+ test_files: []