broke 0.1.1

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: 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: []