spook_and_pay 1.0.0 → 1.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 +4 -4
- data/lib/spook_and_pay/adapters/braintree.rb +25 -3
- data/lib/spook_and_pay/providers/braintree.rb +48 -24
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eea62b53ebc042a14887a5437eefcb88a0faceda
|
4
|
+
data.tar.gz: aac44773d4119dd8452f30b22a5fbfc245eccf84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa7557c8bfd51c9078afa0832fbbf710678a2b97b88d7f8cbdd33a2dd7ae56b487ae200acdf4ca09f024cd361c94f42c11528393aef9608c12d6bc918d22f54f
|
7
|
+
data.tar.gz: fe08f81b8f355f1889a5453d614c646cf6e4aca6ffec54cd93793c05a9c63a00c6943401fd7b82eb36e987ca09921fe9921ebf048dea2bd3e55de37086726182
|
@@ -8,7 +8,7 @@ module SpookAndPay
|
|
8
8
|
# accessed externally, but is put here for debugging etc.
|
9
9
|
attr_reader :gateway
|
10
10
|
|
11
|
-
# Constructs an instance of the Braintree gateway which it then acts as
|
11
|
+
# Constructs an instance of the Braintree gateway which it then acts as
|
12
12
|
# a proxy to.
|
13
13
|
#
|
14
14
|
# @param [:development, :test, :production] environment
|
@@ -55,7 +55,7 @@ module SpookAndPay
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
# Generates the hash and query string that needs to be embedded inside
|
58
|
+
# Generates the hash and query string that needs to be embedded inside
|
59
59
|
# of a form in order to interact with Braintree's transparent redirect.
|
60
60
|
#
|
61
61
|
# @param Hash data
|
@@ -65,7 +65,7 @@ module SpookAndPay
|
|
65
65
|
gateway.transparent_redirect.transaction_data(data)
|
66
66
|
end
|
67
67
|
|
68
|
-
# Used to confirm the submission of purchase or authorize transactions
|
68
|
+
# Used to confirm the submission of purchase or authorize transactions
|
69
69
|
# via transparent redirect.
|
70
70
|
#
|
71
71
|
# @param String query_string
|
@@ -82,6 +82,19 @@ module SpookAndPay
|
|
82
82
|
gateway.transaction.submit_for_settlement(id)
|
83
83
|
end
|
84
84
|
|
85
|
+
# Makes a purchase using a credit token.
|
86
|
+
#
|
87
|
+
# @param String id
|
88
|
+
# @param Number amount
|
89
|
+
# @return [Braintree::SuccessfulResult, Braintree::ErrorResult]
|
90
|
+
def credit_card_purchase(id, amount)
|
91
|
+
gateway.transaction.sale(
|
92
|
+
:payment_method_token => id,
|
93
|
+
:amount => amount,
|
94
|
+
:options => {:submit_for_settlement => true}
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
85
98
|
# Refunds the funds in a settled transaction.
|
86
99
|
#
|
87
100
|
# @param String id
|
@@ -90,6 +103,15 @@ module SpookAndPay
|
|
90
103
|
gateway.transaction.refund(id)
|
91
104
|
end
|
92
105
|
|
106
|
+
# Partially refunds the funds in a settled transaction.
|
107
|
+
#
|
108
|
+
# @param String id
|
109
|
+
# @param Float amount
|
110
|
+
# @return [Braintree::SuccessfulResult, Braintree::ErrorResult]
|
111
|
+
def partially_refund(id, amount)
|
112
|
+
gateway.transaction.refund(id, amount)
|
113
|
+
end
|
114
|
+
|
93
115
|
# Voids a transaction.
|
94
116
|
#
|
95
117
|
# @param String id
|
@@ -17,8 +17,8 @@ module SpookAndPay
|
|
17
17
|
# @option config String :private_key
|
18
18
|
def initialize(env, config)
|
19
19
|
@adapter = SpookAndPay::Adapters::Braintree.new(
|
20
|
-
env,
|
21
|
-
config[:merchant_id],
|
20
|
+
env,
|
21
|
+
config[:merchant_id],
|
22
22
|
config[:public_key],
|
23
23
|
config[:private_key]
|
24
24
|
)
|
@@ -26,11 +26,11 @@ module SpookAndPay
|
|
26
26
|
super(env, config)
|
27
27
|
end
|
28
28
|
|
29
|
-
# Braintree specific version of this method. Can be used to either
|
30
|
-
# authorize a payment — and capture it later — or submit a payment for
|
29
|
+
# Braintree specific version of this method. Can be used to either
|
30
|
+
# authorize a payment — and capture it later — or submit a payment for
|
31
31
|
# settlement immediately. This is done via the type param.
|
32
32
|
#
|
33
|
-
# Because Braintree accepts payment details and processes payment in a
|
33
|
+
# Because Braintree accepts payment details and processes payment in a
|
34
34
|
# single step, this method must also be provided with an amount.
|
35
35
|
#
|
36
36
|
# @param String redirect_url
|
@@ -70,9 +70,9 @@ module SpookAndPay
|
|
70
70
|
case result
|
71
71
|
when ::Braintree::SuccessfulResult
|
72
72
|
SpookAndPay::Result.new(
|
73
|
-
true,
|
73
|
+
true,
|
74
74
|
result,
|
75
|
-
:credit_card => extract_credit_card(result.transaction.credit_card_details, true, false),
|
75
|
+
:credit_card => extract_credit_card(result.transaction.credit_card_details, true, false),
|
76
76
|
:transaction => extract_transaction(result.transaction)
|
77
77
|
)
|
78
78
|
when ::Braintree::ErrorResult
|
@@ -97,6 +97,11 @@ module SpookAndPay
|
|
97
97
|
extract_credit_card(result.credit_card_details, true, false)
|
98
98
|
end
|
99
99
|
|
100
|
+
def purchase_via_credit_card(id, amount)
|
101
|
+
result = adapter.credit_card_purchase(credit_card_id(id), amount)
|
102
|
+
generate_result(result)
|
103
|
+
end
|
104
|
+
|
100
105
|
def transaction(id)
|
101
106
|
result = adapter.transaction(id)
|
102
107
|
extract_transaction(result) if result
|
@@ -112,6 +117,11 @@ module SpookAndPay
|
|
112
117
|
generate_result(result)
|
113
118
|
end
|
114
119
|
|
120
|
+
def partially_refund_transaction(id, amount)
|
121
|
+
result = adapter.partially_refund(transaction_id(id), amount)
|
122
|
+
generate_result(result)
|
123
|
+
end
|
124
|
+
|
115
125
|
def void_transaction(id)
|
116
126
|
result = adapter.void(transaction_id(id))
|
117
127
|
generate_result(result)
|
@@ -119,12 +129,12 @@ module SpookAndPay
|
|
119
129
|
|
120
130
|
private
|
121
131
|
|
122
|
-
# Maps the error codes returned by Braintree to a triple of target, type
|
132
|
+
# Maps the error codes returned by Braintree to a triple of target, type
|
123
133
|
# and field used by the SubmissionError class.
|
124
134
|
#
|
125
135
|
# The key is the error code from Braintree. The first entry in the triple
|
126
|
-
# is the specific portion of the transaction that has the error. The
|
127
|
-
# second is the type of error and the third is the field — if any — it
|
136
|
+
# is the specific portion of the transaction that has the error. The
|
137
|
+
# second is the type of error and the third is the field — if any — it
|
128
138
|
# applies to.
|
129
139
|
ERROR_CODE_MAPPING = {
|
130
140
|
"81715" => [:credit_card, :invalid, :number],
|
@@ -147,7 +157,7 @@ module SpookAndPay
|
|
147
157
|
def extract_errors(result)
|
148
158
|
result.errors.map do |e|
|
149
159
|
mapping = ERROR_CODE_MAPPING[e.code]
|
150
|
-
if mapping
|
160
|
+
if mapping
|
151
161
|
SubmissionError.new(*mapping, e)
|
152
162
|
else
|
153
163
|
SubmissionError.new(:unknown, :unknown, :unknown, e)
|
@@ -155,7 +165,7 @@ module SpookAndPay
|
|
155
165
|
end
|
156
166
|
end
|
157
167
|
|
158
|
-
# A generic method for generating results on actions. It doesn't capture
|
168
|
+
# A generic method for generating results on actions. It doesn't capture
|
159
169
|
# anything action specific i.e. it might need to be replaced later.
|
160
170
|
#
|
161
171
|
# @param [Braintree::SuccessfulResult, Braintree:ErrorResult] result
|
@@ -164,22 +174,22 @@ module SpookAndPay
|
|
164
174
|
case result
|
165
175
|
when ::Braintree::SuccessfulResult
|
166
176
|
SpookAndPay::Result.new(
|
167
|
-
true,
|
168
|
-
result,
|
169
|
-
:credit_card => extract_credit_card(result.transaction.credit_card_details, true, false),
|
177
|
+
true,
|
178
|
+
result,
|
179
|
+
:credit_card => extract_credit_card(result.transaction.credit_card_details, true, false),
|
170
180
|
:transaction => extract_transaction(result.transaction)
|
171
181
|
)
|
172
182
|
when ::Braintree::ErrorResult
|
173
183
|
SpookAndPay::Result.new(
|
174
|
-
false,
|
175
|
-
result,
|
184
|
+
false,
|
185
|
+
result,
|
176
186
|
:errors => extract_errors(result)
|
177
187
|
)
|
178
188
|
end
|
179
189
|
end
|
180
190
|
|
181
191
|
# Extracts credit card details from a payload extracted from a result.
|
182
|
-
# It could be either a Hash, Braintree::CreditCard or
|
192
|
+
# It could be either a Hash, Braintree::CreditCard or
|
183
193
|
# Braintree::Transaction::CreditCardDetails. BOO!
|
184
194
|
#
|
185
195
|
# @param [Hash, Braintree::CreditCard, Braintree::Transaction::CreditCardDetails] card
|
@@ -190,14 +200,16 @@ module SpookAndPay
|
|
190
200
|
# @todo figure out validity and expiry ourselves
|
191
201
|
def extract_credit_card(card, valid, expired)
|
192
202
|
opts = case card
|
193
|
-
when Hash
|
203
|
+
when Hash
|
194
204
|
{
|
195
205
|
:token => card[:token],
|
196
206
|
:card_type => card[:card_type],
|
197
207
|
:number => card[:last_4],
|
198
208
|
:name => card[:cardholder_name],
|
199
209
|
:expiration_month => card[:expiration_month],
|
200
|
-
:expiration_year => card[:expiration_year]
|
210
|
+
:expiration_year => card[:expiration_year],
|
211
|
+
:expired => card_expired?(card[:expiration_month].to_i, card[:expiration_year].to_i),
|
212
|
+
:valid => true # We have to assume it's valid, since BT won't say
|
201
213
|
}
|
202
214
|
else
|
203
215
|
{
|
@@ -206,14 +218,26 @@ module SpookAndPay
|
|
206
218
|
:number => card.last_4,
|
207
219
|
:name => card.cardholder_name,
|
208
220
|
:expiration_month => card.expiration_month,
|
209
|
-
:expiration_year => card.expiration_year
|
221
|
+
:expiration_year => card.expiration_year,
|
222
|
+
:expired => card_expired?(card.expiration_month.to_i, card.expiration_year.to_i),
|
223
|
+
:valid => true # We have to assume it's valid, since BT won't say
|
210
224
|
}
|
211
225
|
end
|
212
226
|
|
213
227
|
SpookAndPay::CreditCard.new(self, opts.delete(:token), opts)
|
214
228
|
end
|
215
229
|
|
216
|
-
#
|
230
|
+
# Checks to see if a credit card has expired.
|
231
|
+
#
|
232
|
+
# @param Number month
|
233
|
+
# @param Number year
|
234
|
+
# @return [true, false]
|
235
|
+
def card_expired?(month, year)
|
236
|
+
now = Time.now
|
237
|
+
year < now.year or (year == now.year and month < now.month)
|
238
|
+
end
|
239
|
+
|
240
|
+
# Extracts transaction details from whatever payload is passed in. This
|
217
241
|
# might be Hash or a Braintree:Transaction.
|
218
242
|
#
|
219
243
|
# @param [Hash, Braintree::Transaction] result
|
@@ -233,7 +257,7 @@ module SpookAndPay
|
|
233
257
|
:type => result[:type].to_sym,
|
234
258
|
:created_at => result[:created_at],
|
235
259
|
:amount => result[:amount]
|
236
|
-
)
|
260
|
+
)
|
237
261
|
else
|
238
262
|
SpookAndPay::Transaction.new(
|
239
263
|
self,
|
@@ -243,7 +267,7 @@ module SpookAndPay
|
|
243
267
|
:type => result.type.to_sym,
|
244
268
|
:created_at => result.created_at,
|
245
269
|
:amount => result.amount
|
246
|
-
)
|
270
|
+
)
|
247
271
|
end
|
248
272
|
end
|
249
273
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spook_and_pay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Sutton
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-09-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: braintree
|