remit2 0.0.7
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.
- data/LICENSE +20 -0
- data/README.markdown +26 -0
- data/lib/remit2.rb +119 -0
- data/lib/remit2/data_types.rb +142 -0
- data/lib/remit2/error_codes.rb +118 -0
- data/lib/remit2/get_pipeline.rb +195 -0
- data/lib/remit2/ipn_request.rb +45 -0
- data/lib/remit2/operations/cancel_subscription_and_refund.rb +26 -0
- data/lib/remit2/operations/cancel_token.rb +16 -0
- data/lib/remit2/operations/discard_results.rb +16 -0
- data/lib/remit2/operations/fund_prepaid.rb +29 -0
- data/lib/remit2/operations/get_account_activity.rb +58 -0
- data/lib/remit2/operations/get_account_balance.rb +27 -0
- data/lib/remit2/operations/get_all_credit_instruments.rb +16 -0
- data/lib/remit2/operations/get_all_prepaid_instruments.rb +16 -0
- data/lib/remit2/operations/get_debt_balance.rb +21 -0
- data/lib/remit2/operations/get_outstanding_debt_balance.rb +20 -0
- data/lib/remit2/operations/get_payment_instruction.rb +19 -0
- data/lib/remit2/operations/get_prepaid_balance.rb +21 -0
- data/lib/remit2/operations/get_results.rb +25 -0
- data/lib/remit2/operations/get_token_by_caller.rb +23 -0
- data/lib/remit2/operations/get_token_usage.rb +16 -0
- data/lib/remit2/operations/get_tokens.rb +18 -0
- data/lib/remit2/operations/get_total_prepaid_liability.rb +20 -0
- data/lib/remit2/operations/get_transaction.rb +40 -0
- data/lib/remit2/operations/install_payment_instruction.rb +20 -0
- data/lib/remit2/operations/pay.rb +38 -0
- data/lib/remit2/operations/refund.rb +28 -0
- data/lib/remit2/operations/reserve.rb +28 -0
- data/lib/remit2/operations/retry_transaction.rb +16 -0
- data/lib/remit2/operations/settle.rb +18 -0
- data/lib/remit2/operations/settle_debt.rb +28 -0
- data/lib/remit2/operations/write_off_debt.rb +26 -0
- data/lib/remit2/pipeline_response.rb +52 -0
- data/lib/remit2/request.rb +12 -0
- data/lib/remit2/response.rb +54 -0
- data/lib/remit2/signature.rb +35 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/units/cancel_subscription_and_refund_spec.rb +26 -0
- data/spec/units/get_pipeline_spec.rb +164 -0
- data/spec/units/ipn_request_spec.rb +35 -0
- data/spec/units/pay_spec.rb +67 -0
- data/spec/units/remit_spec.rb +25 -0
- data/spec/units/units_helper.rb +4 -0
- metadata +119 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Remit
|
2
|
+
module GetTransaction
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :GetTransaction
|
5
|
+
parameter :transaction_id, :required => true
|
6
|
+
end
|
7
|
+
|
8
|
+
class Response < Remit::Response
|
9
|
+
class TransactionDetail < Remit::BaseResponse
|
10
|
+
parameter :caller_name
|
11
|
+
parameter :caller_token_id
|
12
|
+
parameter :caller_transaction_date, :type => :time
|
13
|
+
parameter :date_completed, :type => :time
|
14
|
+
parameter :date_received, :type => :time
|
15
|
+
parameter :error_code
|
16
|
+
parameter :error_message
|
17
|
+
parameter :fees, :type => Amount
|
18
|
+
parameter :meta_data
|
19
|
+
parameter :operation
|
20
|
+
parameter :payment_method
|
21
|
+
parameter :recipient_name
|
22
|
+
parameter :recipient_token_id
|
23
|
+
parameter :related_transactions
|
24
|
+
parameter :sender_name
|
25
|
+
parameter :sender_token_id
|
26
|
+
parameter :status
|
27
|
+
parameter :status_history
|
28
|
+
parameter :transaction_amount, :type => Amount
|
29
|
+
parameter :transaction_id
|
30
|
+
parameter :transaction_parts
|
31
|
+
end
|
32
|
+
|
33
|
+
parameter :transaction, :type => TransactionDetail
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_transaction(request = Request.new)
|
37
|
+
call(request, Response)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Remit
|
2
|
+
module InstallPaymentInstruction
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :InstallPaymentInstruction
|
5
|
+
parameter :payment_instruction, :required => true
|
6
|
+
parameter :caller_reference, :required => true
|
7
|
+
parameter :token_friendly_name
|
8
|
+
parameter :token_type, :required => true
|
9
|
+
parameter :payment_reason
|
10
|
+
end
|
11
|
+
|
12
|
+
class Response < Remit::Response
|
13
|
+
parameter :token_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def install_payment_instruction(request)
|
17
|
+
call(request, Response)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Updated for API Version 2008-09-17
|
2
|
+
module Remit
|
3
|
+
module Pay
|
4
|
+
class Request < Remit::Request
|
5
|
+
action :Pay
|
6
|
+
parameter :caller_description
|
7
|
+
parameter :caller_reference, :required => true
|
8
|
+
parameter :charge_fee_to
|
9
|
+
parameter :descriptor_policy, :type => Remit::RequestTypes::DescriptorPolicy
|
10
|
+
parameter :marketplace_fixed_fee, :type => Remit::RequestTypes::Amount
|
11
|
+
parameter :marketplace_variable_fee
|
12
|
+
parameter :meta_data
|
13
|
+
parameter :recipient_description
|
14
|
+
parameter :recipient_reference
|
15
|
+
parameter :recipient_token_id
|
16
|
+
parameter :sender_description
|
17
|
+
parameter :sender_reference
|
18
|
+
parameter :sender_token_id, :required => true
|
19
|
+
parameter :transaction_amount, :type => Remit::RequestTypes::Amount, :required => true
|
20
|
+
parameter :transaction_date
|
21
|
+
parameter :transaction_timeout_in_mins
|
22
|
+
end
|
23
|
+
|
24
|
+
class InnerResponse < Remit::BaseResponse
|
25
|
+
parameter :transaction_id
|
26
|
+
parameter :transaction_status
|
27
|
+
end
|
28
|
+
|
29
|
+
class Response < Remit::Response
|
30
|
+
parameter :inner, :element => "PayResult", :type => InnerResponse
|
31
|
+
inner_parameters :transaction_id, :transaction_status
|
32
|
+
end
|
33
|
+
|
34
|
+
def pay(request = Request.new)
|
35
|
+
call(request, Response)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Updated for API Version 2008-09-17
|
2
|
+
module Remit
|
3
|
+
module Refund
|
4
|
+
class Request < Remit::Request
|
5
|
+
action :Refund
|
6
|
+
parameter :caller_description
|
7
|
+
parameter :caller_reference, :required => true
|
8
|
+
parameter :refund_amount, :type => Remit::RequestTypes::Amount
|
9
|
+
parameter :transaction_id, :required => true
|
10
|
+
parameter :marketplace_refund_policy
|
11
|
+
|
12
|
+
# The RefundAmount parameter has multiple components. It is specified on the query string like
|
13
|
+
# so: RefundAmount.Amount=XXX&RefundAmount.CurrencyCode=YYY
|
14
|
+
def convert_complex_key(key, parameter)
|
15
|
+
"#{convert_key(key).to_s}.#{convert_key(parameter).to_s}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Response < Remit::Response
|
20
|
+
parser :rexml
|
21
|
+
parameter :refund_result, :type => RefundResult
|
22
|
+
end
|
23
|
+
|
24
|
+
def refund(request = Request.new)
|
25
|
+
call(request, Response)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Remit
|
2
|
+
module Reserve
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :Reserve
|
5
|
+
parameter :recipient_token_id, :required => true
|
6
|
+
parameter :sender_token_id, :required => true
|
7
|
+
parameter :caller_token_id, :required => true
|
8
|
+
parameter :sender_reference
|
9
|
+
parameter :recipient_reference
|
10
|
+
parameter :caller_reference, :required => true
|
11
|
+
parameter :transaction_date
|
12
|
+
parameter :transaction_amount, :type => Remit::RequestTypes::Amount, :required => true
|
13
|
+
parameter :charge_fee_to, :required => true
|
14
|
+
parameter :sender_description
|
15
|
+
parameter :recipient_description
|
16
|
+
parameter :caller_description
|
17
|
+
parameter :meta_data
|
18
|
+
end
|
19
|
+
|
20
|
+
class Response < Remit::Response
|
21
|
+
parameter :transaction_response, :type => TransactionResponse
|
22
|
+
end
|
23
|
+
|
24
|
+
def reserve(request = Request.new)
|
25
|
+
call(request, Response)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Remit
|
2
|
+
module RetryTransaction
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :RetryTransaction
|
5
|
+
parameter :original_transaction_id, :required => true
|
6
|
+
end
|
7
|
+
|
8
|
+
class Response < Remit::Response
|
9
|
+
parameter :transaction_response, :type => TransactionResponse
|
10
|
+
end
|
11
|
+
|
12
|
+
def retry_transaction(request = Request.new)
|
13
|
+
call(request, Response)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Remit
|
2
|
+
module Settle
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :Settle
|
5
|
+
parameter :reserve_transaction_id, :required => true
|
6
|
+
parameter :transaction_amount, :type => Remit::RequestTypes::Amount
|
7
|
+
parameter :transaction_date
|
8
|
+
end
|
9
|
+
|
10
|
+
class Response < Remit::Response
|
11
|
+
parameter :transaction_response, :type => TransactionResponse
|
12
|
+
end
|
13
|
+
|
14
|
+
def settle(request = Request.new)
|
15
|
+
call(request, Response)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Remit
|
2
|
+
module SettleDebt
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :SettleDebt
|
5
|
+
parameter :caller_description
|
6
|
+
parameter :caller_reference, :required => true
|
7
|
+
parameter :caller_token_id, :required => true
|
8
|
+
parameter :charge_fee_to, :required => true
|
9
|
+
parameter :credit_instrument_id, :required => true
|
10
|
+
parameter :meta_data
|
11
|
+
parameter :recipient_description
|
12
|
+
parameter :recipient_reference
|
13
|
+
parameter :sender_description
|
14
|
+
parameter :sender_reference
|
15
|
+
parameter :sender_token_id, :required => true
|
16
|
+
parameter :settlement_amount, :type => Remit::RequestTypes::Amount, :required => true
|
17
|
+
parameter :transaction_date
|
18
|
+
end
|
19
|
+
|
20
|
+
class Response < Remit::Response
|
21
|
+
parameter :transaction_response, :type => TransactionResponse
|
22
|
+
end
|
23
|
+
|
24
|
+
def settle_debt(request = Request.new)
|
25
|
+
call(request, Response)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Remit
|
2
|
+
module WriteOffDebt
|
3
|
+
class Request < Remit::Request
|
4
|
+
action :WriteOffDebt
|
5
|
+
parameter :caller_token_id, :required => true
|
6
|
+
parameter :credit_instrument_id, :required => true
|
7
|
+
parameter :adjustment_amount, :required => true
|
8
|
+
parameter :transaction_date
|
9
|
+
parameter :sender_reference
|
10
|
+
parameter :caller_reference, :required => true
|
11
|
+
parameter :recipient_reference
|
12
|
+
parameter :sender_description
|
13
|
+
parameter :recipient_description
|
14
|
+
parameter :caller_description
|
15
|
+
parameter :meta_data
|
16
|
+
end
|
17
|
+
|
18
|
+
class Response < Remit::Response
|
19
|
+
parameter :transaction_response, :type => TransactionResponse
|
20
|
+
end
|
21
|
+
|
22
|
+
def write_off_debt(request = Request.new)
|
23
|
+
call(request, Response)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Remit
|
2
|
+
class PipelineResponse
|
3
|
+
def initialize(uri, secret_key)
|
4
|
+
@uri = URI.parse(uri)
|
5
|
+
@secret_key = secret_key
|
6
|
+
end
|
7
|
+
|
8
|
+
# Returns +true+ if the response is correctly signed (awsSignature).
|
9
|
+
#
|
10
|
+
#--
|
11
|
+
# The unescape_value method is used here because the awsSignature value
|
12
|
+
# pulled from the request is filtered through the same method.
|
13
|
+
#++
|
14
|
+
def valid?
|
15
|
+
return false unless given_signature
|
16
|
+
Relax::Query.unescape_value(correct_signature) == given_signature
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns +true+ if the response returns a successful state.
|
20
|
+
def successful?
|
21
|
+
[
|
22
|
+
Remit::PipelineStatusCode::SUCCESS_ABT,
|
23
|
+
Remit::PipelineStatusCode::SUCCESS_ACH,
|
24
|
+
Remit::PipelineStatusCode::SUCCESS_CC,
|
25
|
+
Remit::PipelineStatusCode::SUCCESS_RECIPIENT_TOKEN_INSTALLED
|
26
|
+
].include?(request_query[:status])
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(method, *args) #:nodoc:
|
30
|
+
if request_query.has_key?(method.to_sym)
|
31
|
+
request_query[method.to_sym]
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def request_query(reload = false)
|
38
|
+
@query ||= Remit::SignedQuery.parse(@uri, @secret_key, @uri.query || '')
|
39
|
+
end
|
40
|
+
private :request_query
|
41
|
+
|
42
|
+
def given_signature
|
43
|
+
request_query[:awsSignature]
|
44
|
+
end
|
45
|
+
private :given_signature
|
46
|
+
|
47
|
+
def correct_signature
|
48
|
+
Remit::SignedQuery.new(@uri.path, @secret_key, request_query).sign
|
49
|
+
end
|
50
|
+
private :correct_signature
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Remit
|
2
|
+
class BaseResponse < Relax::Response
|
3
|
+
def node_name(name, namespace=nil)
|
4
|
+
super(name.to_s.gsub(/(^|_)(.)/) { $2.upcase }, namespace)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class ResponseMetadata < BaseResponse
|
9
|
+
parameter :request_id
|
10
|
+
end
|
11
|
+
|
12
|
+
class Response < BaseResponse
|
13
|
+
parameter :response_metadata, :type => ResponseMetadata
|
14
|
+
attr_accessor :errors
|
15
|
+
|
16
|
+
def initialize(xml)
|
17
|
+
super
|
18
|
+
@errors = []
|
19
|
+
|
20
|
+
if is?(:Response) && has?(:Errors)
|
21
|
+
@errors = elements('Errors/Error').collect do |error|
|
22
|
+
Error.new(error)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def successful?
|
28
|
+
@errors.empty?
|
29
|
+
end
|
30
|
+
|
31
|
+
def request_id
|
32
|
+
# If successful it's in the ResponseMetadata, if failure, it's in the base
|
33
|
+
# response. Very irritating.
|
34
|
+
if successful?
|
35
|
+
response_metadata.request_id
|
36
|
+
else
|
37
|
+
elements('RequestId')[0].to_s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def node_name(name, namespace=nil)
|
42
|
+
super(name.to_s.split('/').collect{ |tag|
|
43
|
+
tag.gsub(/(^|_)(.)/) { $2.upcase }
|
44
|
+
}.join('/'), namespace)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Easily exposes parameters that are buried in the InnerResponse
|
48
|
+
def self.inner_parameters(*fields)
|
49
|
+
fields.each do |inner_field_name|
|
50
|
+
define_method(inner_field_name) { inner.send(inner_field_name) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Remit
|
2
|
+
module Signature
|
3
|
+
def sign(secret_key, endpoint, http_verb, params)
|
4
|
+
s = string_to_sign(endpoint, http_verb, params)
|
5
|
+
Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, secret_key, s)).strip
|
6
|
+
end
|
7
|
+
|
8
|
+
def string_to_sign(endpoint, http_verb, values)
|
9
|
+
uri = URI::parse(endpoint.to_s)
|
10
|
+
|
11
|
+
path = uri.path
|
12
|
+
path = "/" if (path.nil? || path.empty?)
|
13
|
+
path = urlencode(path).gsub("%2F", "/")
|
14
|
+
|
15
|
+
host = uri.host.downcase
|
16
|
+
|
17
|
+
# Explicitly remove the Signature param if found
|
18
|
+
sorted_keys = values.keys.reject{ |k| k.to_s == "Signature" }.sort { |x,y| x.to_s <=> y.to_s }
|
19
|
+
converted = sorted_keys.collect do |k|
|
20
|
+
v = values[k]
|
21
|
+
s = urlencode(k)
|
22
|
+
s << "=#{urlencode(v)}" unless v.nil?
|
23
|
+
s
|
24
|
+
end
|
25
|
+
params = converted.join("&")
|
26
|
+
|
27
|
+
"#{http_verb}\n#{host}\n#{path}\n#{params}"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convert a string into URL encoded form that Amazon accepts
|
31
|
+
def urlencode(plaintext)
|
32
|
+
CGI.escape(plaintext.to_s).gsub("+", "%20").gsub("%7E", "~")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) + '/../lib/remit2'
|
5
|
+
|
6
|
+
def remit
|
7
|
+
@remit ||= Remit::API.new(ACCESS_KEY, SECRET_KEY, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'a successful response', :shared => true do
|
11
|
+
it 'should not have any errors' do
|
12
|
+
@response.errors.should be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have a request ID' do
|
16
|
+
@response.request_id.should_not be_nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'a failed response', :shared => true do
|
21
|
+
it "is not successful" do
|
22
|
+
@response.should_not be_successful
|
23
|
+
end
|
24
|
+
|
25
|
+
it "has a request id" do
|
26
|
+
@response.request_id.should_not be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has errors" do
|
30
|
+
@response.errors.should_not be_empty
|
31
|
+
end
|
32
|
+
end
|