ruby-paypal 0.0.4 → 0.0.5
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/lib/ruby-paypal/paypal.rb +292 -11
- metadata +14 -10
data/lib/ruby-paypal/paypal.rb
CHANGED
@@ -6,7 +6,7 @@ require 'ruby-paypal/credit_card_checks'
|
|
6
6
|
|
7
7
|
SANDBOX_SERVER = 'api-3t.sandbox.paypal.com/nvp'
|
8
8
|
PRODUCTION_SERVER = 'api-3t.paypal.com/nvp'
|
9
|
-
API_VERSION = '
|
9
|
+
API_VERSION = '56.0'
|
10
10
|
|
11
11
|
module Net
|
12
12
|
#
|
@@ -59,13 +59,16 @@ end
|
|
59
59
|
|
60
60
|
|
61
61
|
=begin rdoc
|
62
|
-
Author::
|
63
|
-
|
62
|
+
Author:: Chang Sau Sheong (mailto:sausheong.chang@gmail.com)
|
63
|
+
Author:: Philippe F. Monnet (mailto:pfmonnet@gmail.com)
|
64
|
+
Copyright:: Copyright (c) 2007-2009 Chang Sau Sheong & Philippe F. Monnet
|
64
65
|
License:: Distributes under the same terms as Ruby
|
65
|
-
Version:: 0.0.
|
66
|
+
Version:: 0.0.5
|
67
|
+
|
68
|
+
:main: Paypal
|
66
69
|
|
67
70
|
=Installing Ruby-PayPal
|
68
|
-
A lightweight ruby wrapper for PayPal NVP APIs. To install type the following
|
71
|
+
A lightweight ruby wrapper for PayPal NVP (Name-Value Pair) APIs. To install type the following
|
69
72
|
at the command line:
|
70
73
|
|
71
74
|
$ gem install ruby-paypal
|
@@ -74,13 +77,18 @@ at the command line:
|
|
74
77
|
=Using Ruby-PayPal
|
75
78
|
It's critical that you understand how PayPal works and how the PayPal NVP API
|
76
79
|
works. You should be relatively well-versed in the NVP API Developer Guide and
|
77
|
-
Reference
|
80
|
+
Reference - see:
|
81
|
+
- https://www.paypal.com/en_US/ebook/PP_NVPAPI_DeveloperGuide/index.html
|
82
|
+
- https://cms.paypal.com/us/cgi-bin/?&cmd=_render-content&content_ID=developer/e_howto_api_soap_NVPAPIOverview
|
83
|
+
|
78
84
|
You should also visit and register yourself with the PayPal Developer Network
|
79
85
|
and get a Sandbox account with in the PayPal Development Central
|
80
86
|
(https://developer.paypal.com/).
|
81
87
|
|
82
88
|
Note that this library only supports the API signature method of securing the API credentials.
|
83
89
|
|
90
|
+
By setting Paypal.debug=true, the API will "pretty-print" the PayPal parameters to the console.
|
91
|
+
|
84
92
|
==Direct Payment
|
85
93
|
To use credit card payment through PayPal, you need to use the DoDirectPayment APIs:
|
86
94
|
|
@@ -114,14 +122,144 @@ To use the customer's PayPal account for payment, you will need to use the Expre
|
|
114
122
|
|
115
123
|
<to be documented>
|
116
124
|
|
117
|
-
|
118
|
-
|
125
|
+
==PayPal Subscriptions
|
126
|
+
|
127
|
+
PayPal Subscriptions is a service offering allowing you to sell subscriptions, consisting of an initial payment followed by
|
128
|
+
several recurring payments. For a good technical overview, review the following guide:
|
129
|
+
- https://www.paypal.com/en_US/ebook/PP_ExpressCheckout_IntegrationGuide/RecurringPayments.html
|
130
|
+
|
131
|
+
Using the subscriptions service involve understanding the series of exchanges to perform using the NVP API.
|
132
|
+
There are 3 key phases of a subscription:
|
133
|
+
1. Creating a subscription request (and button for the customer)
|
134
|
+
2. Customer review and confirmation on the PayPal site
|
135
|
+
3. Processing of a subscription agreement
|
136
|
+
Each phase involves specific APIs.
|
137
|
+
|
138
|
+
===Phase 1 - Subscription Request
|
139
|
+
In this phase, the do_set_express_checkout method will be called. PayPal will return a token we can use in subsequent API calls.
|
140
|
+
|
141
|
+
Let's create a subcription request with the details of our subscription:
|
142
|
+
|
143
|
+
subscription_request = create_monthly_subscription_request(
|
144
|
+
name='_Why's Ruby Camping Adventures',
|
145
|
+
id='MNWRCA',
|
146
|
+
description='_Why's Ruby Camping Adventures - Monthly Tips And Tricks For Camping Development',
|
147
|
+
invoice_number='INV20091122',
|
148
|
+
amount='5.00')
|
149
|
+
|
150
|
+
Let's call do_set_express_checkout to get a token back:
|
151
|
+
|
152
|
+
response = paypal.do_set_express_checkout(
|
153
|
+
return_url='http://www.yoursite.com/subscription-confirmed',
|
154
|
+
cancel_url='http://www.yoursite.com/subscription-aborted',
|
155
|
+
amount='5.00',
|
156
|
+
other_params=subscription_request)
|
157
|
+
|
158
|
+
token = (response.ack == 'Success') ? response['TOKEN'] : ''
|
159
|
+
|
160
|
+
Let's use the token to create a PayPal button to request payment via the sandbox:
|
161
|
+
|
162
|
+
form( { :method => 'post' ,
|
163
|
+
:action => 'https://www.sandbox.paypal.com/cgi-bin/webscr' #sandbox
|
164
|
+
} ) do
|
165
|
+
|
166
|
+
input :id => 'cmd', :name => 'cmd', :type => 'hidden',
|
167
|
+
:value => "_express-checkout";
|
168
|
+
|
169
|
+
input :id => 'token', :name => 'token', :type => 'hidden',
|
170
|
+
:value => "#{token}";
|
171
|
+
|
172
|
+
input :id => 'submit_subscription_request', :name => 'submit', :type => 'submit',
|
173
|
+
:value => 'Subscribe Via PayPal'
|
174
|
+
end #form
|
175
|
+
|
176
|
+
===Phase 2 - Customer Review and Confirmation
|
177
|
+
|
178
|
+
The customer will see the details of the subscription agreement we created previously.
|
179
|
+
Upon confirmation, PayPal will redirect the customer to the return_url we specified passing
|
180
|
+
the token back as well as the payerid.
|
119
181
|
|
182
|
+
===Phase 3 = Subscription Processing
|
183
|
+
|
184
|
+
First we will retrieve the details of the check-out:
|
185
|
+
|
186
|
+
response = paypal.do_get_express_checkout_details(token)
|
187
|
+
|
188
|
+
Then we will execute the actual payment:
|
189
|
+
|
190
|
+
response = paypal.do_express_checkout_payment(token=token,
|
191
|
+
payment_action='Sale',
|
192
|
+
payer_id=payerid,
|
193
|
+
amount='5.00')
|
194
|
+
|
195
|
+
transaction_id = response['TRANSACTIONID']
|
196
|
+
|
197
|
+
Now we can create the actual PayPal subscription
|
198
|
+
|
199
|
+
response = @paypal.do_create_recurring_payments_profile(token,
|
200
|
+
start_date='2009-11-22 14:30:10',
|
201
|
+
profile_reference='INV20091122',
|
202
|
+
description='_Why's Ruby Camping Adventures - Monthly Tips And Tricks For Camping Development',
|
203
|
+
billing_period='Month',
|
204
|
+
billing_frequency=1,
|
205
|
+
total_billing_cycles=11,
|
206
|
+
amount='5.00',
|
207
|
+
currency='USD')
|
208
|
+
|
209
|
+
profile_id = @response['PROFILEID']
|
210
|
+
|
211
|
+
The profile_id can then be used in the future to access the details of the subscription,
|
212
|
+
suspend it, reactivate it or cancel it using the following methods:
|
213
|
+
- do_get_recurring_payments_profile_details
|
214
|
+
|
215
|
+
response = paypal.do_get_recurring_payments_profile_details(profile_id)
|
216
|
+
|
217
|
+
- do_manage_recurring_payments_profile_status
|
218
|
+
|
219
|
+
# Suspend
|
220
|
+
response = paypal.do_manage_recurring_payments_profile_status(profile_id,
|
221
|
+
action='Suspend',
|
222
|
+
note='The subscription is being suspended due to payment cancellation by the customer')
|
223
|
+
|
224
|
+
# Re-Activate
|
225
|
+
response = paypal.do_manage_recurring_payments_profile_status(profile_id,
|
226
|
+
action='Reactivate',
|
227
|
+
note='The subscription is being reactivated due to new payment by the customer')
|
228
|
+
|
229
|
+
# Cancel
|
230
|
+
response = paypal.do_manage_recurring_payments_profile_status(profile_id,
|
231
|
+
action='Cancel',
|
232
|
+
note='The subscription is being cancelled due to cancellation of the account by the customer')
|
233
|
+
|
234
|
+
The customer information associated with the subscription can be retrieved using:
|
235
|
+
- do_get_billing_agreement_customer_details
|
236
|
+
|
237
|
+
response = paypal.do_get_billing_agreement_customer_details(token)
|
238
|
+
|
239
|
+
Note: all subscriptions methods also accept an optional other_params hash for any other NVP you need to pass.
|
240
|
+
|
241
|
+
|
242
|
+
=More information
|
243
|
+
Check for updates in our blogs:
|
244
|
+
- http://blog.saush.com
|
245
|
+
- http://blog.monnet-usa.com
|
120
246
|
=end
|
121
247
|
|
122
248
|
class Paypal
|
123
249
|
include CreditCardChecks
|
124
250
|
|
251
|
+
@@debug = false
|
252
|
+
|
253
|
+
def self.debug
|
254
|
+
@@debug
|
255
|
+
end
|
256
|
+
|
257
|
+
# Controls whether or not PP debug statements will be produced and sent to the console
|
258
|
+
#
|
259
|
+
def self.debug=(val) #:doc:
|
260
|
+
@@debug = val
|
261
|
+
end
|
262
|
+
|
125
263
|
# Create a new object with the given user name, password and signature. To enable production
|
126
264
|
# access to PayPal change the url to the live PayPal server. Set url to <tt>:production</tt> to change
|
127
265
|
# access to PayPal production servers.
|
@@ -193,6 +331,10 @@ class Paypal
|
|
193
331
|
#
|
194
332
|
# Equivalent of SetExpressCheckout.
|
195
333
|
#
|
334
|
+
def do_set_express_checkout(return_url, cancel_url, amount, other_params={})
|
335
|
+
return set_express_checkout(return_url, cancel_url, amount, other_params)
|
336
|
+
end
|
337
|
+
|
196
338
|
def set_express_checkout(return_url, cancel_url, amount, other_params={})
|
197
339
|
params = {
|
198
340
|
'METHOD' => 'SetExpressCheckout',
|
@@ -231,8 +373,6 @@ class Paypal
|
|
231
373
|
}
|
232
374
|
|
233
375
|
params.merge! other_params
|
234
|
-
pp "DO EXPRESS CHECKOUT PAYMENT"
|
235
|
-
pp params
|
236
376
|
make_nvp_call(params)
|
237
377
|
end
|
238
378
|
|
@@ -294,7 +434,8 @@ class Paypal
|
|
294
434
|
# Makes the call to the PayPal NVP API. This is the workhorse method for the other method calls.
|
295
435
|
#
|
296
436
|
def make_nvp_call(params)
|
297
|
-
|
437
|
+
pp params if @@debug
|
438
|
+
|
298
439
|
@api_parameters.merge! params
|
299
440
|
parameters = URI.escape(@api_parameters.to_a.collect {|pair| pair.join('=')}.join('&'))
|
300
441
|
response = Net::HTTPS.post_form(URI.parse("https://#{@paypal_url}"), @api_parameters)
|
@@ -341,6 +482,146 @@ class Paypal
|
|
341
482
|
make_nvp_call(params)
|
342
483
|
end
|
343
484
|
|
485
|
+
# techarch> Subscription APIs
|
486
|
+
|
487
|
+
# Creates a payment subscription based on a start date, billing period, frequency, number of periods and amount
|
488
|
+
#
|
489
|
+
# Equivalent to CreateRecurringPaymentsProfile
|
490
|
+
#
|
491
|
+
def do_create_recurring_payments_profile(token, start_date, profile_reference, description, billing_period, billing_frequency, total_billing_cycles, amount, currency, other_params={})
|
492
|
+
params = {
|
493
|
+
'METHOD' => 'CreateRecurringPaymentsProfile',
|
494
|
+
'TOKEN' => token,
|
495
|
+
'PROFILESTARTDATE' => start_date,
|
496
|
+
'PROFILEREFERENCE' => profile_reference,
|
497
|
+
'DESC' => description,
|
498
|
+
'BILLINGPERIOD' => billing_period,
|
499
|
+
'BILLINGFREQUENCY' => billing_frequency,
|
500
|
+
'TOTALBILLINGCYCLES' => total_billing_cycles,
|
501
|
+
'AMT' => amount,
|
502
|
+
'CURRENCYCODE' => currency
|
503
|
+
}
|
504
|
+
params.merge! other_params
|
505
|
+
|
506
|
+
make_nvp_call(params)
|
507
|
+
end
|
508
|
+
|
509
|
+
# Retrieves the details of a payment subscription for a given profile id
|
510
|
+
# Will return for e.g. the start date, billing period, frequency, number of periods and amount
|
511
|
+
#
|
512
|
+
# Equivalent to GetRecurringPaymentsProfileDetails
|
513
|
+
#
|
514
|
+
def do_get_recurring_payments_profile_details (profile_id, other_params={})
|
515
|
+
params = {
|
516
|
+
'METHOD' => 'GetRecurringPaymentsProfileDetails',
|
517
|
+
'PROFILEID' => profile_id }
|
518
|
+
params.merge! other_params
|
519
|
+
|
520
|
+
make_nvp_call(params)
|
521
|
+
end
|
522
|
+
|
523
|
+
# Manages a recurring subscription profile in terms of status:
|
524
|
+
# - Cancel
|
525
|
+
# - Suspend
|
526
|
+
# - Reactivate
|
527
|
+
# Equivalent to ManageRecurringPaymentsProfileStatus
|
528
|
+
#
|
529
|
+
def do_manage_recurring_payments_profile_status(profile_id, action, note='', other_params={})
|
530
|
+
params = {
|
531
|
+
'METHOD' => 'ManageRecurringPaymentsProfileStatus',
|
532
|
+
'PROFILEID' => profile_id,
|
533
|
+
'ACTION' => action,
|
534
|
+
'NOTE' => note
|
535
|
+
}
|
536
|
+
params.merge! other_params
|
537
|
+
|
538
|
+
make_nvp_call(params)
|
539
|
+
end
|
540
|
+
|
541
|
+
# Retrieves the customer details for the billing agreement associated with the current token
|
542
|
+
# Equivalent to GetBillingAgreementCustomerDetails
|
543
|
+
#
|
544
|
+
def do_get_billing_agreement_customer_details(token, other_params={})
|
545
|
+
params = {
|
546
|
+
'METHOD' => 'GetBillingAgreementCustomerDetails',
|
547
|
+
'TOKEN' => token
|
548
|
+
}
|
549
|
+
params.merge! other_params
|
550
|
+
|
551
|
+
make_nvp_call(params)
|
552
|
+
end
|
553
|
+
|
554
|
+
# Initiates the creation of a billing agreement
|
555
|
+
# Equivalent to SetCustomerBillingAgreement
|
556
|
+
#
|
557
|
+
def do_set_billing_agreement_customer_details(return_url, cancel_url, billing_desc, billing_type='RecurringPayments', payment_type='', custom='', other_params={})
|
558
|
+
params = {
|
559
|
+
'METHOD' => 'SetCustomerBillingAgreement',
|
560
|
+
'RETURNURL' => return_url,
|
561
|
+
'CANCELURL' => cancel_url,
|
562
|
+
'L_BILLINGAGREEMENTDESCRIPTION0' => billing_desc,
|
563
|
+
'L_BILLINGTYPE0' => billing_type,
|
564
|
+
'L_PAYMENTTYPE0' => payment_type,
|
565
|
+
'L_BILLINGAGREEMENTCUSTOM0' => custom
|
566
|
+
}
|
567
|
+
params.merge! other_params
|
568
|
+
|
569
|
+
make_nvp_call(params)
|
570
|
+
end
|
571
|
+
|
572
|
+
# Retrieves the details of a transaction for a given transaction id
|
573
|
+
#
|
574
|
+
# Equivalent to GetTransactionDetails
|
575
|
+
#
|
576
|
+
def do_get_transaction_details (transaction_id, other_params={})
|
577
|
+
params = {
|
578
|
+
'METHOD' => 'GetTransactionDetails',
|
579
|
+
'TRANSACTIONID' => transaction_id }
|
580
|
+
params.merge! other_params
|
581
|
+
|
582
|
+
make_nvp_call(params)
|
583
|
+
end
|
584
|
+
|
585
|
+
# Retrieves the details of a express checkout for a given token
|
586
|
+
#
|
587
|
+
# Equivalent to GetExpressCheckoutDetails
|
588
|
+
#
|
589
|
+
def do_get_express_checkout_details (token, other_params={})
|
590
|
+
params = {
|
591
|
+
'METHOD' => 'GetExpressCheckoutDetails',
|
592
|
+
'TOKEN' => token }
|
593
|
+
params.merge! other_params
|
594
|
+
|
595
|
+
make_nvp_call(params)
|
596
|
+
end
|
597
|
+
|
598
|
+
# Search transactions between payee and payer
|
599
|
+
# Equivalent to TransactionSearch
|
600
|
+
#
|
601
|
+
def do_transaction_search(start_date,payee_email, payer_email='', payer_first='', payer_middle='', payer_last='',
|
602
|
+
transaction_class='Subscription', other_params={})
|
603
|
+
params = {
|
604
|
+
'METHOD' => 'TransactionSearch',
|
605
|
+
'STARTDATE' => start_date,
|
606
|
+
'RECEIVER' => payee_email,
|
607
|
+
'TRANSACTIONCLASS' => transaction_class
|
608
|
+
}
|
609
|
+
|
610
|
+
if !payer_email.nil? && !payer_email.empty?
|
611
|
+
params['EMAIL'] = payer_email
|
612
|
+
else
|
613
|
+
params['FIRSTNAME'] = payer_first !payer_first.nil? && !payer_first.empty?
|
614
|
+
params['MIDDLENAME'] = payer_middle !payer_middle.nil? && !payer_middle.empty?
|
615
|
+
params['LASTNAME'] = payer_last !payer_last.nil? && !payer_last.empty?
|
616
|
+
end
|
617
|
+
|
618
|
+
params.merge! other_params
|
619
|
+
|
620
|
+
make_nvp_call(params)
|
621
|
+
end
|
622
|
+
|
623
|
+
# --------------------------------------------------------------------------------------------------------------------------------------
|
624
|
+
|
344
625
|
private
|
345
626
|
|
346
627
|
#
|
metadata
CHANGED
@@ -1,20 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-paypal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chang Sau Sheong
|
8
|
+
- Philippe F. Monnet
|
8
9
|
autorequire: ruby-paypal
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date:
|
13
|
+
date: 2009-11-27 00:00:00 -07:00
|
13
14
|
default_executable:
|
14
15
|
dependencies: []
|
15
16
|
|
16
|
-
description:
|
17
|
-
email:
|
17
|
+
description: " ruby-paypal is a lightweight wrapper for the PayPal Name-Value Pair API providing:\n - direct payments\n - subscription and recurring payments\n"
|
18
|
+
email:
|
19
|
+
- sausheong.chang@gmail.com
|
20
|
+
- pfmonnet@gmail.com
|
18
21
|
executables: []
|
19
22
|
|
20
23
|
extensions: []
|
@@ -22,14 +25,15 @@ extensions: []
|
|
22
25
|
extra_rdoc_files:
|
23
26
|
- README
|
24
27
|
files:
|
25
|
-
- lib/ruby-paypal
|
26
28
|
- lib/ruby-paypal/credit_card_checks.rb
|
27
29
|
- lib/ruby-paypal/paypal.rb
|
28
30
|
- lib/ruby-paypal.rb
|
29
31
|
- test/ts_ruby-paypal.rb
|
30
32
|
- README
|
31
33
|
has_rdoc: true
|
32
|
-
homepage: http://
|
34
|
+
homepage: http://rubyforge.org/projects/ruby-paypal/
|
35
|
+
licenses: []
|
36
|
+
|
33
37
|
post_install_message:
|
34
38
|
rdoc_options: []
|
35
39
|
|
@@ -49,10 +53,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
53
|
version:
|
50
54
|
requirements: []
|
51
55
|
|
52
|
-
rubyforge_project:
|
53
|
-
rubygems_version: 1.
|
56
|
+
rubyforge_project: ruby-paypal
|
57
|
+
rubygems_version: 1.3.5
|
54
58
|
signing_key:
|
55
|
-
specification_version:
|
56
|
-
summary: A lightweight Ruby wrapper for PayPal NVP API
|
59
|
+
specification_version: 3
|
60
|
+
summary: A lightweight Ruby wrapper for the PayPal NVP API providing payment and subscriptions capabilities
|
57
61
|
test_files:
|
58
62
|
- test/ts_ruby-paypal.rb
|