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 +7 -0
- data/lib/broke.rb +51 -0
- data/lib/broke/charge.rb +24 -0
- data/lib/broke/pingback.rb +197 -0
- data/lib/broke/subscription.rb +16 -0
- metadata +75 -0
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'
|
data/lib/broke/charge.rb
ADDED
@@ -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: []
|