tylerhunt-remit 0.0.1 → 0.0.4

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.
Files changed (48) hide show
  1. data/LICENSE +1 -1
  2. data/README.markdown +91 -0
  3. data/lib/remit.rb +51 -41
  4. data/lib/remit/common.rb +16 -16
  5. data/lib/remit/data_types.rb +59 -2
  6. data/lib/remit/error_codes.rb +118 -0
  7. data/lib/remit/get_pipeline.rb +65 -7
  8. data/lib/remit/ipn_request.rb +49 -0
  9. data/lib/remit/{cancel_token.rb → operations/cancel_token.rb} +1 -1
  10. data/lib/remit/{discard_results.rb → operations/discard_results.rb} +1 -1
  11. data/lib/remit/{fund_prepaid.rb → operations/fund_prepaid.rb} +6 -6
  12. data/lib/remit/{get_account_activity.rb → operations/get_account_activity.rb} +1 -1
  13. data/lib/remit/{get_account_balance.rb → operations/get_account_balance.rb} +0 -0
  14. data/lib/remit/{get_all_credit_instruments.rb → operations/get_all_credit_instruments.rb} +0 -0
  15. data/lib/remit/{get_all_prepaid_instruments.rb → operations/get_all_prepaid_instruments.rb} +0 -0
  16. data/lib/remit/{get_debt_balance.rb → operations/get_debt_balance.rb} +1 -1
  17. data/lib/remit/{get_outstanding_debt_balance.rb → operations/get_outstanding_debt_balance.rb} +0 -0
  18. data/lib/remit/{get_payment_instruction.rb → operations/get_payment_instruction.rb} +1 -1
  19. data/lib/remit/{get_prepaid_balance.rb → operations/get_prepaid_balance.rb} +1 -1
  20. data/lib/remit/{get_results.rb → operations/get_results.rb} +4 -3
  21. data/lib/remit/{get_token_by_caller.rb → operations/get_token_by_caller.rb} +0 -0
  22. data/lib/remit/{get_token_usage.rb → operations/get_token_usage.rb} +1 -1
  23. data/lib/remit/{get_tokens.rb → operations/get_tokens.rb} +0 -0
  24. data/lib/remit/{get_total_prepaid_liability.rb → operations/get_total_prepaid_liability.rb} +0 -0
  25. data/lib/remit/{get_transaction.rb → operations/get_transaction.rb} +1 -1
  26. data/lib/remit/{install_payment_instruction.rb → operations/install_payment_instruction.rb} +3 -3
  27. data/lib/remit/operations/pay.rb +35 -0
  28. data/lib/remit/{refund.rb → operations/refund.rb} +6 -8
  29. data/lib/remit/{reserve.rb → operations/reserve.rb} +6 -6
  30. data/lib/remit/{retry_transaction.rb → operations/retry_transaction.rb} +1 -1
  31. data/lib/remit/{settle.rb → operations/settle.rb} +2 -2
  32. data/lib/remit/{settle_debt.rb → operations/settle_debt.rb} +6 -6
  33. data/lib/remit/{subscribe_for_caller_notification.rb → operations/subscribe_for_caller_notification.rb} +2 -2
  34. data/lib/remit/{unsubscribe_for_caller_notification.rb → operations/unsubscribe_for_caller_notification.rb} +1 -1
  35. data/lib/remit/{write_off_debt.rb → operations/write_off_debt.rb} +4 -4
  36. data/lib/remit/pipeline_response.rb +52 -0
  37. data/spec/{get_account_activity_spec.rb → integrations/get_account_activity_spec.rb} +4 -4
  38. data/spec/{get_tokens_spec.rb → integrations/get_tokens_spec.rb} +3 -3
  39. data/spec/integrations/integrations_helper.rb +8 -0
  40. data/spec/spec_helper.rb +20 -10
  41. data/spec/{get_pipeline_spec.rb → units/get_pipeline_spec.rb} +83 -24
  42. data/spec/units/get_results_spec.rb +49 -0
  43. data/spec/units/ipn_request_spec.rb +32 -0
  44. data/spec/units/pay_spec.rb +133 -0
  45. data/spec/units/units_helper.rb +4 -0
  46. metadata +49 -45
  47. data/README +0 -38
  48. data/lib/remit/pay.rb +0 -34
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007-2008 Tyler Hunt
1
+ Copyright (c) 2007-2009 Tyler Hunt
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.markdown ADDED
@@ -0,0 +1,91 @@
1
+ Remit
2
+ =====
3
+
4
+ This API provides access to the Amazon Flexible Payment Service (FPS). After
5
+ trying to get the SOAP version of the API written, I began working on this REST
6
+ version to provide a cohesive means of access to all of the functionality of
7
+ the FPS without having to get dirty dealing with SOAP requests.
8
+
9
+ I hope you enjoy using it as much as I've enjoyed writing it. I'm interested to
10
+ hear what sort of uses you find for it. If you find any bugs, let me know (or
11
+ better yet, submit a patch).
12
+
13
+
14
+ Sandbox
15
+ -------
16
+
17
+ Amazon provides a testing environment for the FPS called a sandbox. You may
18
+ (and should) use the sandbox while testing your application. It can be enabled
19
+ by passing a value of true to the last argument of the API constructor.
20
+
21
+
22
+ Getting Started
23
+ ---------------
24
+
25
+ The following example shows how to load up the API, initialize the service, and
26
+ make a simple call to get the tokens stored on the account:
27
+
28
+ gem 'remit'
29
+ require 'remit'
30
+
31
+ ACCESS_KEY = '<your AWS access key>'
32
+ SECRET_KEY = '<your AWS secret key>'
33
+
34
+ # connect using the API's sandbox mode
35
+ remit = Remit::API.new(ACCESS_KEY, SECRET_KEY, true)
36
+
37
+ response = remit.get_tokens
38
+ puts response.tokens.first.token_id
39
+
40
+
41
+ Using with Rails
42
+ ----------------
43
+
44
+ To use Remit in a Rails application, you must first specify a dependency on the
45
+ Remit gem in your config/environment.rb file:
46
+
47
+ config.gem 'remit', :version => '~> 0.0.1'
48
+
49
+ Then you should create an initializer to configure your Amazon keys. Create the
50
+ file config/initializers/remit.rb with the following contents:
51
+
52
+ config_file = File.join(Rails.root, 'config', 'amazon_fps.yml')
53
+ config = YAML.load_file(config_file)[RAILS_ENV].symbolize_keys
54
+
55
+ FPS_ACCESS_KEY = config[:access_key]
56
+ FPS_SECRET_KEY = config[:secret_key]
57
+
58
+ Then create the YAML file config/amazon_fps.yml:
59
+
60
+ development: &sandbox
61
+ access_key: <your sandbox access key>
62
+ secret_key: <your sandbox secret key>
63
+
64
+ test:
65
+ <<: *sandbox
66
+
67
+ production:
68
+ access_key: <your access key>
69
+ secret_key: <your secret key>
70
+
71
+ To instantiate and use the Remit API in your application, you could define a
72
+ method in your ApplicationController like this:
73
+
74
+ def remit
75
+ @remit ||= begin
76
+ sandbox = !Rails.env.production?
77
+ Remit::API.new(FPS_ACCESS_KEY, FPS_SECRET_KEY, sandbox)
78
+ end
79
+ end
80
+
81
+
82
+ Sites Using Remit
83
+ -----------------
84
+
85
+ The following production sites are currently using Remit:
86
+
87
+ * http://www.storenvy.com/
88
+ * http://www.obsidianportal.com/
89
+
90
+
91
+ Copyright (c) 2007-2009 Tyler Hunt, released under the MIT license
data/lib/remit.rb CHANGED
@@ -8,39 +8,44 @@ require 'base64'
8
8
  require 'erb'
9
9
 
10
10
  require 'rubygems'
11
+
12
+ gem 'relax', '0.0.7'
11
13
  require 'relax'
12
14
 
13
15
  require 'remit/common'
14
16
  require 'remit/data_types'
15
-
16
- require 'remit/cancel_token'
17
- require 'remit/discard_results'
18
- require 'remit/fund_prepaid'
19
- require 'remit/get_account_activity'
20
- require 'remit/get_account_balance'
21
- require 'remit/get_all_credit_instruments'
22
- require 'remit/get_all_prepaid_instruments'
23
- require 'remit/get_debt_balance'
24
- require 'remit/get_outstanding_debt_balance'
25
- require 'remit/get_payment_instruction'
17
+ require 'remit/error_codes'
18
+ require 'remit/ipn_request'
26
19
  require 'remit/get_pipeline'
27
- require 'remit/get_prepaid_balance'
28
- require 'remit/get_results'
29
- require 'remit/get_token_usage'
30
- require 'remit/get_tokens'
31
- require 'remit/get_token_by_caller'
32
- require 'remit/get_total_prepaid_liability'
33
- require 'remit/get_transaction'
34
- require 'remit/install_payment_instruction'
35
- require 'remit/pay'
36
- require 'remit/refund'
37
- require 'remit/reserve'
38
- require 'remit/retry_transaction'
39
- require 'remit/settle'
40
- require 'remit/settle_debt'
41
- require 'remit/subscribe_for_caller_notification'
42
- require 'remit/unsubscribe_for_caller_notification'
43
- require 'remit/write_off_debt'
20
+ require 'remit/pipeline_response'
21
+
22
+ require 'remit/operations/cancel_token'
23
+ require 'remit/operations/discard_results'
24
+ require 'remit/operations/fund_prepaid'
25
+ require 'remit/operations/get_account_activity'
26
+ require 'remit/operations/get_account_balance'
27
+ require 'remit/operations/get_all_credit_instruments'
28
+ require 'remit/operations/get_all_prepaid_instruments'
29
+ require 'remit/operations/get_debt_balance'
30
+ require 'remit/operations/get_outstanding_debt_balance'
31
+ require 'remit/operations/get_payment_instruction'
32
+ require 'remit/operations/get_prepaid_balance'
33
+ require 'remit/operations/get_results'
34
+ require 'remit/operations/get_token_by_caller'
35
+ require 'remit/operations/get_token_usage'
36
+ require 'remit/operations/get_tokens'
37
+ require 'remit/operations/get_total_prepaid_liability'
38
+ require 'remit/operations/get_transaction'
39
+ require 'remit/operations/install_payment_instruction'
40
+ require 'remit/operations/pay'
41
+ require 'remit/operations/refund'
42
+ require 'remit/operations/reserve'
43
+ require 'remit/operations/retry_transaction'
44
+ require 'remit/operations/settle'
45
+ require 'remit/operations/settle_debt'
46
+ require 'remit/operations/subscribe_for_caller_notification'
47
+ require 'remit/operations/unsubscribe_for_caller_notification'
48
+ require 'remit/operations/write_off_debt'
44
49
 
45
50
  module Remit
46
51
  class API < Relax::Service
@@ -73,29 +78,29 @@ module Remit
73
78
  include UnsubscribeForCallerNotification
74
79
  include WriteOffDebt
75
80
 
76
- API_ENDPOINT = 'https://fps.amazonaws.com/'
77
- API_SANDBOX = 'https://fps.sandbox.amazonaws.com/'
78
- PIPELINE_ENDPOINT = 'https://authorize.payments.amazon.com/cobranded-ui/actions/start'
79
- PIPELINE_SANDBOX = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start'
80
- API_VERSION = Date.new(2007, 1, 8).to_s
81
- SIGNATURE_VERSION = 1
81
+ API_ENDPOINT = 'https://fps.amazonaws.com/'.freeze
82
+ API_SANDBOX_ENDPOINT = 'https://fps.sandbox.amazonaws.com/'.freeze
83
+ PIPELINE_URL = 'https://authorize.payments.amazon.com/cobranded-ui/actions/start'.freeze
84
+ PIPELINE_SANDBOX_URL = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start'.freeze
85
+ API_VERSION = Date.new(2007, 1, 8).to_s.freeze
86
+ SIGNATURE_VERSION = 1.freeze
82
87
 
83
- attr_reader :pipeline
84
88
  attr_reader :access_key
85
89
  attr_reader :secret_key
90
+ attr_reader :pipeline_url
86
91
 
87
- def initialize(access_key, secret_key, sandbox = false)
88
- super((not sandbox) ? API_ENDPOINT : API_SANDBOX)
89
- @pipeline = ((not sandbox) ? PIPELINE_ENDPOINT : PIPELINE_SANDBOX)
92
+ def initialize(access_key, secret_key, sandbox=false)
90
93
  @access_key = access_key
91
94
  @secret_key = secret_key
92
- end
95
+ @pipeline_url = sandbox ? PIPELINE_SANDBOX_URL : PIPELINE_URL
93
96
 
94
- private
97
+ super(sandbox ? API_SANDBOX_ENDPOINT : API_ENDPOINT)
98
+ end
95
99
 
96
- def new_query(query = {})
100
+ def new_query(query={})
97
101
  SignedQuery.new(@endpoint, @secret_key, query)
98
102
  end
103
+ private :new_query
99
104
 
100
105
  def default_query
101
106
  new_query({
@@ -105,19 +110,24 @@ module Remit
105
110
  :Timestamp => Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
106
111
  })
107
112
  end
113
+ private :default_query
108
114
 
109
115
  def query(request)
110
116
  query = super
111
117
  query[:Signature] = sign(query)
112
118
  query
113
119
  end
120
+ private :query
114
121
 
115
122
  def sign(values)
116
123
  keys = values.keys.sort { |a, b| a.to_s.downcase <=> b.to_s.downcase }
124
+
117
125
  signature = keys.inject('') do |signature, key|
118
126
  signature += key.to_s + values[key].to_s
119
127
  end
128
+
120
129
  Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, @secret_key, signature)).strip
121
130
  end
131
+ private :sign
122
132
  end
123
133
  end
data/lib/remit/common.rb CHANGED
@@ -11,30 +11,28 @@ module Remit
11
11
  parameter :action, :value => name
12
12
  end
13
13
 
14
- protected
15
-
16
14
  def convert_key(key)
17
15
  key.to_s.gsub(/(^|_)(.)/) { $2.upcase }.to_sym
18
16
  end
17
+ protected :convert_key
19
18
  end
20
19
 
21
20
  class BaseResponse < Relax::Response
22
- private
23
-
24
- def node_name(name)
25
- name.to_s.gsub(/(^|_)(.)/) { $2.upcase }
21
+ def node_name(name, namespace=nil)
22
+ super(name.to_s.gsub(/(^|_)(.)/) { $2.upcase }, namespace)
26
23
  end
27
24
  end
28
25
 
29
26
  class Response < BaseResponse
30
27
  parameter :request_id
28
+
31
29
  attr_accessor :status
32
30
  attr_accessor :errors
33
31
 
34
32
  def initialize(xml)
35
33
  super
36
34
 
37
- if is?(:Response) and has?(:Errors)
35
+ if is?(:Response) && has?(:Errors)
38
36
  @errors = elements(:Errors).collect do |error|
39
37
  Error.new(error)
40
38
  end
@@ -42,7 +40,7 @@ module Remit
42
40
  @status = text_value(element(:Status))
43
41
  @errors = elements('errors/errors').collect do |error|
44
42
  ServiceError.new(error)
45
- end if not successful?
43
+ end unless successful?
46
44
  end
47
45
  end
48
46
 
@@ -50,26 +48,26 @@ module Remit
50
48
  @status == ResponseStatus::SUCCESS
51
49
  end
52
50
 
53
- private
54
-
55
- def node_name(name)
56
- name.to_s.gsub(/(^|_)(.)/) { $2.upcase }
51
+ def node_name(name, namespace=nil)
52
+ super(name.to_s.split('/').collect{ |tag|
53
+ tag.gsub(/(^|_)(.)/) { $2.upcase }
54
+ }.join('/'), namespace)
57
55
  end
58
56
  end
59
57
 
60
58
  class SignedQuery < Relax::Query
61
- def initialize(uri, secret_key, query = {})
59
+ def initialize(uri, secret_key, query={})
62
60
  super(query)
63
61
  @uri = URI.parse(uri.to_s)
64
62
  @secret_key = secret_key
65
63
  end
66
64
 
67
65
  def sign
68
- delete_if { |key, value| key == :awsSignature }
66
+ delete(:awsSignature)
69
67
  store(:awsSignature, Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, @secret_key, "#{@uri.path}?#{to_s(false)}".gsub('%20', '+'))).strip)
70
68
  end
71
69
 
72
- def to_s(signed = true)
70
+ def to_s(signed=true)
73
71
  sign if signed
74
72
  super()
75
73
  end
@@ -77,10 +75,12 @@ module Remit
77
75
  class << self
78
76
  def parse(uri, secret_key, query_string)
79
77
  query = self.new(uri, secret_key)
78
+
80
79
  query_string.split('&').each do |parameter|
81
- key, value = parameter.split('=')
80
+ key, value = parameter.split('=', 2)
82
81
  query[key] = unescape_value(value)
83
82
  end
83
+
84
84
  query
85
85
  end
86
86
  end
@@ -9,6 +9,16 @@ module Remit
9
9
  parameter :amount, :type => :float
10
10
  end
11
11
 
12
+ class TemporaryDeclinePolicy < BaseResponse
13
+ parameter :temporary_decline_policy_type
14
+ parameter :implicit_retry_timeout_in_mins
15
+ end
16
+
17
+ class DescriptorPolicy < BaseResponse
18
+ parameter :soft_descriptor_type
19
+ parameter :CS_number_of
20
+ end
21
+
12
22
  class ChargeFeeTo
13
23
  CALLER = 'Caller'
14
24
  RECIPIENT = 'Recipient'
@@ -80,6 +90,21 @@ module Remit
80
90
  parameter :status
81
91
  parameter :status_detail
82
92
  parameter :new_sender_token_usage, :type => TokenUsageLimit
93
+
94
+ %w(reserved success failure initiated reinitiated temporary_decline).each do |status_name|
95
+ define_method("#{status_name}?") do
96
+ self.status == Remit::TransactionStatus.const_get(status_name.sub('_', '').upcase)
97
+ end
98
+ end
99
+ end
100
+
101
+ class TransactionStatus
102
+ RESERVED = 'Reserved'
103
+ SUCCESS = 'Success'
104
+ FAILURE = 'Failure'
105
+ INITIATED = 'Initiated'
106
+ REINITIATED = 'Reinitiated'
107
+ TEMPORARYDECLINE = 'TemporaryDecline'
83
108
  end
84
109
 
85
110
  class TokenType
@@ -88,7 +113,7 @@ module Remit
88
113
  RECURRING = 'Recurring'
89
114
  UNRESTRICTED = 'Unrestricted'
90
115
  end
91
-
116
+
92
117
  class PipelineName
93
118
  SINGLE_USE = 'SingleUse'
94
119
  MULTI_USE = 'MultiUse'
@@ -97,11 +122,43 @@ module Remit
97
122
  SETUP_PREPAID = 'SetupPrepaid'
98
123
  SETUP_POSTPAID = 'SetupPostpaid'
99
124
  end
100
-
125
+
126
+ class PipelineStatusCode
127
+ CALLER_EXCEPTION = 'CE' # problem with your code
128
+ SYSTEM_ERROR = 'SE' # system error, try again
129
+ SUCCESS_ABT = 'SA' # successful payment with Amazon balance
130
+ SUCCESS_ACH = 'SB' # successful payment with bank transfer
131
+ SUCCESS_CC = 'SC' # successful payment with credit card
132
+ ABORTED = 'A' # user aborted payment
133
+ PAYMENT_METHOD_MISMATCH = 'PE' # user does not have payment method requested
134
+ PAYMENT_METHOD_UNSUPPORTED = 'NP' # account doesn't support requested payment method
135
+ INVALID_CALLER = 'NM' # you are not a valid 3rd party caller to the transaction
136
+ SUCCESS_RECIPIENT_TOKEN_INSTALLED = 'SR'
137
+ end
138
+
101
139
  module RequestTypes
102
140
  class Amount < Remit::Request
103
141
  parameter :amount
104
142
  parameter :currency_code
105
143
  end
144
+
145
+ class TemporaryDeclinePolicy < Remit::Request
146
+ parameter :temporary_decline_policy_type
147
+ parameter :implicit_retry_timeout_in_mins
148
+ end
149
+
150
+ class DescriptorPolicy < Remit::Request
151
+ parameter :soft_descriptor_type
152
+ parameter :CS_number_of
153
+ end
154
+ end
155
+
156
+ class Operation
157
+ PAY = "Pay"
158
+ REFUND = "Refund"
159
+ SETTLE = "Settle"
160
+ SETTLE_DEBT = "SettleDebt"
161
+ WRITE_OFF_DEBT = "WriteOffDebt"
162
+ FUND_PREPAID = "FundPrepaid"
106
163
  end
107
164
  end
@@ -0,0 +1,118 @@
1
+ # Scraped and categorized from http://docs.amazonwebservices.com/AmazonFPS/\
2
+ # 2007-01-08/FPSDeveloperGuide/index.html?ErrorCodesTable.html. You can use
3
+ # these categories to specify default error handling in your application such
4
+ # as asking users to retry or sending an exception email.
5
+ module Remit::ErrorCodes
6
+ class << self
7
+ def sender_error?(code)
8
+ SENDER.include? code.to_sym
9
+ end
10
+
11
+ def recipient_error?(code)
12
+ RECIPIENT.include? code.to_sym
13
+ end
14
+
15
+ def caller_error?(code)
16
+ CALLER.include?(code.to_sym)
17
+ end
18
+
19
+ def amazon_error?(code)
20
+ AMAZON.include? code.to_sym
21
+ end
22
+
23
+ def api_error?(code)
24
+ API.include? code.to_sym
25
+ end
26
+
27
+ def unknown_error?(code)
28
+ UNKNOWN.include? code.to_sym
29
+ end
30
+ end
31
+
32
+ SENDER = [
33
+ :InactiveAccount_Sender, # The sender's account is in suspended or closed state.
34
+ :InactiveInstrument, # The payment instrument used for this transaction is no longer active.
35
+ :InstrumentExpired, # The prepaid or the postpaid instrument has expired.
36
+ :InstrumentNotActive, # The prepaid or postpaid instrument used in the transaction is not active.
37
+ :InvalidAccountState_Sender, # Sender account cannot participate in the transaction.
38
+ :InvalidInstrumentForAccountType, # The sender account can use only credit cards
39
+ :InvalidInstrumentState, # The prepaid or credit instrument should be active
40
+ :InvalidTokenId_Sender, # The send token specified is either invalid or canceled or the token is not active.
41
+ :PaymentInstrumentNotCC, # The payment method specified in the transaction is not a credit card. You can only use a credit card for this transaction.
42
+ :PaymentInstrumentMissing, # There needs to be a payment instrument defined in the token which defines the payment method.
43
+ :TokenNotActive_Sender, # The sender token is canceled.
44
+ :UnverifiedAccount_Sender, # The sender's account must have a verified U.S. credit card or a verified U.S bank account before this transaction can be initiated
45
+ :UnverifiedBankAccount, # A verified bank account should be used for this transaction
46
+ :UnverifiedEmailAddress_Sender, # The sender account must have a verified e-mail address for this payment
47
+ ]
48
+
49
+ RECIPIENT = [
50
+ :InactiveAccount_Recipient, # The recipient's account is in suspended or closed state.
51
+ :InvalidAccountState_Recipient, # Recipient account cannot participate in the transaction
52
+ :InvalidRecipientRoleForAccountType, # The recipient account is not allowed to receive payments
53
+ :InvalidRecipientForCCTransaction, # This account cannot receive credit card payments.
54
+ :InvalidTokenId_Recipient, # The recipient token specified is either invalid or canceled.
55
+ :TokenNotActive_Recipient, # The recipient token is canceled.
56
+ :UnverifiedAccount_Recipient, # The recipient's account must have a verified bank account or a credit card before this transaction can be initiated.
57
+ :UnverifiedEmailAddress_Recipient, # The recipient account must have a verified e-mail address for receiving payments.
58
+ ]
59
+
60
+ CALLER = [
61
+ :InactiveAccount_Caller, # The caller's account is in suspended or closed state.
62
+ :InvalidAccountState_Caller, # The caller account cannot participate in the transaction
63
+ :InvalidTokenId_Caller, # The caller token specified is either invalid or canceled or the specified token is not active.
64
+ :TokenNotActive_Caller, # The caller token is canceled.
65
+ :UnverifiedEmailAddress_Caller, # The caller account must have a verified e-mail address
66
+ ]
67
+
68
+ AMAZON = [
69
+ :InternalError # A retriable error that happens due to some transient problem in the system.
70
+ ]
71
+
72
+ # bad syntax or logic
73
+ API = [
74
+ :AmountOutOfRange, # The transaction amount is more than the allowed range.
75
+ :BadRule, # One of the GK constructs is not well defined
76
+ :CannotSpecifyUsageForSingleUseToken, # Token usages cannot be specified for a single use token.
77
+ :ConcurrentModification, # A retriable error can happen due to concurrent modification of data by two processes.
78
+ :DuplicateRequest, # A different request associated with this caller reference already exists.
79
+ :IncompatibleTokens, # The transaction could not be completed because the tokens have incompatible payment instructions.
80
+ :InstrumentAccessDenied, # The external calling application is not the recipient for this postpaid or prepaid instrument. The caller should be the liability holder
81
+ :InvalidCallerReference, # The CallerReferece does not have a token associated with it.
82
+ :InvalidDateRange, # The end date specified is before the start date or the start date is in the future.
83
+ :InvalidEvent, # The event specified was not subscribed using the SubscribeForCallerNotification operation.
84
+ :InvalidParams, # One or more parameters in the request is invalid.
85
+ :InvalidPaymentInstrument, # The payment method used in the transaction is invalid.
86
+ :InvalidPaymentMethod, # Payment method specified in the GK construct is invalid.
87
+ :InvalidSenderRoleForAccountType, # This token cannot be used for this operation.
88
+ :InvalidTokenId, # The token that you are trying to cancel was not installed by you.
89
+ :InvalidTokenType, # Invalid operation performed on the token. Example, getting the token usage information on a single use token.
90
+ :InvalidTransactionId, # The specified transaction could not be found or the caller did not execute the transaction or this is not a Pay or Reserve call.
91
+ :InvalidTransactionState, # The transaction is not completed or it has been temporarily failed.
92
+ :InvalidUsageDuration, # The duration cannot be less than one hour.
93
+ :InvalidUsageLimitCount, # The usage count is null or empty.
94
+ :InvalidUsageStartTime, # The start time specified for the token is not valid.
95
+ :InvalidUsageType, # The usage type specified is invalid.
96
+ :OriginalTransactionIncomplete, # The original transaction is still in progress.
97
+ :OriginalTransactionFailed, # The original transaction has failed
98
+ :PaymentMethodNotDefined, # Payment method is not defined in the transaction.
99
+ :RefundAmountExceeded, # The refund amount is more than the refundable amount.
100
+ :SameTokenIdUsedMultipleTimes, # This token is already used in earlier transactions.
101
+ :SenderNotOriginalRecipient, # The sender in the refund transaction is not the recipient of the original transaction.
102
+ :SettleAmountGreaterThanReserveAmount, # The amount being settled is greater than the reserved amount.
103
+ :TransactionDenied, # This transaction is not allowed.
104
+ :TransactionExpired, # Returned when the Caller attempts to explicitly retry a transaction that is temporarily declined and is in queue for implicit retry.
105
+ :TransactionFullyRefundedAlready, # The complete refund for this transaction is already completed
106
+ :TransactionTypeNotRefundable, # You cannot refund this transaction.
107
+ :TokenAccessDenied, # Permission is denied to cancel the token.
108
+ :TokenUsageError, # The token usage limit is exceeded.
109
+ :UsageNotDefined, # For a multi-use token or a recurring token the usage limits are not specified in the GateKeeper text.
110
+ ]
111
+
112
+ # these errors don't specify who is at fault
113
+ UNKNOWN = [
114
+ :InvalidAccountState, # The account is either suspended or closed. Payment instructions cannot be installed on this account.
115
+ :InsufficientBalance, # The sender, caller, or recipient's account balance has insufficient funds to complete the transaction.
116
+ :AccountLimitsExceeded, # The spending or the receiving limit on the account is exceeded
117
+ ]
118
+ end