plaid 2.0.0 → 2.1.0
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/CHANGELOG.md +10 -0
- data/README.md +52 -3
- data/lib/plaid.rb +1 -0
- data/lib/plaid/connector.rb +4 -0
- data/lib/plaid/transaction.rb +1 -1
- data/lib/plaid/user.rb +25 -5
- data/lib/plaid/version.rb +1 -1
- data/lib/plaid/webhook.rb +130 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 275751fae8bd5e8b06ab3b12d577fb9287663fbd
|
4
|
+
data.tar.gz: 5b079f65196433ea7edfe0d27e5bcc917d4bc4f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2da99035165898c5634a704a12ee0a47f021df841e33a1172c7503b219a66451b60f6fb1bbf39f6c833ea450eeb00c13d0302dca56a8a3526b60a64126a6e6c
|
7
|
+
data.tar.gz: 53d4916be3b84f6833add1df715fad9de680391d13c4ff46969a1680d276507e46232a513f935d195a9e6515f2fa172a24e9b943c851846e02612caa7cb217ed
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# 2.1.0. 19-Oct-2016
|
2
|
+
|
3
|
+
* Documentation fixes (@ishmael).
|
4
|
+
* Fix `Transaction#to_s` behavior (@michel-tricot).
|
5
|
+
* PATCH `/:product/step` flow.
|
6
|
+
* Use the same client in `User#upgrade` (@betesh).
|
7
|
+
* Webhook object (@zshannon).
|
8
|
+
* `processor_token` access in `User.exchange_token` (@gylaz).
|
9
|
+
* Raise `ServerError` in case server returned an empty response body.
|
10
|
+
|
1
11
|
# 2.0.0. 24-May-2016
|
2
12
|
|
3
13
|
* Use `~> 1.0` spec for multi_json dependency.
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ Configure the gem with your client id, secret, and the environment you would lik
|
|
34
34
|
Plaid.config do |p|
|
35
35
|
p.client_id = '<<< Plaid provided client ID >>>'
|
36
36
|
p.secret = '<<< Plaid provided secret key >>>'
|
37
|
-
p.env = :tartan # or :
|
37
|
+
p.env = :tartan # or :production
|
38
38
|
end
|
39
39
|
```
|
40
40
|
|
@@ -86,7 +86,7 @@ user = Plaid::User.exchange_token('public_token') # bound to :connect product
|
|
86
86
|
With more options:
|
87
87
|
|
88
88
|
```ruby
|
89
|
-
user2 = Plaid::User.exchange_token('public_token', account_id
|
89
|
+
user2 = Plaid::User.exchange_token('public_token', 'account_id', product: :auth)
|
90
90
|
```
|
91
91
|
|
92
92
|
If you want to [move money via Stripe's ACH
|
@@ -210,6 +210,55 @@ ltis = Plaid::LongTailInstitution.all(count: 20, offset: 20) # A page
|
|
210
210
|
res = Plaid::LongTailInstitution.search(query: 'c') # Lookup by name
|
211
211
|
```
|
212
212
|
|
213
|
+
### Webhooks
|
214
|
+
|
215
|
+
You can register to receive [Webhooks](https://plaid.com/docs/api/#webhook) from Plaid when your users have new events. If you do, you'll receive `POST` requests with JSON.
|
216
|
+
|
217
|
+
E.g. Initial Transaction Webhook:
|
218
|
+
```json
|
219
|
+
{
|
220
|
+
"message": "Initial transaction pull finished",
|
221
|
+
"access_token": "xxxxx",
|
222
|
+
"total_transactions": 123,
|
223
|
+
"code": 0
|
224
|
+
}
|
225
|
+
```
|
226
|
+
|
227
|
+
You should parse that JSON into a Ruby Hash with String keys (eg. `webhook_hash = JSON.parse(json_string)`). Then, you can convert that Hash into a Ruby object using `Plaid::Webhook`:
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
webhook = Plaid::Webhook.new(webhook_hash)
|
231
|
+
|
232
|
+
# Was that the Initial Transaction Webhook?
|
233
|
+
webhook.initial_transaction?
|
234
|
+
access_token = webhook.access_token
|
235
|
+
total_transactions = webhook.total_transactions
|
236
|
+
|
237
|
+
# Or did Historical Transactions become available?
|
238
|
+
webhook.historical_transaction?
|
239
|
+
access_token = webhook.access_token
|
240
|
+
total_transactions = webhook.total_transactions
|
241
|
+
|
242
|
+
# Or did Normal Transactions become available?
|
243
|
+
webhook.normal_transaction?
|
244
|
+
access_token = webhook.access_token
|
245
|
+
total_transactions = webhook.total_transactions
|
246
|
+
|
247
|
+
# Or maybe a transaction was removed?
|
248
|
+
webhook.removed_transaction?
|
249
|
+
access_token = webhook.access_token
|
250
|
+
removed_transactions_ids = webhook.removed_transactions_ids
|
251
|
+
|
252
|
+
# Or was the User's Webhook Updated?
|
253
|
+
webhook.user_webhook_updated?
|
254
|
+
access_token = webhook.access_token
|
255
|
+
|
256
|
+
# Otherwise, was it an error?
|
257
|
+
webhook.error_response?
|
258
|
+
# Which error?
|
259
|
+
error = webhook.error
|
260
|
+
```
|
261
|
+
|
213
262
|
### Custom clients
|
214
263
|
|
215
264
|
It's possible to use several Plaid environments and/or credentials in one app by
|
@@ -224,7 +273,7 @@ Plaid.config do |p|
|
|
224
273
|
end
|
225
274
|
|
226
275
|
# Creating a custom client
|
227
|
-
api = Plaid::Client.new(client_id: 'client_id_2', 'secret_2', env: :
|
276
|
+
api = Plaid::Client.new(client_id: 'client_id_2', secret: 'secret_2', env: :production)
|
228
277
|
|
229
278
|
# Tartan user (using default client)
|
230
279
|
user1 = Plaid::User.create(:connect, 'wells', 'plaid_test', 'plaid_good')
|
data/lib/plaid.rb
CHANGED
data/lib/plaid/connector.rb
CHANGED
@@ -95,6 +95,10 @@ module Plaid
|
|
95
95
|
@request = request
|
96
96
|
@response = http.request(@request)
|
97
97
|
|
98
|
+
if @response.body.nil? || @response.body.empty?
|
99
|
+
raise Plaid::ServerError.new(0, 'Server error', 'Try to connect later')
|
100
|
+
end
|
101
|
+
|
98
102
|
# All responses are expected to have a JSON body, so we always parse,
|
99
103
|
# not looking at the status code.
|
100
104
|
@body = MultiJson.load(@response.body)
|
data/lib/plaid/transaction.rb
CHANGED
@@ -110,7 +110,7 @@ module Plaid
|
|
110
110
|
#
|
111
111
|
# Returns a String.
|
112
112
|
def inspect
|
113
|
-
"#<Plaid::Transaction id=#{id.inspect}, account_id=#{
|
113
|
+
"#<Plaid::Transaction id=#{id.inspect}, account_id=#{account_id.inspect}, " \
|
114
114
|
"date=#{date}, amount=#{amount.inspect}, name=#{name.inspect}, " \
|
115
115
|
"pending=#{pending.inspect}>"
|
116
116
|
end
|
data/lib/plaid/user.rb
CHANGED
@@ -7,6 +7,9 @@ module Plaid
|
|
7
7
|
# Public: The access token for authenticated user.
|
8
8
|
attr_reader :access_token
|
9
9
|
|
10
|
+
# Public: The processor token for a given account and authenticated user.
|
11
|
+
attr_reader :processor_token
|
12
|
+
|
10
13
|
# Public: The current product. Provides a context for #update and #delete
|
11
14
|
# calls. See Plaid::PRODUCTS.
|
12
15
|
attr_reader :product
|
@@ -146,7 +149,7 @@ module Plaid
|
|
146
149
|
# access_token - The String access token obtained from Plaid.
|
147
150
|
# response - The Hash response body to parse.
|
148
151
|
# mfa - The Boolean flag indicating that response body
|
149
|
-
#
|
152
|
+
# contains an MFA response.
|
150
153
|
# stripe_token - The String stripe bank account token.
|
151
154
|
# client - The Plaid::Client instance used to connect to the API
|
152
155
|
# (default is to use global Plaid client - Plaid.client).
|
@@ -207,7 +210,13 @@ module Plaid
|
|
207
210
|
payload[:options] = MultiJson.dump(options)
|
208
211
|
end
|
209
212
|
conn = Connector.new(product, :step, auth: true)
|
210
|
-
|
213
|
+
|
214
|
+
# Use PATCH if we are in context of User#update.
|
215
|
+
response = if @mfa_patch
|
216
|
+
conn.patch(payload)
|
217
|
+
else
|
218
|
+
conn.post(payload)
|
219
|
+
end
|
211
220
|
|
212
221
|
@mfa_required = conn.mfa?
|
213
222
|
parse_response(response)
|
@@ -261,8 +270,17 @@ module Plaid
|
|
261
270
|
|
262
271
|
payload[:pin] = pin if pin
|
263
272
|
|
264
|
-
|
265
|
-
|
273
|
+
conn = Connector.new(product, auth: true, client: client)
|
274
|
+
resp = conn.patch(payload)
|
275
|
+
|
276
|
+
if conn.mfa?
|
277
|
+
@mfa_required = true
|
278
|
+
end
|
279
|
+
|
280
|
+
parse_response(resp)
|
281
|
+
|
282
|
+
# A note for User#mfa_step to send PATCH request too
|
283
|
+
@mfa_patch = true
|
266
284
|
|
267
285
|
self
|
268
286
|
end
|
@@ -321,7 +339,7 @@ module Plaid
|
|
321
339
|
response = Connector.new(:upgrade, auth: true, client: client)
|
322
340
|
.post(payload)
|
323
341
|
|
324
|
-
User.new product, response: response
|
342
|
+
User.new product, response: response, client: client
|
325
343
|
end
|
326
344
|
|
327
345
|
# Public: Get the current user tied to another product.
|
@@ -443,6 +461,8 @@ module Plaid
|
|
443
461
|
# Internal: Set up attributes from Add User response.
|
444
462
|
def parse_response(response)
|
445
463
|
@access_token = response['access_token']
|
464
|
+
@processor_token = response['processor_token']
|
465
|
+
|
446
466
|
return parse_mfa_response(response) if mfa?
|
447
467
|
|
448
468
|
@mfa_type = @mfa = nil
|
data/lib/plaid/version.rb
CHANGED
@@ -0,0 +1,130 @@
|
|
1
|
+
module Plaid
|
2
|
+
# Public: Representation of a webhook.
|
3
|
+
class Webhook
|
4
|
+
# Public: The String human readable explanation of this webhook request.
|
5
|
+
# E.g. "Initial transaction pull finished".
|
6
|
+
attr_reader :message
|
7
|
+
|
8
|
+
# Public: The String access token for authenticated user.
|
9
|
+
attr_reader :access_token
|
10
|
+
|
11
|
+
# Public: The Integer number of transactions available in Plaid.
|
12
|
+
# E.g. 124
|
13
|
+
attr_reader :total_transactions
|
14
|
+
|
15
|
+
# Public: The Integer code denoting the type of webhook this is. E.g. 0
|
16
|
+
attr_reader :code
|
17
|
+
|
18
|
+
# Public: Initialize a Webhook instance.
|
19
|
+
#
|
20
|
+
# fields - The Hash with fields.
|
21
|
+
def initialize(fields)
|
22
|
+
@message = fields['message']
|
23
|
+
@access_token = fields['access_token']
|
24
|
+
@total_transactions = fields['total_transactions']
|
25
|
+
@code = fields['code']
|
26
|
+
# present only for Removed Transaction Webhook
|
27
|
+
@removed_transactions = fields['removed_transactions']
|
28
|
+
# present only for Error Response Webhook
|
29
|
+
@resolve = fields['resolve']
|
30
|
+
end
|
31
|
+
|
32
|
+
# Public: Share the type of Webhook this is from its code
|
33
|
+
#
|
34
|
+
# Returns String webhook type
|
35
|
+
def type
|
36
|
+
Webhook::CODEX[code] || 'ERROR_RESPONSE'
|
37
|
+
end
|
38
|
+
|
39
|
+
# Public: Detect if the webhook is Initial Transaction Webhook. Occurs
|
40
|
+
# once the initial transaction pull has finished.
|
41
|
+
#
|
42
|
+
# Returns true if it is.
|
43
|
+
def initial_transaction?
|
44
|
+
code == Webhook::INITIAL_TRANSACTION
|
45
|
+
end
|
46
|
+
|
47
|
+
# Public: Detect if the webhook is Historical Transaction Webhook. Occurs
|
48
|
+
# once the historical transaction pull has completed, shortly after the
|
49
|
+
# initial transaction pull.
|
50
|
+
#
|
51
|
+
# Returns true if it is.
|
52
|
+
def historical_transaction?
|
53
|
+
code == Webhook::HISTORICAL_TRANSACTION
|
54
|
+
end
|
55
|
+
|
56
|
+
# Public: Detect if the webhook is Normal Transaction Webhook. Occurs at
|
57
|
+
# set intervals throughout the day as data is updated from the financial
|
58
|
+
# institutions.
|
59
|
+
#
|
60
|
+
# Returns true if it is.
|
61
|
+
def normal_transaction?
|
62
|
+
code == Webhook::NORMAL_TRANSACTION
|
63
|
+
end
|
64
|
+
|
65
|
+
# Public: Detect if the webhook is Removed Transaction Webhook. Occurs when
|
66
|
+
# transactions have been removed from our system.
|
67
|
+
#
|
68
|
+
# Returns true if it is.
|
69
|
+
def removed_transaction?
|
70
|
+
code == Webhook::REMOVED_TRANSACTION
|
71
|
+
end
|
72
|
+
|
73
|
+
# Public: Detect if the webhook is User's Webhook Updated. Occurs when an
|
74
|
+
# user's webhook is updated via a PATCH request without credentials.
|
75
|
+
#
|
76
|
+
# Returns true if it is.
|
77
|
+
def user_webhook_updated?
|
78
|
+
code == Webhook::USER_WEBHOOK_UPDATED
|
79
|
+
end
|
80
|
+
|
81
|
+
# Public: Detect if the webhook is Error Response Webhook. Triggered when
|
82
|
+
# an error has occurred. Includes the relevant Plaid error code with
|
83
|
+
# details on both the error type and steps for error resolution.
|
84
|
+
#
|
85
|
+
# Returns true if it is.
|
86
|
+
def error_response?
|
87
|
+
Webhook::CODEX[code].nil?
|
88
|
+
end
|
89
|
+
|
90
|
+
# Public: Get transaction IDs that were removed.
|
91
|
+
#
|
92
|
+
# Returns Array[String] or nil
|
93
|
+
def removed_transactions_ids
|
94
|
+
@removed_transactions
|
95
|
+
end
|
96
|
+
|
97
|
+
# Public: Get a Plaid::Error instance if this is an Error Response Webhook
|
98
|
+
#
|
99
|
+
# Returns Plaid::Error or nil
|
100
|
+
def error
|
101
|
+
if error_response?
|
102
|
+
Plaid::PlaidError.new @code, @message, @resolve
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Public: Get a String representation of the transaction.
|
107
|
+
#
|
108
|
+
# Returns a String.
|
109
|
+
def inspect
|
110
|
+
"#<Plaid::Webhook type=#{type.inspect} code=#{code.inspect}, access_token=#{access_token.inspect}, " \
|
111
|
+
"total_transactions=#{total_transactions.inspect}, message=#{message.inspect}>"
|
112
|
+
end
|
113
|
+
|
114
|
+
# Public: Get a String representation of the transaction.
|
115
|
+
#
|
116
|
+
# Returns a String.
|
117
|
+
alias to_s inspect
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
Webhook::ERROR_RESPONSE = -1
|
122
|
+
codex = {}
|
123
|
+
['initial transaction', 'historical transaction', 'normal transaction', 'removed transaction', 'user webhook updated'].each_with_index do |event, idx|
|
124
|
+
name = event.split.map(&:upcase).join('_')
|
125
|
+
codex[idx + 1] = name
|
126
|
+
const_set name, idx + 1
|
127
|
+
end
|
128
|
+
CODEX = codex.freeze
|
129
|
+
end
|
130
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plaid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Dashevskii
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- lib/plaid/transaction.rb
|
139
139
|
- lib/plaid/user.rb
|
140
140
|
- lib/plaid/version.rb
|
141
|
+
- lib/plaid/webhook.rb
|
141
142
|
- plaid.gemspec
|
142
143
|
homepage: https://github.com/plaid/plaid-ruby
|
143
144
|
licenses:
|
@@ -159,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
160
|
version: '0'
|
160
161
|
requirements: []
|
161
162
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.5.1
|
163
|
+
rubygems_version: 2.4.5.1
|
163
164
|
signing_key:
|
164
165
|
specification_version: 4
|
165
166
|
summary: Ruby bindings for Plaid
|