pp-adaptive 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/README.md +54 -0
- data/Rakefile +8 -0
- data/lib/pp-adaptive/abstract_request.rb +44 -0
- data/lib/pp-adaptive/abstract_response.rb +46 -0
- data/lib/pp-adaptive/cancel_preapproval_request.rb +7 -0
- data/lib/pp-adaptive/cancel_preapproval_response.rb +7 -0
- data/lib/pp-adaptive/client.rb +56 -0
- data/lib/pp-adaptive/convert_currency_request.rb +33 -0
- data/lib/pp-adaptive/convert_currency_response.rb +11 -0
- data/lib/pp-adaptive/execute_payment_request.rb +9 -0
- data/lib/pp-adaptive/execute_payment_response.rb +12 -0
- data/lib/pp-adaptive/get_payment_options_request.rb +7 -0
- data/lib/pp-adaptive/get_payment_options_response.rb +32 -0
- data/lib/pp-adaptive/pay_request.rb +64 -0
- data/lib/pp-adaptive/pay_response.rb +29 -0
- data/lib/pp-adaptive/payment_details_request.rb +9 -0
- data/lib/pp-adaptive/payment_details_response.rb +53 -0
- data/lib/pp-adaptive/preapproval_details_request.rb +8 -0
- data/lib/pp-adaptive/preapproval_details_response.rb +35 -0
- data/lib/pp-adaptive/preapproval_request.rb +36 -0
- data/lib/pp-adaptive/preapproval_response.rb +7 -0
- data/lib/pp-adaptive/refund_request.rb +14 -0
- data/lib/pp-adaptive/refund_response.rb +12 -0
- data/lib/pp-adaptive/set_payment_options_request.rb +33 -0
- data/lib/pp-adaptive/set_payment_options_response.rb +7 -0
- data/lib/pp-adaptive/support/aliases.rb +33 -0
- data/lib/pp-adaptive/support/coerced_array.rb +52 -0
- data/lib/pp-adaptive/support/json_model.rb +140 -0
- data/lib/pp-adaptive/support/node.rb +45 -0
- data/lib/pp-adaptive/support/node_list.rb +45 -0
- data/lib/pp-adaptive/types/account_identifier.rb +6 -0
- data/lib/pp-adaptive/types/address.rb +17 -0
- data/lib/pp-adaptive/types/address_list.rb +5 -0
- data/lib/pp-adaptive/types/aliases/receiver_aliases.rb +15 -0
- data/lib/pp-adaptive/types/aliases/receiver_list_aliases.rb +32 -0
- data/lib/pp-adaptive/types/base_address.rb +11 -0
- data/lib/pp-adaptive/types/client_details_type.rb +12 -0
- data/lib/pp-adaptive/types/currency_code.rb +5 -0
- data/lib/pp-adaptive/types/currency_conversion.rb +17 -0
- data/lib/pp-adaptive/types/currency_conversion_list.rb +15 -0
- data/lib/pp-adaptive/types/currency_conversion_table.rb +5 -0
- data/lib/pp-adaptive/types/currency_list.rb +5 -0
- data/lib/pp-adaptive/types/currency_type.rb +6 -0
- data/lib/pp-adaptive/types/display_options.rb +8 -0
- data/lib/pp-adaptive/types/error_data.rb +11 -0
- data/lib/pp-adaptive/types/error_list.rb +5 -0
- data/lib/pp-adaptive/types/fault_message.rb +23 -0
- data/lib/pp-adaptive/types/funding_constraint.rb +5 -0
- data/lib/pp-adaptive/types/funding_plan.rb +28 -0
- data/lib/pp-adaptive/types/funding_plan_charge.rb +11 -0
- data/lib/pp-adaptive/types/funding_source.rb +9 -0
- data/lib/pp-adaptive/types/funding_type_info.rb +5 -0
- data/lib/pp-adaptive/types/funding_type_list.rb +5 -0
- data/lib/pp-adaptive/types/initiating_entity.rb +15 -0
- data/lib/pp-adaptive/types/institution_customer.rb +11 -0
- data/lib/pp-adaptive/types/invoice_data.rb +7 -0
- data/lib/pp-adaptive/types/invoice_item.rb +9 -0
- data/lib/pp-adaptive/types/pay_error.rb +18 -0
- data/lib/pp-adaptive/types/pay_error_list.rb +5 -0
- data/lib/pp-adaptive/types/payment_info.rb +16 -0
- data/lib/pp-adaptive/types/payment_info_list.rb +5 -0
- data/lib/pp-adaptive/types/phone_number_type.rb +7 -0
- data/lib/pp-adaptive/types/receiver.rb +17 -0
- data/lib/pp-adaptive/types/receiver_identifier.rb +12 -0
- data/lib/pp-adaptive/types/receiver_list.rb +5 -0
- data/lib/pp-adaptive/types/receiver_options.rb +21 -0
- data/lib/pp-adaptive/types/refund_info.rb +20 -0
- data/lib/pp-adaptive/types/refund_info_list.rb +5 -0
- data/lib/pp-adaptive/types/request_envelope.rb +6 -0
- data/lib/pp-adaptive/types/response_envelope.rb +13 -0
- data/lib/pp-adaptive/types/sender_identifier.rb +5 -0
- data/lib/pp-adaptive/types/sender_options.rb +5 -0
- data/lib/pp-adaptive/version.rb +3 -0
- data/lib/pp-adaptive.rb +75 -0
- data/pp-adaptive.gemspec +25 -0
- data/spec/public/cancel_preapproval_request_spec.rb +15 -0
- data/spec/public/cancel_preapproval_response_spec.rb +6 -0
- data/spec/public/client_spec.rb +85 -0
- data/spec/public/convert_currency_request_spec.rb +29 -0
- data/spec/public/convert_currency_response_spec.rb +62 -0
- data/spec/public/execute_payment_request_spec.rb +30 -0
- data/spec/public/execute_payment_response_spec.rb +66 -0
- data/spec/public/get_payment_options_request_spec.rb +15 -0
- data/spec/public/get_payment_options_response_spec.rb +141 -0
- data/spec/public/json_model_spec.rb +56 -0
- data/spec/public/node_list_spec.rb +58 -0
- data/spec/public/node_spec.rb +54 -0
- data/spec/public/pay_request_spec.rb +150 -0
- data/spec/public/pay_response_spec.rb +197 -0
- data/spec/public/payment_details_request_spec.rb +30 -0
- data/spec/public/payment_details_response_spec.rb +211 -0
- data/spec/public/preapproval_details_request_spec.rb +25 -0
- data/spec/public/preapproval_details_response_spec.rb +200 -0
- data/spec/public/preapproval_request_spec.rb +110 -0
- data/spec/public/preapproval_response_spec.rb +14 -0
- data/spec/public/refund_request_spec.rb +57 -0
- data/spec/public/refund_response_spec.rb +116 -0
- data/spec/public/set_payment_options_request_spec.rb +136 -0
- data/spec/public/set_payment_options_response_spec.rb +6 -0
- data/spec/shared/a_fault_message.rb +60 -0
- data/spec/shared/a_request_envelope.rb +14 -0
- data/spec/shared/a_response_envelope.rb +36 -0
- data/spec/spec_helper.rb +6 -0
- metadata +225 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# A Ruby API for PayPal Adaptive Payments
|
2
|
+
|
3
|
+
- Current Status: Work-in-progress (don't use, API subject to major change)
|
4
|
+
- Working:
|
5
|
+
- setting up an explicit preapproval
|
6
|
+
- processing payments (for an explicit preapproval)
|
7
|
+
- Not working:
|
8
|
+
- executing pre-created payments
|
9
|
+
- changing options on a created payment
|
10
|
+
- refunds/cancellations
|
11
|
+
- minor things like currency conversion requests
|
12
|
+
|
13
|
+
This gem provides access to PayPal's Adaptive Payments API using easy-to-use
|
14
|
+
ruby classes. The internals are largely backed by
|
15
|
+
[Virtus](https://github.com/solnic/virtus) and
|
16
|
+
[RestClient](https://github.com/archiloque/rest-client), and so are easy to
|
17
|
+
work with.
|
18
|
+
|
19
|
+
## Installing the Gem
|
20
|
+
|
21
|
+
Via rubygems:
|
22
|
+
|
23
|
+
gem install pp-adaptive
|
24
|
+
|
25
|
+
## Setting up a Preapproval Agreement
|
26
|
+
|
27
|
+
``` ruby
|
28
|
+
require 'pp-adaptive'
|
29
|
+
|
30
|
+
client = AdaptivePayments::Client.new(
|
31
|
+
:user_id => "your-api-user-id",
|
32
|
+
:password => "your-api-password",
|
33
|
+
:signature => "your-api-signature",
|
34
|
+
:app_id => "your-app-id",
|
35
|
+
:sandbox => false
|
36
|
+
)
|
37
|
+
|
38
|
+
response = client.execute(AdaptivePayments::PreapprovalRequest.new(
|
39
|
+
:ending_date => DateTime.now.next_year,
|
40
|
+
:starting_date => DateTime.now,
|
41
|
+
:max_total_amount => BigDecimal("950.00"),
|
42
|
+
:currency_code => "USD",
|
43
|
+
:cancel_url => "http://site.com/cancelled",
|
44
|
+
:return_url => "http://site.com/completed"
|
45
|
+
))
|
46
|
+
|
47
|
+
if response.success?
|
48
|
+
puts "Preapproval key: #{response.preapproval_key}"
|
49
|
+
else
|
50
|
+
puts "#{response.ack_code}: #{response.error_message}"
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
(Work in progress...)
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
# AbstractRequest is a JsonModel that defines some default behaviour for all requests
|
3
|
+
#
|
4
|
+
# A request defines the operation it executes and provides a method for building the corresponding response.
|
5
|
+
# All requests provide a RequestEnvelope by default. There is no need to re-define it in descendants.
|
6
|
+
class AbstractRequest < JsonModel
|
7
|
+
# The RequestEnvelope, providing the detail_level and error_language.
|
8
|
+
#
|
9
|
+
# Aliases are defined for #detail_level and #error_language. They do not need to be accessed through the
|
10
|
+
# request_envelope.
|
11
|
+
attribute :request_envelope, Node[RequestEnvelope], :param => "requestEnvelope"
|
12
|
+
|
13
|
+
alias_params :request_envelope, {
|
14
|
+
:detail_level => :detail_level,
|
15
|
+
:error_language => :error_language
|
16
|
+
}
|
17
|
+
|
18
|
+
class << self
|
19
|
+
# Set or get the API operation for the request class
|
20
|
+
#
|
21
|
+
# @param [Symbol] name
|
22
|
+
# the name of the operation defined in the Adaptive Payments API, optional
|
23
|
+
#
|
24
|
+
# @return [Symbol]
|
25
|
+
# the name of the operation defined in the Adaptive Payments API
|
26
|
+
def operation(name = nil)
|
27
|
+
@operation = name unless name.nil?
|
28
|
+
@operation
|
29
|
+
end
|
30
|
+
|
31
|
+
# Given a JSON string, return the corresponding response.
|
32
|
+
#
|
33
|
+
# @param [String] json
|
34
|
+
# the raw JSON string as returned by the API
|
35
|
+
#
|
36
|
+
# @return [AbstractResponse]
|
37
|
+
# the corresponding response for the JSON
|
38
|
+
def build_response(json)
|
39
|
+
klass = AdaptivePayments.const_get(operation.to_s + "Response")
|
40
|
+
klass.from_json(json.to_s)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
# AbstractResponse provides a JsonModel with the default behaviour for all responses
|
3
|
+
#
|
4
|
+
# The ResponseEnvelope is already included by default. It does not need to be redeclared in descendants.
|
5
|
+
#
|
6
|
+
# All responses have FaultMessage behaviour mixed in, so will behave as a FaultMessage if the API returns one.
|
7
|
+
class AbstractResponse < JsonModel
|
8
|
+
include FaultMessage
|
9
|
+
|
10
|
+
# The ResponseEnvelope, encapsulating common information about the response
|
11
|
+
#
|
12
|
+
# All attributes #ack_code, #build, #correlation_id and #time are aliased as top-level attributes,
|
13
|
+
# so you do not need to access #response_envelope directly.
|
14
|
+
#
|
15
|
+
# @see #success?, #failure?, #warning?, #success_with_warning?, #failure_with_warning?
|
16
|
+
attribute :response_envelope, Node[ResponseEnvelope], :param => "responseEnvelope"
|
17
|
+
|
18
|
+
alias_params :response_envelope, {
|
19
|
+
:ack_code => :ack_code,
|
20
|
+
:build => :build,
|
21
|
+
:correlation_id => :correlation_id,
|
22
|
+
:time => :time
|
23
|
+
}
|
24
|
+
|
25
|
+
class << self
|
26
|
+
# Set or get the API operation
|
27
|
+
#
|
28
|
+
# This method should be called in descendants, but is not currently used.
|
29
|
+
#
|
30
|
+
# @param [Symbol] name
|
31
|
+
# the name of the API operation as defined by PayPal, optional
|
32
|
+
#
|
33
|
+
# @return [Symbol]
|
34
|
+
# the name of the API operation as defined by PayPal
|
35
|
+
def operation(name = nil)
|
36
|
+
@operation = name unless name.nil?
|
37
|
+
@operation
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Provide status predicates for the possible response ack codes
|
42
|
+
%w{success? failure? warning? success_with_warning? failure_with_warning?}.each do |method|
|
43
|
+
define_method(method) { response_envelope.send(method) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "rest-client"
|
2
|
+
require "virtus"
|
3
|
+
|
4
|
+
module AdaptivePayments
|
5
|
+
class Client
|
6
|
+
include Virtus
|
7
|
+
|
8
|
+
attribute :user_id, String, :header => "X-PAYPAL-SECURITY-USERID"
|
9
|
+
attribute :password, String, :header => "X-PAYPAL-SECURITY-PASSWORD"
|
10
|
+
attribute :signature, String, :header => "X-PAYPAL-SECURITY-SIGNATURE"
|
11
|
+
attribute :app_id, String, :header => "X-PAYPAL-APPLICATION-ID"
|
12
|
+
attribute :device_ip, String, :header => "X-PAYPAL-DEVICE-IPADDRESS"
|
13
|
+
|
14
|
+
def initialize(options = {})
|
15
|
+
super
|
16
|
+
self.sandbox = options[:sandbox]
|
17
|
+
end
|
18
|
+
|
19
|
+
def sandbox=(flag)
|
20
|
+
@sandbox = !!flag
|
21
|
+
end
|
22
|
+
|
23
|
+
def sandbox?
|
24
|
+
!!@sandbox
|
25
|
+
end
|
26
|
+
|
27
|
+
def execute(request)
|
28
|
+
base_url = if sandbox?
|
29
|
+
"https://svcs.sandbox.paypal.com/AdaptivePayments"
|
30
|
+
else
|
31
|
+
"https://svcs.paypal.com/AdaptivePayments"
|
32
|
+
end
|
33
|
+
|
34
|
+
resource = RestClient::Resource.new(base_url, :headers => headers)
|
35
|
+
response = resource[request.class.operation.to_s].post(
|
36
|
+
request.to_json,
|
37
|
+
:content_type => :json,
|
38
|
+
:accept => :json
|
39
|
+
)
|
40
|
+
request.class.build_response(response)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def headers
|
46
|
+
base_headers = {
|
47
|
+
"X-PAYPAL-RESPONSE-DATA-FORMAT" => "JSON",
|
48
|
+
"X-PAYPAL-REQUEST-DATA-FORMAT" => "JSON"
|
49
|
+
}
|
50
|
+
attributes.inject(base_headers) do |hash, (attr, value)|
|
51
|
+
next hash if value.nil?
|
52
|
+
hash.merge(self.class.attributes[attr].options[:header] => value)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ConvertCurrencyRequest < AbstractRequest
|
3
|
+
operation :ConvertCurrency
|
4
|
+
|
5
|
+
attribute :base_amount_list, Node[CurrencyList], :param => "baseAmountList"
|
6
|
+
attribute :convert_to_currency_list, NodeList[CurrencyCode], :param => "convertToCurrencyList"
|
7
|
+
attribute :country_code, String, :param => "countryCode"
|
8
|
+
attribute :conversion_type, String, :param => "conversionType"
|
9
|
+
|
10
|
+
alias_params :base_amount_list, {
|
11
|
+
:currencies => :currencies
|
12
|
+
}
|
13
|
+
|
14
|
+
alias_params :first_currency, {
|
15
|
+
:amount => :amount,
|
16
|
+
:code => :code
|
17
|
+
}
|
18
|
+
|
19
|
+
def convert_to_currencies
|
20
|
+
convert_to_currency_list.collect { |info| info[:code] }
|
21
|
+
end
|
22
|
+
|
23
|
+
def convert_to_currencies=(list_of_currencies)
|
24
|
+
self.convert_to_currency_list = list_of_currencies.map { |t| { :code => t } }
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def first_currency
|
30
|
+
currencies[0] ||= CurrencyList.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ConvertCurrencyResponse < AbstractResponse
|
3
|
+
operation :ConvertCurrency
|
4
|
+
|
5
|
+
attribute :estimated_amount_table, Node[CurrencyConversionTable], :param => "estimatedAmountTable"
|
6
|
+
|
7
|
+
alias_params :estimated_amount_table, {
|
8
|
+
:currency_conversions => :currency_conversion_list
|
9
|
+
}
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ExecutePaymentRequest < AbstractRequest
|
3
|
+
operation :ExecutePayment
|
4
|
+
|
5
|
+
attribute :pay_key, String, :param => "payKey"
|
6
|
+
attribute :action_type, String, :param => "actionType"
|
7
|
+
attribute :funding_plan_id, String, :param => "fundingPlanId"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ExecutePaymentResponse < AbstractResponse
|
3
|
+
operation :ExecutePayment
|
4
|
+
|
5
|
+
attribute :payment_exec_status, String, :param => "paymentExecStatus"
|
6
|
+
attribute :pay_error_list, Node[PayErrorList], :param => "payErrorList"
|
7
|
+
|
8
|
+
alias_params :pay_error_list, {
|
9
|
+
:pay_errors => :pay_errors
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class GetPaymentOptionsResponse < AbstractResponse
|
3
|
+
operation :GetPaymentOptions
|
4
|
+
|
5
|
+
attribute :initiating_entity, Node[InitiatingEntity], :param => "initiatingEntity"
|
6
|
+
attribute :display_options, Node[DisplayOptions], :param => "displayOptions"
|
7
|
+
attribute :shipping_address_id, String, :param => "shippingAddressId"
|
8
|
+
attribute :sender_options, Node[SenderOptions], :param => "senderOptions"
|
9
|
+
attribute :receiver_options, NodeList[ReceiverOptions], :param => "receiverOptions"
|
10
|
+
|
11
|
+
alias_params :initiating_entity, {
|
12
|
+
:institution_id => :institution_id,
|
13
|
+
:customer_first_name => :customer_first_name,
|
14
|
+
:customer_last_name => :customer_last_name,
|
15
|
+
:customer_display_name => :customer_display_name,
|
16
|
+
:institution_customer_id => :institution_customer_id,
|
17
|
+
:customer_country_code => :customer_country_code,
|
18
|
+
:customer_email => :customer_email
|
19
|
+
}
|
20
|
+
|
21
|
+
alias_params :display_options, {
|
22
|
+
:email_header_image_url => :email_header_image_url,
|
23
|
+
:email_marketing_image_url => :email_marketing_image_url,
|
24
|
+
:header_image_url => :header_image_url,
|
25
|
+
:business_name => :business_name
|
26
|
+
}
|
27
|
+
|
28
|
+
alias_params :sender_options, {
|
29
|
+
:require_shipping_address_selection => :require_shipping_address_selection
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PayRequest < AbstractRequest
|
3
|
+
operation :Pay
|
4
|
+
|
5
|
+
attribute :receiver_list, Node[ReceiverList], :param => "receiverList"
|
6
|
+
attribute :action_type, String, :param => "actionType"
|
7
|
+
attribute :currency_code, String, :param => "currencyCode"
|
8
|
+
attribute :cancel_url, String, :param => "cancelUrl"
|
9
|
+
attribute :return_url, String, :param => "returnUrl"
|
10
|
+
attribute :ipn_notification_url, String, :param => "ipnNotificationUrl"
|
11
|
+
attribute :sender, Node[SenderIdentifier]
|
12
|
+
attribute :preapproval_key, String, :param => "preapprovalKey"
|
13
|
+
attribute :pin, String
|
14
|
+
attribute :reverse_parallel_payments_on_error, Boolean, :param => "reverseAllParallelPaymentsOnError"
|
15
|
+
attribute :tracking_id, String, :param => "trackingId"
|
16
|
+
attribute :memo, String
|
17
|
+
attribute :funding_constraint, Node[FundingConstraint], :param => "fundingConstraint"
|
18
|
+
attribute :client_details, Node[ClientDetailsType], :param => "clientDetails"
|
19
|
+
|
20
|
+
include ReceiverListAliases
|
21
|
+
|
22
|
+
alias_params :client_details, {
|
23
|
+
:client_ip_address => :ip_address,
|
24
|
+
:client_device_id => :device_id,
|
25
|
+
:client_application_id => :application_id,
|
26
|
+
:client_model => :model,
|
27
|
+
:client_geo_location => :geo_location,
|
28
|
+
:client_customer_type => :customer_type,
|
29
|
+
:client_partner_name => :partner_name,
|
30
|
+
:client_customer_id => :customer_id
|
31
|
+
}
|
32
|
+
|
33
|
+
alias_params :sender, {
|
34
|
+
:sender_email => :email,
|
35
|
+
:sender_phone => :phone,
|
36
|
+
:use_sender_credentials => :use_credentials
|
37
|
+
}
|
38
|
+
|
39
|
+
alias_params :sender_phone, {
|
40
|
+
:sender_phone_country_code => :country_code,
|
41
|
+
:sender_phone_number => :phone_number,
|
42
|
+
:sender_phone_extension => :extension
|
43
|
+
}
|
44
|
+
|
45
|
+
alias_params :funding_constraint, {
|
46
|
+
:allowed_funding_type => :allowed_funding_type
|
47
|
+
}
|
48
|
+
|
49
|
+
alias_params :allowed_funding_type, {
|
50
|
+
:allowed_funding_type_info => :funding_type_info
|
51
|
+
}
|
52
|
+
|
53
|
+
def allowed_funding_types
|
54
|
+
allowed_funding_type_info.collect { |info| info[:funding_type] }
|
55
|
+
end
|
56
|
+
|
57
|
+
def allowed_funding_types=(list_of_types)
|
58
|
+
self.allowed_funding_type_info = list_of_types.map { |t| { :funding_type => t } }
|
59
|
+
end
|
60
|
+
|
61
|
+
# For explicit approval, redirect the user to https://www.paypal.com/webscr?cmd=_ap-payment&paykey=value
|
62
|
+
# When paying for DIGITALGOODS, use https://paypal.com/webapps/adaptivepayment/flow/pay?paykey=
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PayResponse < AbstractResponse
|
3
|
+
operation :Pay
|
4
|
+
|
5
|
+
attribute :pay_key, String, :param => "payKey"
|
6
|
+
attribute :payment_exec_status, String, :param => "paymentExecStatus"
|
7
|
+
attribute :default_funding_plan, Node[FundingPlan], :param => "defaultFundingPlan"
|
8
|
+
attribute :pay_error_list, Node[PayErrorList], :param => "payErrorList"
|
9
|
+
|
10
|
+
alias_params :default_funding_plan, {
|
11
|
+
:funding_plan_id => :id,
|
12
|
+
:funding_amount => :amount,
|
13
|
+
:funding_currency_code => :currency_code,
|
14
|
+
:backup_funding_source => :backup_funding_source,
|
15
|
+
:sender_fees_amount => :sender_fees_amount,
|
16
|
+
:sender_fees_currency_code => :sender_fees_currency_code,
|
17
|
+
:from_currency_amount => :from_currency_amount,
|
18
|
+
:from_currency_code => :from_currency_code,
|
19
|
+
:to_currency_amount => :to_currency_amount,
|
20
|
+
:to_currency_code => :to_currency_code,
|
21
|
+
:exchange_rate => :exchange_rate,
|
22
|
+
:charges => :charges
|
23
|
+
}
|
24
|
+
|
25
|
+
alias_params :pay_error_list, {
|
26
|
+
:pay_errors => :pay_errors
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PaymentDetailsRequest < AbstractRequest
|
3
|
+
operation :PaymentDetails
|
4
|
+
|
5
|
+
attribute :pay_key, String, :param => "payKey"
|
6
|
+
attribute :transaction_id, String, :param => "transactionId"
|
7
|
+
attribute :tracking_id, String, :param => "trackingId"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PaymentDetailsResponse < AbstractResponse
|
3
|
+
operation :PaymentDetails
|
4
|
+
|
5
|
+
attribute :cancel_url, String, :param => "cancelUrl"
|
6
|
+
attribute :ipn_notification_url, String, :param => "ipnNotificationUrl"
|
7
|
+
attribute :return_url, String, :param => "returnUrl"
|
8
|
+
attribute :memo, String
|
9
|
+
attribute :currency_code, String, :param => "currencyCode"
|
10
|
+
attribute :payment_info_list, Node[PaymentInfoList], :param => "paymentInfoList"
|
11
|
+
attribute :status, String
|
12
|
+
attribute :tracking_id, String, :param => "trackingId"
|
13
|
+
attribute :pay_key, String, :param => "payKey"
|
14
|
+
attribute :action_type, String, :param => "actionType"
|
15
|
+
attribute :fees_payer, String, :param => "feesPayer"
|
16
|
+
attribute :reverse_parallel_payments_on_error, Boolean, :param => "reverseAllParallelPaymentsOnError"
|
17
|
+
attribute :preapproval_key, String, :param => "preapprovalKey"
|
18
|
+
attribute :funding_constraint, Node[FundingConstraint], :param => "fundingConstraint"
|
19
|
+
attribute :sender, Node[SenderIdentifier]
|
20
|
+
|
21
|
+
alias_params :sender, {
|
22
|
+
:sender_email => :email,
|
23
|
+
:sender_phone => :phone,
|
24
|
+
:use_sender_credentials => :use_credentials
|
25
|
+
}
|
26
|
+
|
27
|
+
alias_params :sender_phone, {
|
28
|
+
:sender_phone_country_code => :country_code,
|
29
|
+
:sender_phone_number => :phone_number,
|
30
|
+
:sender_phone_extension => :extension
|
31
|
+
}
|
32
|
+
|
33
|
+
alias_params :funding_constraint, {
|
34
|
+
:allowed_funding_type => :allowed_funding_type
|
35
|
+
}
|
36
|
+
|
37
|
+
alias_params :allowed_funding_type, {
|
38
|
+
:allowed_funding_type_info => :funding_type_info
|
39
|
+
}
|
40
|
+
|
41
|
+
alias_params :payment_info_list, {
|
42
|
+
:payments => :payment_info
|
43
|
+
}
|
44
|
+
|
45
|
+
def allowed_funding_types
|
46
|
+
allowed_funding_type_info.collect { |info| info[:funding_type] }
|
47
|
+
end
|
48
|
+
|
49
|
+
def receivers
|
50
|
+
payments.collect { |info| info[:receiver] }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PreapprovalDetailsResponse < AbstractResponse
|
3
|
+
operation :PreapprovalDetails
|
4
|
+
|
5
|
+
attribute :approved, Boolean
|
6
|
+
attribute :cancel_url, String, :param => "cancelUrl"
|
7
|
+
attribute :return_url, String, :param => "returnUrl"
|
8
|
+
attribute :ipn_notification_url, String, :param => "ipnNotificationUrl"
|
9
|
+
attribute :currency_code, String, :param => "currencyCode"
|
10
|
+
attribute :max_total_amount, Decimal, :param => "maxTotalAmountOfAllPayments"
|
11
|
+
attribute :starting_date, DateTime, :param => "startingDate"
|
12
|
+
attribute :ending_date, DateTime, :param => "endingDate"
|
13
|
+
attribute :max_amount_per_payment, Decimal, :param => "maxAmountPerPayment"
|
14
|
+
attribute :max_payments, Integer, :param => "maxNumberOfPayments"
|
15
|
+
attribute :max_payments_per_period, Integer, :param => "maxNumberOfPaymentsPerPeriod"
|
16
|
+
attribute :payment_period, String, :param => "paymentPeriod"
|
17
|
+
attribute :current_payments, Integer, :param => "curPayments"
|
18
|
+
attribute :current_payments_amount, Decimal, :param => "curPaymentsAmount"
|
19
|
+
attribute :current_period_attempts, Integer, :param => "curPeriodAttempts"
|
20
|
+
attribute :current_period_ending_date, DateTime, :param => "curPeriodEndingDate"
|
21
|
+
attribute :date_of_month, Integer, :param => "dateOfMonth"
|
22
|
+
attribute :day_of_week, String, :param => "dayOfWeek"
|
23
|
+
attribute :pin_type, String, :param => "pinType"
|
24
|
+
attribute :sender_email, String, :param => "senderEmail"
|
25
|
+
attribute :memo, String
|
26
|
+
attribute :status, String
|
27
|
+
attribute :fees_payer, String, :param => "feesPayer"
|
28
|
+
attribute :display_max_total_amount, Boolean, :param => "displayMaxTotalAmount"
|
29
|
+
attribute :address_list, Node[AddressList], :param => "addressList"
|
30
|
+
|
31
|
+
alias_params :address_list, {
|
32
|
+
:addresses => :addresses
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PreapprovalRequest < AbstractRequest
|
3
|
+
operation :Preapproval
|
4
|
+
|
5
|
+
attribute :client_details, Node[ClientDetailsType], :param => "clientDetails"
|
6
|
+
attribute :ending_date, DateTime, :param => "endingDate"
|
7
|
+
attribute :starting_date, DateTime, :param => "startingDate"
|
8
|
+
attribute :max_total_amount, Decimal, :param => "maxTotalAmountOfAllPayments"
|
9
|
+
attribute :currency_code, String, :param => "currencyCode"
|
10
|
+
attribute :cancel_url, String, :param => "cancelUrl"
|
11
|
+
attribute :return_url, String, :param => "returnUrl"
|
12
|
+
attribute :ipn_notification_url, String, :param => "ipnNotificationUrl"
|
13
|
+
attribute :date_of_month, Integer, :param => "dateOfMonth"
|
14
|
+
attribute :day_of_week, String, :param => "dayOfWeek"
|
15
|
+
attribute :max_amount_per_payment, Decimal, :param => "maxAmountPerPayment"
|
16
|
+
attribute :max_payments, Integer, :param => "maxNumberOfPayments"
|
17
|
+
attribute :max_payments_per_period, Integer, :param => "maxNumberOfPaymentsPerPeriod"
|
18
|
+
attribute :payment_period, String, :param => "paymentPeriod"
|
19
|
+
attribute :memo, String
|
20
|
+
attribute :sender_email, String, :param => "senderEmail"
|
21
|
+
attribute :pin_type, String, :param => "pinType"
|
22
|
+
attribute :fees_payer, String, :param => "feesPayer"
|
23
|
+
attribute :display_max_total_amount, Boolean, :param => "displayMaxTotalAmount"
|
24
|
+
|
25
|
+
alias_params :client_details, {
|
26
|
+
:client_ip_address => :ip_address,
|
27
|
+
:client_device_id => :device_id,
|
28
|
+
:client_application_id => :application_id,
|
29
|
+
:client_model => :model,
|
30
|
+
:client_geo_location => :geo_location,
|
31
|
+
:client_customer_type => :customer_type,
|
32
|
+
:client_partner_name => :partner_name,
|
33
|
+
:client_customer_id => :customer_id
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class RefundRequest < AbstractRequest
|
3
|
+
operation :Refund
|
4
|
+
|
5
|
+
attribute :currency_code, String, :param => "currencyCode"
|
6
|
+
attribute :pay_key, String, :param => "payKey"
|
7
|
+
attribute :tracking_id, String, :param => "trackingId"
|
8
|
+
attribute :transaction_id, String, :param => "transactionId"
|
9
|
+
attribute :receiver_list, Node[ReceiverList], :param => "receiverList"
|
10
|
+
attribute :ipn_notification_url, String, :param => "ipnNotificationUrl"
|
11
|
+
|
12
|
+
include ReceiverListAliases
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class RefundResponse < AbstractResponse
|
3
|
+
operation :Refund
|
4
|
+
|
5
|
+
attribute :currency_code, String, :param => "currencyCode"
|
6
|
+
attribute :refund_info_list, Node[RefundInfoList], :param => "refundInfoList"
|
7
|
+
|
8
|
+
alias_params :refund_info_list, {
|
9
|
+
:refund_info => :refund_info
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|