payment_recipes 1.0.1 → 1.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/lib/payment_recipes/paypal/rest/action/capture_authorization.rb +27 -0
- data/lib/payment_recipes/paypal/rest/action/create_payment.rb +73 -0
- data/lib/payment_recipes/paypal/rest/action/execute_payment.rb +25 -0
- data/lib/payment_recipes/paypal/rest/action/refund_capture.rb +24 -0
- data/lib/payment_recipes/paypal/rest/action/refund_sale.rb +24 -0
- data/lib/payment_recipes/paypal/rest/action/void_authorization.rb +24 -0
- data/lib/payment_recipes/paypal/rest/authorization.rb +172 -0
- data/lib/payment_recipes/paypal/rest/capture.rb +140 -0
- data/lib/payment_recipes/paypal/rest/payer.rb +38 -0
- data/lib/payment_recipes/paypal/rest/payment.rb +126 -0
- data/lib/payment_recipes/paypal/rest/refund.rb +160 -0
- data/lib/payment_recipes/paypal/rest/sale.rb +172 -0
- data/lib/payment_recipes/paypal/rest/settings.rb +18 -0
- data/lib/payment_recipes/paypal/rest/transaction.rb +118 -0
- data/lib/payment_recipes/paypal/soap/action/capture_authorization.rb +104 -0
- data/lib/payment_recipes/paypal/soap/action/create_express_checkout_payment.rb +76 -0
- data/lib/payment_recipes/paypal/soap/action/execute_express_checkout_payment.rb +131 -0
- data/lib/payment_recipes/paypal/soap/action/perform_direct_payment.rb +62 -0
- data/lib/payment_recipes/paypal/soap/settings.rb +22 -0
- data/lib/payment_recipes/paypal/soap/transaction.rb +116 -0
- data/lib/payment_recipes/utils/action.rb +145 -8
- data/lib/payment_recipes/version.rb +1 -1
- data/lib/payment_recipes.rb +24 -15
- metadata +37 -17
- data/lib/payment_recipes/paypal/action/capture_authorization.rb +0 -25
- data/lib/payment_recipes/paypal/action/create_payment.rb +0 -66
- data/lib/payment_recipes/paypal/action/execute_payment.rb +0 -17
- data/lib/payment_recipes/paypal/action/refund_capture.rb +0 -22
- data/lib/payment_recipes/paypal/action/refund_sale.rb +0 -22
- data/lib/payment_recipes/paypal/action/void_authorization.rb +0 -22
- data/lib/payment_recipes/paypal/authorization.rb +0 -170
- data/lib/payment_recipes/paypal/capture.rb +0 -138
- data/lib/payment_recipes/paypal/payer.rb +0 -36
- data/lib/payment_recipes/paypal/payment.rb +0 -124
- data/lib/payment_recipes/paypal/refund.rb +0 -158
- data/lib/payment_recipes/paypal/sale.rb +0 -170
- data/lib/payment_recipes/paypal/settings.rb +0 -14
- data/lib/payment_recipes/paypal/transaction.rb +0 -116
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
module PaymentRecipes
|
|
2
|
+
module PayPal
|
|
3
|
+
module REST
|
|
4
|
+
class Refund
|
|
5
|
+
attr_reader :id
|
|
6
|
+
attr_reader :currency
|
|
7
|
+
attr_reader :total
|
|
8
|
+
attr_reader :payment
|
|
9
|
+
attr_reader :payment_id
|
|
10
|
+
attr_reader :state
|
|
11
|
+
|
|
12
|
+
attr_reader :create_time
|
|
13
|
+
attr_reader :update_time
|
|
14
|
+
|
|
15
|
+
attr_reader :sale_id
|
|
16
|
+
attr_reader :sale
|
|
17
|
+
|
|
18
|
+
attr_reader :capture_id
|
|
19
|
+
attr_reader :capture
|
|
20
|
+
|
|
21
|
+
attr_reader :raw_refund
|
|
22
|
+
|
|
23
|
+
include ::PaymentRecipes::Utils::Converters
|
|
24
|
+
include ::PaymentRecipes::Utils::Equality
|
|
25
|
+
|
|
26
|
+
def initialize(paypal_refund, payment: nil)
|
|
27
|
+
unless paypal_refund.is_a?(::PayPal::SDK::REST::DataTypes::Refund)
|
|
28
|
+
raise Exception, "#{ self.class.name } must be initialized with a PayPal Refund"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if payment
|
|
32
|
+
unless payment.is_a?(::PaymentRecipes::PayPal::REST::Payment)
|
|
33
|
+
raise Exception, "Parameter payment must be a PaymentRecipes::PayPal::Payment"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
@payment = payment
|
|
37
|
+
@payment_id = payment.id
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
extract_and_store(paypal_refund)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def reload!
|
|
44
|
+
paypal_refund = self.class.find_raw(@id)
|
|
45
|
+
extract_and_store(paypal_refund)
|
|
46
|
+
|
|
47
|
+
self
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def reload_payment!
|
|
51
|
+
@payment = ::PaymentRecipes::PayPal::REST::Payment.find(@payment_id)
|
|
52
|
+
|
|
53
|
+
@payment
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def reload_sale!
|
|
57
|
+
return unless @sale_id
|
|
58
|
+
|
|
59
|
+
@sale = ::PaymentRecipes::PayPal::REST::Sale.find(@sale_id)
|
|
60
|
+
|
|
61
|
+
@sale
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def reload_capture!
|
|
65
|
+
return unless @capture_id
|
|
66
|
+
|
|
67
|
+
@capture = ::PaymentRecipes::PayPal::REST::Capture.find(@capture_id)
|
|
68
|
+
|
|
69
|
+
@capture
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def payment
|
|
73
|
+
reload_payment! unless @payment
|
|
74
|
+
|
|
75
|
+
@payment
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def capture
|
|
79
|
+
reload_capture! unless @capture
|
|
80
|
+
|
|
81
|
+
@capture
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def sale
|
|
85
|
+
reload_sale! unless @sale
|
|
86
|
+
|
|
87
|
+
@sale
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def authorizations
|
|
91
|
+
payment.authorizations
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def authorization
|
|
95
|
+
payment.authorization
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def pending?
|
|
99
|
+
@state == :pending
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def completed?
|
|
103
|
+
@state == :completed
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def failed?
|
|
107
|
+
@state == :failed
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def inspect
|
|
111
|
+
to_str
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def to_s
|
|
115
|
+
to_str
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def to_str
|
|
119
|
+
"<#{ self.class.name } total=#{ @total.format } state=#{ @state } id=#{ @id }>"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
class << self
|
|
123
|
+
def find(id)
|
|
124
|
+
paypal_refund = find_raw(id)
|
|
125
|
+
|
|
126
|
+
if paypal_refund
|
|
127
|
+
new(paypal_refund, payment: nil)
|
|
128
|
+
else
|
|
129
|
+
nil
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def find_raw(id)
|
|
134
|
+
begin
|
|
135
|
+
::PayPal::SDK::REST::Refund.find(id)
|
|
136
|
+
|
|
137
|
+
rescue ::PayPal::SDK::Core::Exceptions::ResourceNotFound
|
|
138
|
+
nil
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def extract_and_store(paypal_refund)
|
|
144
|
+
@id = convert_to_string(paypal_refund.id)
|
|
145
|
+
@currency = convert_to_string(paypal_refund.amount.currency)
|
|
146
|
+
@total = convert_to_money(amount: paypal_refund.amount.total, currency: paypal_refund.amount.currency)
|
|
147
|
+
@payment_id = convert_to_string(paypal_refund.parent_payment)
|
|
148
|
+
@state = convert_to_symbol(paypal_refund.state)
|
|
149
|
+
|
|
150
|
+
@create_time = convert_to_time(paypal_refund.create_time)
|
|
151
|
+
@update_time = convert_to_time(paypal_refund.update_time)
|
|
152
|
+
|
|
153
|
+
@sale_id = convert_to_string(paypal_refund.sale_id)
|
|
154
|
+
@capture_id = convert_to_string(paypal_refund.capture_id)
|
|
155
|
+
@raw_refund = paypal_refund
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
module PaymentRecipes
|
|
2
|
+
module PayPal
|
|
3
|
+
module REST
|
|
4
|
+
class Sale
|
|
5
|
+
attr_reader :currency
|
|
6
|
+
attr_reader :total
|
|
7
|
+
attr_reader :create_time
|
|
8
|
+
attr_reader :id
|
|
9
|
+
attr_reader :payment
|
|
10
|
+
attr_reader :payment_id
|
|
11
|
+
attr_reader :state
|
|
12
|
+
attr_reader :update_time
|
|
13
|
+
|
|
14
|
+
attr_reader :transaction_fee
|
|
15
|
+
attr_reader :payment_mode
|
|
16
|
+
attr_reader :protection_eligibility
|
|
17
|
+
attr_reader :protection_eligibility_type
|
|
18
|
+
|
|
19
|
+
attr_reader :expanded
|
|
20
|
+
attr_reader :raw_sale
|
|
21
|
+
|
|
22
|
+
include ::PaymentRecipes::Utils::Converters
|
|
23
|
+
include ::PaymentRecipes::Utils::Equality
|
|
24
|
+
|
|
25
|
+
def initialize(paypal_sale, payment: nil, expanded: false)
|
|
26
|
+
unless paypal_sale.is_a?(::PayPal::SDK::REST::DataTypes::Sale)
|
|
27
|
+
raise Exception, "#{ self.class.name } must be initialized with a PayPal Sale"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if payment
|
|
31
|
+
unless payment.is_a?(::PaymentRecipes::PayPal::REST::Payment)
|
|
32
|
+
raise Exception, "Parameter payment must be a PaymentRecipes::PayPal::Payment"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
@payment = payment
|
|
36
|
+
@payment_id = payment.id
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
extract_and_store(paypal_sale)
|
|
40
|
+
@expanded = expanded
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def reload!
|
|
44
|
+
paypal_sale = self.class.find_raw(@id)
|
|
45
|
+
extract_and_store(paypal_sale)
|
|
46
|
+
@expanded = true
|
|
47
|
+
|
|
48
|
+
self
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def reload_payment!
|
|
52
|
+
@payment = ::PaymentRecipes::PayPal::REST::Payment.find(@payment_id)
|
|
53
|
+
|
|
54
|
+
@payment
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def payment
|
|
58
|
+
reload_payment! unless @payment
|
|
59
|
+
|
|
60
|
+
@payment
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def transaction_fee
|
|
64
|
+
reload! unless @transaction_fee
|
|
65
|
+
|
|
66
|
+
@transaction_fee
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def payment_mode
|
|
70
|
+
reload! unless @payment_mode
|
|
71
|
+
|
|
72
|
+
@payment_mode
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def protection_eligibility
|
|
76
|
+
reload! unless @protection_eligibility
|
|
77
|
+
|
|
78
|
+
@protection_eligibility
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def protection_eligibility_type
|
|
82
|
+
reload! unless @protection_eligibility_type
|
|
83
|
+
|
|
84
|
+
@protection_eligibility_type
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def refunds
|
|
88
|
+
payment.refunds.select do |refund|
|
|
89
|
+
refund.sale_id == @id
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def refund
|
|
94
|
+
refunds.first
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def inspect
|
|
98
|
+
to_str
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def to_s
|
|
102
|
+
to_str
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def to_str
|
|
106
|
+
"<#{ self.class.name } total=#{ @total.format } state=#{ @state } id=#{ @id }>"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def can_be_refunded?
|
|
110
|
+
completed?
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def completed?
|
|
114
|
+
@state == :completed
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def partially_refunded?
|
|
118
|
+
@state == :partially_refunded
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def pending?
|
|
122
|
+
@state == :pending
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def refunded?
|
|
126
|
+
@state == :refunded
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def denied?
|
|
130
|
+
@state == :denied
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
class << self
|
|
134
|
+
def find(id)
|
|
135
|
+
paypal_sale = find_raw(id)
|
|
136
|
+
|
|
137
|
+
if paypal_sale
|
|
138
|
+
new(paypal_sale, payment: nil, expanded: true)
|
|
139
|
+
else
|
|
140
|
+
nil
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def find_raw(id)
|
|
145
|
+
begin
|
|
146
|
+
::PayPal::SDK::REST::Sale.find(id)
|
|
147
|
+
|
|
148
|
+
rescue ::PayPal::SDK::Core::Exceptions::ResourceNotFound
|
|
149
|
+
nil
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def extract_and_store(paypal_sale)
|
|
155
|
+
@currency = convert_to_string(paypal_sale.amount.currency)
|
|
156
|
+
@total = convert_to_money(amount: paypal_sale.amount.total, currency: @currency)
|
|
157
|
+
@create_time = convert_to_time(paypal_sale.create_time)
|
|
158
|
+
@update_time = convert_to_time(paypal_sale.update_time)
|
|
159
|
+
@id = convert_to_string(paypal_sale.id)
|
|
160
|
+
@payment_id = convert_to_string(paypal_sale.parent_payment)
|
|
161
|
+
@state = convert_to_symbol(paypal_sale.state)
|
|
162
|
+
@raw_sale = paypal_sale
|
|
163
|
+
|
|
164
|
+
@transaction_fee = convert_to_money(amount: paypal_sale.transaction_fee.value, currency: paypal_sale.transaction_fee.currency)
|
|
165
|
+
@payment_mode = convert_to_string(paypal_sale.payment_mode)
|
|
166
|
+
@protection_eligibility = convert_to_string(paypal_sale.protection_eligibility)
|
|
167
|
+
@protection_eligibility_type = convert_to_string(paypal_sale.protection_eligibility_type)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module PaymentRecipes
|
|
2
|
+
module PayPal
|
|
3
|
+
module REST
|
|
4
|
+
module Settings
|
|
5
|
+
def self.configure(live: false, client_id:, client_secret:)
|
|
6
|
+
mode = live ? "live" : "sandbox"
|
|
7
|
+
|
|
8
|
+
::PayPal::SDK.configure(
|
|
9
|
+
:mode => mode,
|
|
10
|
+
:client_id => client_id,
|
|
11
|
+
:client_secret => client_secret,
|
|
12
|
+
:ssl_options => { }
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
module PaymentRecipes
|
|
2
|
+
module PayPal
|
|
3
|
+
module REST
|
|
4
|
+
class Transaction
|
|
5
|
+
attr_reader :currency
|
|
6
|
+
attr_reader :total
|
|
7
|
+
attr_reader :payment
|
|
8
|
+
attr_reader :payment_id
|
|
9
|
+
attr_reader :description
|
|
10
|
+
|
|
11
|
+
attr_reader :subtotal
|
|
12
|
+
attr_reader :tax
|
|
13
|
+
attr_reader :fee
|
|
14
|
+
attr_reader :shipping
|
|
15
|
+
attr_reader :handling_fee
|
|
16
|
+
attr_reader :insurance
|
|
17
|
+
attr_reader :shipping_discount
|
|
18
|
+
attr_reader :insurance
|
|
19
|
+
attr_reader :gift_wrap
|
|
20
|
+
|
|
21
|
+
attr_reader :sales
|
|
22
|
+
attr_reader :authorizations
|
|
23
|
+
attr_reader :captures
|
|
24
|
+
attr_reader :refunds
|
|
25
|
+
|
|
26
|
+
attr_reader :raw_transaction
|
|
27
|
+
|
|
28
|
+
include ::PaymentRecipes::Utils::Converters
|
|
29
|
+
|
|
30
|
+
def initialize(paypal_transaction, payment:, expand: false)
|
|
31
|
+
unless paypal_transaction.is_a?(::PayPal::SDK::REST::DataTypes::Transaction)
|
|
32
|
+
raise Exception, "#{ self.class.name } must be initialized with a PayPal Transaction"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
unless payment.is_a?(::PaymentRecipes::PayPal::REST::Payment)
|
|
36
|
+
raise Exception, "Parameter payment must be a PaymentRecipes::PayPal::REST::Payment"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@currency = convert_to_string(paypal_transaction.amount.currency)
|
|
40
|
+
@total = convert_to_money(amount: paypal_transaction.amount.total, currency: @currency)
|
|
41
|
+
@description = convert_to_string(paypal_transaction.description)
|
|
42
|
+
@payment = payment
|
|
43
|
+
@payment_id = payment.id
|
|
44
|
+
|
|
45
|
+
@subtotal = convert_to_money(amount: paypal_transaction.amount.details.subtotal, currency: @currency)
|
|
46
|
+
@tax = convert_to_money(amount: paypal_transaction.amount.details.tax, currency: @currency)
|
|
47
|
+
@fee = convert_to_money(amount: paypal_transaction.amount.details.fee, currency: @currency)
|
|
48
|
+
@shipping = convert_to_money(amount: paypal_transaction.amount.details.shipping, currency: @currency)
|
|
49
|
+
@handling_fee = convert_to_money(amount: paypal_transaction.amount.details.handling_fee, currency: @currency)
|
|
50
|
+
@insurance = convert_to_money(amount: paypal_transaction.amount.details.insurance, currency: @currency)
|
|
51
|
+
@shipping_discount = convert_to_money(amount: paypal_transaction.amount.details.shipping_discount, currency: @currency)
|
|
52
|
+
@insurance = convert_to_money(amount: paypal_transaction.amount.details.insurance, currency: @currency)
|
|
53
|
+
@gift_wrap = convert_to_money(amount: paypal_transaction.amount.details.gift_wrap, currency: @currency)
|
|
54
|
+
@raw_transaction = paypal_transaction
|
|
55
|
+
|
|
56
|
+
@sales = []
|
|
57
|
+
@authorizations = []
|
|
58
|
+
@captures = []
|
|
59
|
+
@refunds = []
|
|
60
|
+
|
|
61
|
+
paypal_transaction.related_resources.each do |paypal_related_resource|
|
|
62
|
+
if paypal_related_resource.sale.id
|
|
63
|
+
sale = ::PaymentRecipes::PayPal::REST::Sale.new(paypal_related_resource.sale, payment: payment)
|
|
64
|
+
sale.reload! if expand
|
|
65
|
+
|
|
66
|
+
@sales << sale
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if paypal_related_resource.authorization.id
|
|
70
|
+
authorization = ::PaymentRecipes::PayPal::REST::Authorization.new(paypal_related_resource.authorization, payment: payment)
|
|
71
|
+
authorization.reload! if expand
|
|
72
|
+
|
|
73
|
+
@authorizations << authorization
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
if paypal_related_resource.capture.id
|
|
77
|
+
capture = ::PaymentRecipes::PayPal::REST::Capture.new(paypal_related_resource.capture, payment: payment)
|
|
78
|
+
@captures << capture
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if paypal_related_resource.refund.id
|
|
82
|
+
refund = ::PaymentRecipes::PayPal::REST::Refund.new(paypal_related_resource.refund, payment: payment)
|
|
83
|
+
@refunds << refund
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def sale
|
|
89
|
+
@sales.first
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def authorization
|
|
93
|
+
@authorizations.first
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def capture
|
|
97
|
+
@captures.first
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def refund
|
|
101
|
+
@refunds.first
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def inspect
|
|
105
|
+
to_str
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def to_s
|
|
109
|
+
to_str
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def to_str
|
|
113
|
+
"<#{ self.class.name } total=#{ @total.format } sales=#{ @sales.size } authorizations=#{ @authorizations.size } captures=#{ @captures.size }>"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PayPal::SDK::Merchant::DataTypes::DoCaptureResponseType
|
|
3
|
+
├── Ack: Success
|
|
4
|
+
├── Build: ***
|
|
5
|
+
├── CorrelationID: ***
|
|
6
|
+
├── DoCaptureResponseDetails: PayPal::SDK::Merchant::DataTypes::DoCaptureResponseDetailsType
|
|
7
|
+
│ ├── AuthorizationID: ***
|
|
8
|
+
│ └── PaymentInfo: PayPal::SDK::Merchant::DataTypes::PaymentInfoType
|
|
9
|
+
│ ├── ExchangeRate: nil
|
|
10
|
+
│ ├── FeeAmount: PayPal::SDK::Merchant::DataTypes::BasicAmountType
|
|
11
|
+
│ │ ├── currencyID: USD
|
|
12
|
+
│ │ └── value: 0.33
|
|
13
|
+
│ │
|
|
14
|
+
│ ├── GrossAmount: PayPal::SDK::Merchant::DataTypes::BasicAmountType
|
|
15
|
+
│ │ ├── currencyID: USD
|
|
16
|
+
│ │ └── value: 1.00
|
|
17
|
+
│ │
|
|
18
|
+
│ ├── ParentTransactionID: ***
|
|
19
|
+
│ ├── PaymentDate: 2017-02-05T18:15:36+00:00
|
|
20
|
+
│ ├── PaymentStatus: Completed
|
|
21
|
+
│ ├── PaymentType: instant
|
|
22
|
+
│ ├── PendingReason: none
|
|
23
|
+
│ ├── ProtectionEligibility: Ineligible
|
|
24
|
+
│ ├── ProtectionEligibilityType: None
|
|
25
|
+
│ ├── ReasonCode: none
|
|
26
|
+
│ ├── ReceiptID: 5351-7638-9795-5628
|
|
27
|
+
│ ├── TaxAmount: PayPal::SDK::Merchant::DataTypes::BasicAmountType
|
|
28
|
+
│ │ ├── currencyID: USD
|
|
29
|
+
│ │ └── value: 0.00
|
|
30
|
+
│ │
|
|
31
|
+
│ ├── TransactionID: ***
|
|
32
|
+
│ └── TransactionType: web-accept
|
|
33
|
+
│
|
|
34
|
+
├── Timestamp: 2017-02-05T18:15:37+00:00
|
|
35
|
+
└── Version: 106.0
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
module PaymentRecipes
|
|
39
|
+
module PayPal
|
|
40
|
+
module SOAP
|
|
41
|
+
module Action
|
|
42
|
+
class CaptureAuthorization < PaymentRecipes::Utils::Action
|
|
43
|
+
variable :authorization_id, "String"
|
|
44
|
+
variable :amount, "Hash"
|
|
45
|
+
|
|
46
|
+
def perform
|
|
47
|
+
prepare_soap_api
|
|
48
|
+
|
|
49
|
+
do_capture_authorization
|
|
50
|
+
|
|
51
|
+
if response.success?
|
|
52
|
+
load_transaction
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
response
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def prepare_soap_api
|
|
59
|
+
store(:api) do
|
|
60
|
+
::PaymentRecipes::PayPal::SOAP::Settings.api
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def response
|
|
65
|
+
do_capture_response
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def do_capture_authorization
|
|
69
|
+
do_capture = api.build_do_capture({
|
|
70
|
+
:AuthorizationID => authorization_id,
|
|
71
|
+
:Amount => amount,
|
|
72
|
+
:CompleteType => "Complete" })
|
|
73
|
+
|
|
74
|
+
store(:do_capture_response) do
|
|
75
|
+
capture_response = api.do_capture(do_capture)
|
|
76
|
+
|
|
77
|
+
unless capture_response.success?
|
|
78
|
+
@error = capture_response.errors
|
|
79
|
+
|
|
80
|
+
capture_response = nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
capture_response
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def load_transaction
|
|
88
|
+
store(:authorization_transaction) do
|
|
89
|
+
::PaymentRecipes::PayPal::SOAP::Transaction.find(authorization_id)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
store(:capture_transaction) do
|
|
93
|
+
::PaymentRecipes::PayPal::SOAP::Transaction.find(capture_id)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def capture_id
|
|
98
|
+
response.do_capture_response_details.payment_info.transaction_id
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module PaymentRecipes
|
|
2
|
+
module PayPal
|
|
3
|
+
module SOAP
|
|
4
|
+
module Action
|
|
5
|
+
class CreateExpressCheckout < PaymentRecipes::Utils::Action
|
|
6
|
+
variable :details, "Hash"
|
|
7
|
+
variable :intent, "Symbol"
|
|
8
|
+
|
|
9
|
+
def perform
|
|
10
|
+
prepare_soap_api
|
|
11
|
+
modify_details
|
|
12
|
+
set_express_checkout
|
|
13
|
+
|
|
14
|
+
get_express_checkout_url
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def prepare_soap_api
|
|
18
|
+
store(:api) do
|
|
19
|
+
::PaymentRecipes::PayPal::SOAP::Settings.api
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def modify_details
|
|
24
|
+
unless [:sale, :authorize].include?(intent)
|
|
25
|
+
raise Exception, "Allowed values for intent: :sale, :authorize"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
store(:express_checkout_details) do
|
|
29
|
+
payment_action = if intent == :sale
|
|
30
|
+
'Sale'
|
|
31
|
+
elsif intent == :authorize
|
|
32
|
+
'Authorization'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
details[:SetExpressCheckoutRequestDetails][:PaymentDetails][0][:PaymentAction] = payment_action
|
|
36
|
+
|
|
37
|
+
details
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def set_express_checkout
|
|
42
|
+
set_express_checkout = api.build_set_express_checkout(express_checkout_details)
|
|
43
|
+
|
|
44
|
+
store(:set_express_checkout_response) do
|
|
45
|
+
response = api.set_express_checkout(set_express_checkout)
|
|
46
|
+
|
|
47
|
+
unless response.success?
|
|
48
|
+
@error = response.errors
|
|
49
|
+
|
|
50
|
+
response = nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
response
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def response
|
|
58
|
+
set_express_checkout_response
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_express_checkout_url
|
|
62
|
+
store(:express_checkout_redirect_url) do
|
|
63
|
+
if set_express_checkout_response
|
|
64
|
+
api.express_checkout_url(set_express_checkout_response)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def redirect_url
|
|
70
|
+
express_checkout_redirect_url
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|