ez_paypal 1.0.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.
- data/.gitignore +41 -0
- data/README.md +136 -0
- data/doc/EZPaypal.html +124 -0
- data/doc/EZPaypal/Cart.html +125 -0
- data/doc/EZPaypal/Cart/OneTimePurchaseCart.html +621 -0
- data/doc/EZPaypal/Cart/RecurringProfile.html +278 -0
- data/doc/EZPaypal/Cart/RecurringPurchaseCart.html +434 -0
- data/doc/EZPaypal/Config.html +353 -0
- data/doc/EZPaypal/Helper.html +296 -0
- data/doc/EZPaypal/Request.html +926 -0
- data/doc/EZPaypal/Response.html +678 -0
- data/doc/_index.html +93 -0
- data/doc/class_list.html +47 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +55 -0
- data/doc/css/style.css +322 -0
- data/doc/file.README.html +226 -0
- data/doc/file_list.html +49 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +226 -0
- data/doc/js/app.js +205 -0
- data/doc/js/full_list.js +173 -0
- data/doc/js/jquery.js +16 -0
- data/doc/method_list.html +46 -0
- data/doc/top-level-namespace.html +95 -0
- data/ez_paypal.gemspec +32 -0
- data/lib/config.rb +55 -0
- data/lib/core/data.rb +241 -0
- data/lib/core/helper.rb +34 -0
- data/lib/core/request.rb +159 -0
- data/lib/core/response.rb +76 -0
- data/lib/ez_paypal.rb +5 -0
- data/lib/ez_paypal/version.rb +3 -0
- metadata +129 -0
data/ez_paypal.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
lib = File.expand_path("../lib/", __FILE__)
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
require "date"
|
5
|
+
require "ez_paypal/version"
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
|
9
|
+
# Basic info
|
10
|
+
s.name = "ez_paypal"
|
11
|
+
s.version = EZPaypal::VERSION
|
12
|
+
s.platform = Gem::Platform::RUBY
|
13
|
+
s.date = Date.today.to_s
|
14
|
+
s.summary = "Paypal express checkout plugin"
|
15
|
+
s.description = "Paypal express checkout plugin"
|
16
|
+
s.authors = ["Tianyu Huang"]
|
17
|
+
s.email = ["tianhsky@yahoo.com"]
|
18
|
+
s.homepage = "http://rubygems.org/gems/ez_paypal"
|
19
|
+
|
20
|
+
# Dependencies
|
21
|
+
#s.required_rubygems_version = ">= 1.8.22"
|
22
|
+
s.add_dependency "ez_http", ">= 1.0.4"
|
23
|
+
s.add_dependency "json", ">= 1.6.6"
|
24
|
+
s.add_dependency "activesupport", ">= 3.2.2"
|
25
|
+
|
26
|
+
# Files
|
27
|
+
s.files = `git ls-files`.split("\n")
|
28
|
+
s.require_paths = ["lib"]
|
29
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
30
|
+
s.extra_rdoc_files = ["README.md", "doc/index.html"]
|
31
|
+
|
32
|
+
end
|
data/lib/config.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module EZPaypal
|
2
|
+
module Config
|
3
|
+
|
4
|
+
# Account setting
|
5
|
+
@setting
|
6
|
+
|
7
|
+
def self.Setting
|
8
|
+
@setting
|
9
|
+
end
|
10
|
+
|
11
|
+
# API endpoint
|
12
|
+
@endpoint
|
13
|
+
|
14
|
+
def self.EndPoint
|
15
|
+
@endpoint
|
16
|
+
end
|
17
|
+
|
18
|
+
# Setup config
|
19
|
+
# @param [Hash] options = { "user", "password", "signature",
|
20
|
+
# "version", "mode" => "sandbox / live",
|
21
|
+
# "customer_service_tel"}
|
22
|
+
#
|
23
|
+
def self.Setup (options)
|
24
|
+
# Setup account setting
|
25
|
+
@setting={
|
26
|
+
"USER" => options["user"],
|
27
|
+
"PWD" => options["password"],
|
28
|
+
"SIGNATURE" => options["signature"],
|
29
|
+
"VERSION" => options["version"] || 84.0,
|
30
|
+
"CUSTOMERSERVICENUMBER" => options["customer_service_tel"]
|
31
|
+
}
|
32
|
+
|
33
|
+
# Setup endpoint
|
34
|
+
express_checkout_endpoint = {
|
35
|
+
"sandbox" => "https://api-3t.sandbox.paypal.com/nvp",
|
36
|
+
"live" => "https://api-3t.paypal.com/nvp"
|
37
|
+
}
|
38
|
+
set_express_checkout = {
|
39
|
+
"sandbox" => "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout",
|
40
|
+
"live" => "https://www.paypal.com/webscr?cmd=_express-checkout",
|
41
|
+
}
|
42
|
+
|
43
|
+
@endpoint ||= {}
|
44
|
+
if (options["mode"] == 'sandbox')
|
45
|
+
@endpoint.merge!("express_checkout_endpoint" => express_checkout_endpoint["sandbox"])
|
46
|
+
@endpoint.merge!("express_checkout_url" => set_express_checkout["sandbox"])
|
47
|
+
else
|
48
|
+
@endpoint.merge!("express_checkout_endpoint" => express_checkout_endpoint["live"])
|
49
|
+
@endpoint.merge!("express_checkout_url" => set_express_checkout["live"])
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/core/data.rb
ADDED
@@ -0,0 +1,241 @@
|
|
1
|
+
require 'active_support/hash_with_indifferent_access'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module EZPaypal
|
5
|
+
|
6
|
+
# Paypal NVP Documentation:
|
7
|
+
# Express checkout:
|
8
|
+
# https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_GetExpressCheckoutDetails
|
9
|
+
# Recurring payments:
|
10
|
+
# https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECRecurringPayments
|
11
|
+
# https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_CreateRecurringPayments
|
12
|
+
module Cart
|
13
|
+
|
14
|
+
# A cart object that holds all one time purchase items
|
15
|
+
# How to use:
|
16
|
+
# -> initialize Cart
|
17
|
+
# -> add items (optional)
|
18
|
+
# -> setup shipping info(optional)
|
19
|
+
# -> setup summary(required)
|
20
|
+
# -> done (if involve recurring purchase, please create profile, this cart only shows agreement for recurring items)
|
21
|
+
# Note:
|
22
|
+
# you are responsible for all the cost calculations
|
23
|
+
#
|
24
|
+
class OneTimePurchaseCart < HashWithIndifferentAccess
|
25
|
+
|
26
|
+
# Max cart size of this cart type
|
27
|
+
def cartSize
|
28
|
+
10
|
29
|
+
end
|
30
|
+
|
31
|
+
# Add item to the cart (optional)
|
32
|
+
# @param [Hash] item = {"category" => "digital / physical",
|
33
|
+
# "name", "item_code", "description", "amount", "quantity" }
|
34
|
+
#
|
35
|
+
def addItem(item)
|
36
|
+
|
37
|
+
# Check max cart size, make sure do not exceed the limit
|
38
|
+
max = 0
|
39
|
+
self.each do |key, value|
|
40
|
+
max = max + 1 if key.match(/^L_PAYMENTREQUEST_0_NAME/)
|
41
|
+
end
|
42
|
+
throw "Exceed max cart size: #{cartSize}" if (max+1 > cartSize)
|
43
|
+
|
44
|
+
# Add item to cart
|
45
|
+
current_index = max
|
46
|
+
current_item = {
|
47
|
+
"L_PAYMENTREQUEST_0_ITEMCATEGORY#{current_index}" => item["category"] || "Physical",
|
48
|
+
"L_PAYMENTREQUEST_0_NAME#{current_index}" => item["name"] || "",
|
49
|
+
"L_PAYMENTREQUEST_0_NUMBER#{current_index}" => item["item_code"] || "",
|
50
|
+
"L_PAYMENTREQUEST_0_DESC#{current_index}" => item["description"] || "",
|
51
|
+
"L_PAYMENTREQUEST_0_AMT#{current_index}" => item["amount"] || "0",
|
52
|
+
"L_PAYMENTREQUEST_0_QTY#{current_index}" => item["quantity"] || "0"
|
53
|
+
}
|
54
|
+
self.merge!(current_item)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Setup shipping info (optional)
|
59
|
+
# @param [Hash] shipping = {"name", "street", "street2", "city", "state", "country", "zip", "phone" }
|
60
|
+
def setupShippingInfo(shipping)
|
61
|
+
item = shipping
|
62
|
+
options = {
|
63
|
+
"PAYMENTREQUEST_0_SHIPTONAME" => item["name"] || "",
|
64
|
+
"PAYMENTREQUEST_0_SHIPTOSTREET" => item["street"] || "",
|
65
|
+
"PAYMENTREQUEST_0_SHIPTOSTREET2" => item["street2"] || "",
|
66
|
+
"PAYMENTREQUEST_0_SHIPTOCITY" => item["city"] || "",
|
67
|
+
"PAYMENTREQUEST_0_SHIPTOSTATE" => item["state"] || "",
|
68
|
+
"PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE" => item["country"] || "",
|
69
|
+
"PAYMENTREQUEST_0_SHIPTOZIP" => item["zip"] || "",
|
70
|
+
"PAYMENTREQUEST_0_SHIPTOPHONENUM" => item["phone"] || ""
|
71
|
+
}
|
72
|
+
self.merge!(options)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Add cart summary, please calculate yourself (required)
|
76
|
+
# @param [Hash] summary = {"currency" => "USD"(default "USD"),
|
77
|
+
# "subtotal", "tax", "shipping", "handling", "shipping_discount", "insurance", "total",
|
78
|
+
# "disable_change_shipping_info" => "1 / 0" (default 1),
|
79
|
+
# "allow_note" => "1 / 0" (default 0) }
|
80
|
+
#
|
81
|
+
def setupSummary (summary)
|
82
|
+
item = summary
|
83
|
+
options = {
|
84
|
+
"PAYMENTREQUEST_0_PAYMENTACTION" => item["payment_action"] || "Sale",
|
85
|
+
"PAYMENTREQUEST_0_CURRENCYCODE" => item["currency"] || "USD",
|
86
|
+
|
87
|
+
"PAYMENTREQUEST_0_ITEMAMT" => item["subtotal"] || "0",
|
88
|
+
"PAYMENTREQUEST_0_TAXAMT" => item["tax"] || "0",
|
89
|
+
"PAYMENTREQUEST_0_SHIPPINGAMT" => item["shipping"] || "0",
|
90
|
+
"PAYMENTREQUEST_0_HANDLINGAMT" => item["handling"] || "0",
|
91
|
+
"PAYMENTREQUEST_0_SHIPDISCAMT" => item["shipping_discount"] || "0",
|
92
|
+
"PAYMENTREQUEST_0_INSURANCEAMT" => item["insurance"] || "0",
|
93
|
+
"PAYMENTREQUEST_0_AMT" => item["total"] || "0",
|
94
|
+
|
95
|
+
"ALLOWNOTE" => item["allow_note"] || "0",
|
96
|
+
"NOSHIPPING" => item["disable_change_shipping_info"] || "1"
|
97
|
+
}
|
98
|
+
self.merge!(options)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Clean the cart
|
102
|
+
def reset
|
103
|
+
self.clear
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
# A cart object that holds all recurring purchase items
|
110
|
+
# Note that this cart only support one subscription item at a time
|
111
|
+
# How to use:
|
112
|
+
# -> initialize Cart
|
113
|
+
# -> setup agreement (required)
|
114
|
+
# -> setup summary(required)
|
115
|
+
# -> done (please create profile after this, this cart only shows agreement for recurring items)
|
116
|
+
# Note:
|
117
|
+
# you are responsible for all the cost calculations
|
118
|
+
#
|
119
|
+
class RecurringPurchaseCart < HashWithIndifferentAccess
|
120
|
+
|
121
|
+
# Max cart size of this cart type
|
122
|
+
def cartSize
|
123
|
+
1
|
124
|
+
end
|
125
|
+
|
126
|
+
# Setup recurring payment agreement
|
127
|
+
# @param [Hash] agreement = {"category" => "digital / physical" (default physical),
|
128
|
+
# "currency" => "USD"(default "USD")
|
129
|
+
# "item_code" => ""(code should be unique and meaningful),
|
130
|
+
# "unit_price", "quantity" ,"amount"}
|
131
|
+
#
|
132
|
+
def setupAgreement(agreement)
|
133
|
+
|
134
|
+
# Check max cart size, make sure do not exceed the limit
|
135
|
+
max = 0
|
136
|
+
self.each do |key, value|
|
137
|
+
max = max + 1 if key.match(/^L_PAYMENTREQUEST_0_NAME/)
|
138
|
+
end
|
139
|
+
throw "Exceed max cart size: #{cartSize}" if (max+1 > cartSize)
|
140
|
+
|
141
|
+
item = agreement
|
142
|
+
current_index = max
|
143
|
+
current_item = {
|
144
|
+
"L_PAYMENTREQUEST_0_NAME#{current_index}" => item["item_code"] || "",
|
145
|
+
#"L_PAYMENTREQUEST_0_NUMBER#{current_index}" => item["item_code"] || "",
|
146
|
+
#"L_PAYMENTREQUEST_0_DESC#{current_index}" => item["description"] || "",
|
147
|
+
"L_PAYMENTREQUEST_0_AMT#{current_index}" => item["unit_price"] || "0",
|
148
|
+
"L_PAYMENTREQUEST_0_QTY#{current_index}" => item["quantity"] || "0",
|
149
|
+
|
150
|
+
"L_PAYMENTREQUEST_0_ITEMCATEGORY#{current_index}" => item["category"] || "Physical",
|
151
|
+
"L_BILLINGTYPE#{current_index}" => "RecurringPayments",
|
152
|
+
"L_BILLINGAGREEMENTDESCRIPTION#{current_index}" => item["item_code"] || ""
|
153
|
+
}
|
154
|
+
|
155
|
+
summary = {
|
156
|
+
"PAYMENTREQUEST_0_PAYMENTACTION" => item["payment_action"] || "Sale",
|
157
|
+
"PAYMENTREQUEST_0_CURRENCYCODE" => item["currency"] || "USD",
|
158
|
+
#"PAYMENTREQUEST_0_ITEMAMT" => item["total"] || "0",
|
159
|
+
#"PAYMENTREQUEST_0_TAXAMT" => item["tax"] || "0",
|
160
|
+
#"PAYMENTREQUEST_0_SHIPPINGAMT" => item["shipping"] || "0",
|
161
|
+
#"PAYMENTREQUEST_0_HANDLINGAMT" => item["handling"] || "0",
|
162
|
+
#"PAYMENTREQUEST_0_SHIPDISCAMT" => item["shipping_discount"] || "0",
|
163
|
+
#"PAYMENTREQUEST_0_INSURANCEAMT" => item["insurance"] || "0",
|
164
|
+
"PAYMENTREQUEST_0_AMT" => item["amount"] || "0",
|
165
|
+
|
166
|
+
"ALLOWNOTE" => item["allow_note"] || "0",
|
167
|
+
"NOSHIPPING" => item["disable_change_shipping_info"] || "1"
|
168
|
+
}
|
169
|
+
self.merge!(current_item).merge!(summary)
|
170
|
+
end
|
171
|
+
|
172
|
+
# Clean the cart
|
173
|
+
def reset
|
174
|
+
self.clear
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
class RecurringProfile < HashWithIndifferentAccess
|
180
|
+
|
181
|
+
# Setup profile
|
182
|
+
# @param [Hash] profile = {"token", "email", "currency" => "USD" (default "USD"),
|
183
|
+
# "item_code", "unit_price", "quantity", "amount",
|
184
|
+
# "initial_amount" => "0" (recurring profile will do auto-charge since begining! do not use this if you are not sure),
|
185
|
+
# "start_date" => "2012/02/02" (Default Time.now),
|
186
|
+
# "period" => "Day/Week/Month/Year" (default "Month"),
|
187
|
+
# "frequency" => "1" (how many periods a purchase, default 1),
|
188
|
+
# "cycles" => "0" (total cycles of recurring billing, default 0 means infinite)
|
189
|
+
# }
|
190
|
+
def initialize(profile)
|
191
|
+
item = profile
|
192
|
+
options = {
|
193
|
+
"TOKEN" => item["token"],
|
194
|
+
"EMAIL" => item["email"],
|
195
|
+
"CURRENCYCODE" => item["currency"] || "USD",
|
196
|
+
"FAILEDINITAMTACTION" => "CancelOnFailure", #ContinueOnFailure / CancelOnFailure
|
197
|
+
|
198
|
+
# Display details
|
199
|
+
"L_PAYMENTREQUEST_0_ITEMCATEGORY0" => item["category"] || "Physical",
|
200
|
+
"L_PAYMENTREQUEST_0_NAME0" => item["item_code"] || "",
|
201
|
+
"L_PAYMENTREQUEST_0_AMT0" => item["unit_price"] || "0",
|
202
|
+
"L_PAYMENTREQUEST_0_QTY0" => item["quantity"] || "0",
|
203
|
+
|
204
|
+
# Profile details
|
205
|
+
"DESC" => item["item_code"] || "",
|
206
|
+
"AMT" => item["amount"] || "0",
|
207
|
+
"QTY" => item["quantity"] || "0",
|
208
|
+
"INITAMT" => item["initial_amount"] || "0",
|
209
|
+
|
210
|
+
# Recurring details
|
211
|
+
"PROFILESTARTDATE" => item["start_date"] || Time.now,
|
212
|
+
"BILLINGFREQUENCY" => item["frequency"] || "1",
|
213
|
+
"BILLINGPERIOD" => item["period"] || "Month",
|
214
|
+
"TOTALBILLINGCYCLES" => item["cycles"] || "0"
|
215
|
+
|
216
|
+
}
|
217
|
+
|
218
|
+
self.merge!(options)
|
219
|
+
end
|
220
|
+
|
221
|
+
def self.ConvertFromCheckoutDetails (checkout_details)
|
222
|
+
profile = {
|
223
|
+
"token" => checkout_details["TOKEN"],
|
224
|
+
"email" => checkout_details["EMAIL"],
|
225
|
+
"item_code" => checkout_details["L_PAYMENTREQUEST_0_NAME0"],
|
226
|
+
"unit_price" => checkout_details["L_PAYMENTREQUEST_0_AMT0"],
|
227
|
+
"quantity" => checkout_details["L_PAYMENTREQUEST_0_QTY0"],
|
228
|
+
"amount" => checkout_details["PAYMENTREQUEST_0_AMT"],
|
229
|
+
"start_date" => Time.now,
|
230
|
+
"period" => "Month",
|
231
|
+
"frequency" => "1"
|
232
|
+
}
|
233
|
+
|
234
|
+
profile = self.new(profile)
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
data/lib/core/helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'active_support/hash_with_indifferent_access'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module EZPaypal
|
5
|
+
module Helper
|
6
|
+
# Helper method to convert query string to hash
|
7
|
+
# also convert hash to encoded hash
|
8
|
+
# @param [String / Hash] object to be converted or encoded
|
9
|
+
# @return [Hash] converted string or encoded hash
|
10
|
+
def self.ConvertParamToHash (object)
|
11
|
+
hash_obj = HashWithIndifferentAccess.new()
|
12
|
+
if (object.class.to_s == "String")
|
13
|
+
object.split("&").each do |e|
|
14
|
+
key = CGI::unescape(e.split("=")[0])
|
15
|
+
value = CGI::unescape(e.split("=")[1])
|
16
|
+
hash_obj.merge!(key => value)
|
17
|
+
end
|
18
|
+
else
|
19
|
+
object.each do |key, value|
|
20
|
+
key = CGI::unescape(key)
|
21
|
+
value = CGI::unescape(value)
|
22
|
+
hash_obj.merge!(key.upcase => value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
return hash_obj
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.ConvertHashToQueryString (hash)
|
30
|
+
hash.map { |k, v| CGI::escape(k.to_s)+"="+CGI::escape(v.to_s) }.join("&")
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/lib/core/request.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'active_support/hash_with_indifferent_access'
|
2
|
+
require 'cgi'
|
3
|
+
require 'ez_http'
|
4
|
+
require File.expand_path('../../config', __FILE__)
|
5
|
+
require File.expand_path('../helper', __FILE__)
|
6
|
+
|
7
|
+
module EZPaypal
|
8
|
+
module Request
|
9
|
+
|
10
|
+
# Setup express checkout cart
|
11
|
+
# @param [EZPaypal::Cart::OneTimePurchaseCart / EZPaypal::Cart::RecurringPurchaseCart] cart
|
12
|
+
# @param [String] returnUrl
|
13
|
+
# @param [String] cancelUrl
|
14
|
+
# @return [Hash] response = {"TOKEN"}
|
15
|
+
def self.SetupExpressCheckout (cart, returnUrl, cancelUrl)
|
16
|
+
begin
|
17
|
+
# Setup default options
|
18
|
+
setting = EZPaypal::Config.Setting.clone
|
19
|
+
default = {"METHOD" => "SetExpressCheckout",
|
20
|
+
"RETURNURL" => returnUrl,
|
21
|
+
"CANCELURL" => cancelUrl
|
22
|
+
}
|
23
|
+
setting.merge!(default).merge!(cart)
|
24
|
+
|
25
|
+
# Get setup express checkout details
|
26
|
+
query_string = EZPaypal::Helper.ConvertHashToQueryString(setting)
|
27
|
+
setup_ec_response_origin = EZHttp.Send(EZPaypal::Config.EndPoint["express_checkout_endpoint"], query_string, "post").body
|
28
|
+
|
29
|
+
# Convert express checkout details to Hash to return
|
30
|
+
setup_ec_response = EZPaypal::Helper.ConvertParamToHash(setup_ec_response_origin)
|
31
|
+
|
32
|
+
return setup_ec_response
|
33
|
+
rescue
|
34
|
+
throw "Error occured in SetupExpressCheckout"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get current checkout url to redirect user to, only works if token has obtained
|
39
|
+
# @param [String] token
|
40
|
+
# @return [String] paypal checkout url to redirect user to
|
41
|
+
def self.GetCheckoutURL(token)
|
42
|
+
EZPaypal::Config.EndPoint["express_checkout_url"]+ "&token=" + token unless token.nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get current checkout details, only works if token has obtained
|
46
|
+
# @param [String] token
|
47
|
+
# @return [Hash] checkout details associated with the given token
|
48
|
+
def self.GetCheckoutDetails(token)
|
49
|
+
unless (token.nil?)
|
50
|
+
begin
|
51
|
+
# Setup default options
|
52
|
+
setting = EZPaypal::Config.Setting.clone
|
53
|
+
setting.merge!({"METHOD" => "GetExpressCheckoutDetails"})
|
54
|
+
setting.merge!({"TOKEN" => token})
|
55
|
+
|
56
|
+
# Get checkout details
|
57
|
+
query_string = EZPaypal::Helper.ConvertHashToQueryString(setting)
|
58
|
+
checkout_details_origin = EZHttp.Send(EZPaypal::Config.EndPoint["express_checkout_endpoint"], query_string, "post").body
|
59
|
+
|
60
|
+
# Convert checkout details to Hash to return
|
61
|
+
checkout_details = EZPaypal::Helper.ConvertParamToHash(checkout_details_origin)
|
62
|
+
|
63
|
+
return checkout_details
|
64
|
+
rescue
|
65
|
+
throw "Error occured in GetExpressCheckoutDetails: token=#{token}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Confirm payment, only works if token and payer_id is obtained
|
71
|
+
# @param [String] token
|
72
|
+
# @param [String] payer_id
|
73
|
+
# @return [Hash] payment details associated with the given token and payer_id
|
74
|
+
def self.ConfirmPurchase(token, payer_id)
|
75
|
+
unless (token.nil? && payer_id.nil?)
|
76
|
+
begin
|
77
|
+
# Setup default options
|
78
|
+
setting = EZPaypal::Config.Setting.clone
|
79
|
+
setting.merge!({"METHOD" => "DoExpressCheckoutPayment"})
|
80
|
+
setting.merge!({"PAYMENTREQUEST_0_PAYMENTACTION" => "Sale"})
|
81
|
+
setting.merge!({"TOKEN" => token})
|
82
|
+
setting.merge!({"PAYERID" => payer_id})
|
83
|
+
|
84
|
+
|
85
|
+
# Get checkout details
|
86
|
+
checkout_details_origin = EZPaypal::Request.GetCheckoutDetails(token)
|
87
|
+
checkout_details_origin.each do |key, value|
|
88
|
+
key = CGI::unescape(key)
|
89
|
+
value = CGI::unescape(value)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Submit checkout request to confirm the purchase
|
93
|
+
payment_response_origin = HashWithIndifferentAccess.new()
|
94
|
+
if (checkout_details_origin["ACK"].downcase == "success")
|
95
|
+
checkout_details_origin.merge!(setting)
|
96
|
+
query_string = EZPaypal::Helper.ConvertHashToQueryString(checkout_details_origin)
|
97
|
+
payment_response_origin = EZHttp.Send(EZPaypal::Config.EndPoint["express_checkout_endpoint"], query_string, "post").body
|
98
|
+
end
|
99
|
+
|
100
|
+
# Convert response to Hash to return
|
101
|
+
payment_response = EZPaypal::Helper.ConvertParamToHash(payment_response_origin)
|
102
|
+
|
103
|
+
return payment_response
|
104
|
+
|
105
|
+
rescue
|
106
|
+
throw "Error occured in ConfirmPurchase: TOKEN=#{token}, PAYERID=#{payer_id}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Create a recurring profile for a customer
|
112
|
+
# @param [EZPaypal::Cart::RecurringProfile] profile including all the config for the recurring profile
|
113
|
+
# @return [Hash] profile creation confirmation from paypal
|
114
|
+
def self.CreateRecurringProfile(profile)
|
115
|
+
begin
|
116
|
+
# Setup default options
|
117
|
+
setting = EZPaypal::Config.Setting.clone
|
118
|
+
default = {"METHOD" => "CreateRecurringPaymentsProfile"}
|
119
|
+
setting.merge!(default).merge!(profile)
|
120
|
+
|
121
|
+
# Http call to create profile and get response
|
122
|
+
query_string = EZPaypal::Helper.ConvertHashToQueryString(setting)
|
123
|
+
profile_response_origin = EZHttp.Send(EZPaypal::Config.EndPoint["express_checkout_endpoint"], query_string, "post").body
|
124
|
+
|
125
|
+
# Convert response to Hash to return
|
126
|
+
profile_response = EZPaypal::Helper.ConvertParamToHash(profile_response_origin)
|
127
|
+
|
128
|
+
return profile_response
|
129
|
+
rescue
|
130
|
+
throw "Error occured in CreateRecurringProfile"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Refund money to a transaction
|
135
|
+
# @param [String] all
|
136
|
+
# @return [Hash]
|
137
|
+
def self.Refund(transaction_id, refund_type, amount, currency, note)
|
138
|
+
# Setup default options
|
139
|
+
setting = EZPaypal::Config.Setting.clone
|
140
|
+
options = {
|
141
|
+
"METHOD" => "RefundTransaction",
|
142
|
+
"TRANSACTIONID" => transaction_id,
|
143
|
+
"REFUNDTYPE" => refund_type || "Partial",
|
144
|
+
"AMT" => amount || "0",
|
145
|
+
"CURRENCYCODE" => currency || "USD",
|
146
|
+
"NOTE" => note || ""
|
147
|
+
}
|
148
|
+
setting.merge!(options)
|
149
|
+
|
150
|
+
# Http call to create profile and get response
|
151
|
+
query_string = EZPaypal::Helper.ConvertHashToQueryString(setting)
|
152
|
+
refund_response_origin = EZHttp.Send(EZPaypal::Config.EndPoint["express_checkout_endpoint"], query_string, "post").body
|
153
|
+
|
154
|
+
# Convert response to Hash to return
|
155
|
+
profile_response = EZPaypal::Helper.ConvertParamToHash(refund_response_origin)
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|