ruby-paypal 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|