justifi 0.5.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c34231d16ea73027351523d6309369021705f687926de6467fd4e81d1ff122f
4
- data.tar.gz: 8c0009bd8453cf885113b081c3527ce6f074c08b0ba7086ba82348d89f8ce09e
3
+ metadata.gz: bcd2d68a4fce4e0a644aa81c8c65e9e0a11bb31991583379b86b00d5db3f79e2
4
+ data.tar.gz: 5c7edcdb32022a4f56bbd3a688b496d376838dbce1b4528ccb6201e0e2eaddf1
5
5
  SHA512:
6
- metadata.gz: ce6dc69cbc087eaa57536791686380791ba816ef7acebad501ad5f6133567dd37c1475ef0ada32d666282f1d556dae668950fd3806297392b95e42703d6d1c61
7
- data.tar.gz: fff1e3c1f3d49da9dd15a248f43ee1f2330860a7ab0d492bdfd223f1ce80d77c1ea4088511bc577f7ca761c99aeaafd60377ee19bdcb9e97c71716cf2ca76d4c
6
+ metadata.gz: 150f2bb84c5fba3693dbf7d4c6889963809c00314e468845c3c6dbab3a9b2eec6b2b574fde0ab85821c62a9b519b116eddeafc65280dd0cf188e9941ff052bf5
7
+ data.tar.gz: e3612d77657510b4bcadaf8fbe6a316b642a9292f3048a5c7a4925b3d3852f9da8d3a14a58e0f04b1399f50b21ee5dd2d63b9dfd3c4bd62fb4c78b913e99ea7b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- justifi (0.5.0)
4
+ justifi (0.6.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -22,7 +22,7 @@ GEM
22
22
  public_suffix (4.0.7)
23
23
  rainbow (3.1.1)
24
24
  rake (13.0.6)
25
- regexp_parser (2.3.0)
25
+ regexp_parser (2.4.0)
26
26
  repo-small-badge (0.2.7)
27
27
  victor (~> 0.2.8)
28
28
  rexml (3.2.5)
@@ -39,16 +39,16 @@ GEM
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
40
  rspec-support (~> 3.11.0)
41
41
  rspec-support (3.11.0)
42
- rubocop (1.27.0)
42
+ rubocop (1.29.1)
43
43
  parallel (~> 1.10)
44
44
  parser (>= 3.1.0.0)
45
45
  rainbow (>= 2.2.2, < 4.0)
46
46
  regexp_parser (>= 1.8, < 3.0)
47
- rexml
48
- rubocop-ast (>= 1.16.0, < 2.0)
47
+ rexml (>= 3.2.5, < 4.0)
48
+ rubocop-ast (>= 1.17.0, < 2.0)
49
49
  ruby-progressbar (~> 1.7)
50
50
  unicode-display_width (>= 1.4.0, < 3.0)
51
- rubocop-ast (1.17.0)
51
+ rubocop-ast (1.18.0)
52
52
  parser (>= 3.1.1.0)
53
53
  rubocop-performance (1.13.3)
54
54
  rubocop (>= 1.7.0, < 2.0)
@@ -63,8 +63,8 @@ GEM
63
63
  repo-small-badge (~> 0.2.7)
64
64
  simplecov (~> 0.17)
65
65
  simplecov_json_formatter (0.1.4)
66
- standard (1.10.0)
67
- rubocop (= 1.27.0)
66
+ standard (1.12.1)
67
+ rubocop (= 1.29.1)
68
68
  rubocop-performance (= 1.13.3)
69
69
  unicode-display_width (2.1.0)
70
70
  victor (0.2.8)
@@ -89,4 +89,4 @@ DEPENDENCIES
89
89
  webmock (>= 3.8.0)
90
90
 
91
91
  BUNDLED WITH
92
- 2.2.3
92
+ 2.2.15
data/README.md CHANGED
@@ -5,24 +5,15 @@ It includes a pre-defined set of modules and classes that are essentially wrappe
5
5
 
6
6
  ## Installation
7
7
 
8
- From the command line:
9
- ```bash
10
- gem install justifi --version "0.4.0" --source "https://rubygems.pkg.github.com/justifi-tech"
11
- ```
12
- OR
13
-
14
8
  Add these lines to your application's Gemfile:
15
9
 
16
10
  ```ruby
17
- source "https://rubygems.pkg.github.com/justifi-tech" do
18
- gem "justifi", "0.4.0"
19
- end
11
+ gem "justifi"
20
12
  ```
21
13
  And then execute:
22
14
 
23
15
  $ bundle install
24
16
 
25
-
26
17
  ## Setup
27
18
 
28
19
  The gem needs to be configured with your `client_id` and `client_secret` in order to access JustiFi API resources.
@@ -204,6 +195,20 @@ Justifi::PaymentIntent.create(params: payment_intent_params, seller_account_id:
204
195
  Any API resource using the `seller_account_id` variable will include the `Seller-Account` header and be
205
196
  processed as the seller account.
206
197
 
198
+ ## Webhook Signature Verification
199
+
200
+ Webhooks are secured by signature verification. An encrypted header is sent as a POST to your API endpoint (JUSTIFI-SIGNATURE),
201
+ which will need to be decrypted and verified with the signature secret provided.
202
+ You can use the JustiFi Ruby gem to validate the signature.
203
+
204
+ ```ruby
205
+ received_event = { id: "py_..." } # JustiFi webhook event
206
+ signature = "2463896d3cb..." # justifi-signature header
207
+ timestamp = "1651076887..." # justifi-timestamp header
208
+ secret_key = "sigk_2..." # secret key used for this webhook
209
+ Justifi::Webhook.verify_signature(received_event: received_event, timestamp: timestamp, secret_key: secret_key, signature: signature) # valid or not
210
+ ```
211
+
207
212
  ## Contributing
208
213
 
209
214
  ### Release a new version of the gem
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ module BalanceTransaction
5
+ class << self
6
+ def list(params: {}, headers: {}, seller_account_id: nil)
7
+ headers[:seller_account] = seller_account_id if seller_account_id
8
+ JustifiOperations.execute_get_request("/v1/balance_transactions", params, headers)
9
+ end
10
+
11
+ def get(id:, headers: {})
12
+ JustifiOperations.execute_get_request("/v1/balance_transactions/#{id}",
13
+ {},
14
+ headers)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -11,8 +11,8 @@ module Justifi
11
11
  headers: headers)
12
12
  end
13
13
 
14
- def create_refund(amount:, payment_id:, reason: nil, description: nil)
15
- refund_params = {amount: amount, description: description, reason: reason}
14
+ def create_refund(amount:, payment_id:, reason: nil, description: nil, metadata: nil)
15
+ refund_params = {amount: amount, description: description, reason: reason, metadata: metadata}
16
16
  JustifiOperations.idempotently_request("/v1/payments/#{payment_id}/refunds",
17
17
  method: :post,
18
18
  params: refund_params,
data/lib/justifi/util.rb CHANGED
@@ -78,5 +78,12 @@ module Justifi
78
78
  end
79
79
  result
80
80
  end
81
+
82
+ # Creates a computed signature that can verify the payload sent.
83
+ # Each webhook has its own signature key that can be achieved in JustiFi's platform
84
+ def self.compute_signature(received_event, timestamp, secret_key)
85
+ timestamp_payload = "#{timestamp}.#{received_event.to_json}"
86
+ OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret_key, timestamp_payload)
87
+ end
81
88
  end
82
89
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Justifi
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.1"
5
5
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ module Webhook
5
+ class << self
6
+ def verify_signature(received_event:, timestamp:, secret_key:, signature:)
7
+ signature == Util.compute_signature(received_event, timestamp, secret_key)
8
+ end
9
+ end
10
+ end
11
+ end
data/lib/justifi.rb CHANGED
@@ -15,10 +15,12 @@ require "justifi/oauth"
15
15
  require "justifi/payment"
16
16
  require "justifi/refund"
17
17
  require "justifi/payout"
18
+ require "justifi/balance_transaction"
18
19
  require "justifi/dispute"
19
20
  require "justifi/payment_method"
20
21
  require "justifi/payment_intent"
21
22
  require "justifi/in_memory_cache"
23
+ require "justifi/webhook"
22
24
 
23
25
  module Justifi
24
26
  @config = Justifi::Configuration.setup
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: justifi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - JustiFi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-28 00:00:00.000000000 Z
11
+ date: 2022-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -161,6 +161,7 @@ files:
161
161
  - justifi.gemspec
162
162
  - lib/justifi.rb
163
163
  - lib/justifi/api_operations.rb
164
+ - lib/justifi/balance_transaction.rb
164
165
  - lib/justifi/configuration.rb
165
166
  - lib/justifi/dispute.rb
166
167
  - lib/justifi/in_memory_cache.rb
@@ -177,6 +178,7 @@ files:
177
178
  - lib/justifi/refund.rb
178
179
  - lib/justifi/util.rb
179
180
  - lib/justifi/version.rb
181
+ - lib/justifi/webhook.rb
180
182
  homepage: https://justifi.ai
181
183
  licenses: []
182
184
  metadata: