google_checkout 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/google-checkout.rb +76 -23
- metadata +2 -2
data/lib/google-checkout.rb
CHANGED
@@ -21,9 +21,6 @@ require 'builder/xmlmarkup'
|
|
21
21
|
# GoogleCheckout::Cart, Cart#add_item, Cart#checkout_xml, and
|
22
22
|
# Cart#checkout_button.
|
23
23
|
module GoogleCheckout
|
24
|
-
CheckoutURL = "checkout.google.com"
|
25
|
-
SubmitURL = "https://#{CheckoutURL}/cws/v2/Merchant"
|
26
|
-
|
27
24
|
|
28
25
|
# These are the only sizes allowed by Google. These shouldn't be needed
|
29
26
|
# by most people; just specify the :size and :buy_or_checkout options to
|
@@ -67,10 +64,33 @@ module GoogleCheckout
|
|
67
64
|
def initialize(merchant_id, merchant_key, *items)
|
68
65
|
@merchant_id = merchant_id
|
69
66
|
@merchant_key = merchant_key
|
67
|
+
@live_system = true
|
70
68
|
@contents = []
|
71
69
|
items.each { |i| add_item i }
|
72
70
|
end
|
73
71
|
|
72
|
+
def use_sandbox
|
73
|
+
@live_system = false
|
74
|
+
end
|
75
|
+
|
76
|
+
# This method sets the flat rate shipping for the entire cart.
|
77
|
+
# If set, it will over ride the per product flat rate shipping.
|
78
|
+
# +frs_options+ should be a hash containing the following options:
|
79
|
+
# * price
|
80
|
+
# You may fill an some optional values as well:
|
81
|
+
# * currency (defaults to 'USD')
|
82
|
+
def flat_rate_shipping(frs_options)
|
83
|
+
# We need to check that the necessary keys are in the hash,
|
84
|
+
# Otherwise the error will happen in the middle of checkout_xml,
|
85
|
+
# and the bug will be harder to track.
|
86
|
+
unless frs_options.include? :price
|
87
|
+
raise ArgumentError,
|
88
|
+
"Required keys missing: :price"
|
89
|
+
end
|
90
|
+
|
91
|
+
@flat_rate_shipping = {:currency => 'USD'}.merge(frs_options)
|
92
|
+
end
|
93
|
+
|
74
94
|
def empty?
|
75
95
|
@contents.empty?
|
76
96
|
end
|
@@ -79,10 +99,17 @@ module GoogleCheckout
|
|
79
99
|
def size
|
80
100
|
@contents.size
|
81
101
|
end
|
102
|
+
|
103
|
+
def submit_domain
|
104
|
+
(@live_system ? 'checkout' : 'sandbox') + ".google.com"
|
105
|
+
end
|
82
106
|
|
83
107
|
# This method returns the URL to which the form should be submitted.
|
84
108
|
def submit_url
|
85
|
-
[
|
109
|
+
["https://#{submit_domain}/cws/v2/Merchant",
|
110
|
+
@merchant_id,
|
111
|
+
'checkout'
|
112
|
+
].join('/')
|
86
113
|
end
|
87
114
|
|
88
115
|
# This method puts items in the cart.
|
@@ -153,16 +180,7 @@ module GoogleCheckout
|
|
153
180
|
xml.tag!('merchant-checkout-flow-support') {
|
154
181
|
xml.tag!('shipping-methods') {
|
155
182
|
xml.tag!('flat-rate-shipping', :name =>'Shipping') {
|
156
|
-
|
157
|
-
shipping = @contents.inject(0) { |total,i|
|
158
|
-
# Mixing currency not allowed; this library
|
159
|
-
# can't convert between currencies.
|
160
|
-
currency = i[:currency] || currency
|
161
|
-
total + i[:regular_shipping].to_i
|
162
|
-
}.to_s
|
163
|
-
xml.price(:currency => currency) {
|
164
|
-
xml.text! shipping
|
165
|
-
}
|
183
|
+
shipping_cost_xml
|
166
184
|
}
|
167
185
|
}
|
168
186
|
}
|
@@ -171,13 +189,49 @@ module GoogleCheckout
|
|
171
189
|
@xml.dup
|
172
190
|
end
|
173
191
|
|
192
|
+
# Generates the XML for the shipping cost, conditional on
|
193
|
+
# @flat_rate_shipping being set.
|
194
|
+
def shipping_cost_xml
|
195
|
+
xml = Builder::XmlMarkup.new
|
196
|
+
if @flat_rate_shipping
|
197
|
+
xml.price(:currency => currency) {
|
198
|
+
xml.text! @flat_rate_shipping[:price].to_s
|
199
|
+
}
|
200
|
+
else
|
201
|
+
xml.price(:currency => @currency) {
|
202
|
+
xml.text! shipping_cost.to_s
|
203
|
+
}
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# Returns the shipping cost for the contents of the cart.
|
208
|
+
def shipping_cost
|
209
|
+
currency = 'USD'
|
210
|
+
shipping = @contents.inject(0) { |total,item|
|
211
|
+
total + item[:regular_shipping].to_i
|
212
|
+
}.to_s
|
213
|
+
end
|
214
|
+
|
215
|
+
# Returns the currency for the cart. Mixing currency not allowed; this
|
216
|
+
# library can't convert between currencies.
|
217
|
+
def currency
|
218
|
+
# Mixing currency not allowed; this
|
219
|
+
# library can't convert between
|
220
|
+
# currencies.
|
221
|
+
@currency ||=
|
222
|
+
(@contents.map { |item|
|
223
|
+
item.currency
|
224
|
+
}.uniq.first rescue nil) ||
|
225
|
+
'USD'
|
226
|
+
end
|
227
|
+
|
174
228
|
# Returns the signature for the cart XML.
|
175
229
|
def signature
|
176
230
|
@xml or checkout_xml
|
177
231
|
HMAC::SHA1.digest(@merchant_key, @xml)
|
178
232
|
end
|
179
233
|
|
180
|
-
# Returns HTML for a checkout form for buying all the items in the
|
234
|
+
# Returns HTML for a checkout form for buying all the items in the
|
181
235
|
# cart.
|
182
236
|
def checkout_button(button_opts = {})
|
183
237
|
@xml or checkout_xml
|
@@ -202,13 +256,12 @@ module GoogleCheckout
|
|
202
256
|
# The options are the same as those specified on
|
203
257
|
# http://checkout.google.com/seller/checkout_buttons.html , with a
|
204
258
|
# couple of extra options for convenience. Rather than specifying the
|
205
|
-
# width and
|
206
|
-
# :
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
#
|
211
|
-
# DefaultButtonOpts.
|
259
|
+
# width and height manually, you may specify :size to be one of :small,
|
260
|
+
# :medium, or :large, and that you may set :buy_or_checkout to :buy_now
|
261
|
+
# or :checkout to get a 'Buy Now' button versus a 'Checkout' button. If
|
262
|
+
# you don't specify :buy_or_checkout, the Cart will try to guess based
|
263
|
+
# on if the cart has more than one item in it. Whatever you don't pass
|
264
|
+
# will be filled in with the defaults from DefaultButtonOpts.
|
212
265
|
def button_url(opts = {})
|
213
266
|
opts = DefaultButtonOpts.merge opts
|
214
267
|
opts[:buy_or_checkout] ||= @contents.size > 1 ? :checkout :
|
@@ -222,7 +275,7 @@ module GoogleCheckout
|
|
222
275
|
|
223
276
|
path = opts.map { |k,v| "#{k}=#{v}" }.join('&')
|
224
277
|
|
225
|
-
"http://#{
|
278
|
+
"http://#{submit_domain}/buttons/#{bname}?#{path}"
|
226
279
|
end
|
227
280
|
end
|
228
281
|
end
|
metadata
CHANGED