twocheckout 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ *~
2
+ *.lock
3
+ *.DS_Store
4
+ *.swp
5
+ *.out
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2012 - Craig Christenson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,102 @@
1
+ 2Checkout Ruby Library
2
+ =====================
3
+
4
+ This library provides developers with a simple set of bindings to the 2Checkout purchase routine, Instant Notification Service and Back Office API.
5
+
6
+ To use, download or clone the repository.
7
+
8
+ ```shell
9
+ git clone https://github.com/craigchristenson/2checkout-ruby.git
10
+ ```
11
+
12
+ Or import into your Gemfile
13
+
14
+ ```ruby
15
+ gem 'twocheckout', :git => "git://github.com/craigchristenson/2checkout-ruby.git"
16
+ ```
17
+
18
+ Full documentation for each binding will be provided in the [Wiki](https://github.com/craigchristenson/2checkout-ruby/wiki).
19
+
20
+
21
+ Example API Usage
22
+ -----------------
23
+
24
+ *Example Usage:*
25
+
26
+ ```ruby
27
+ Twocheckout.api_credentials=({'username' => 'APIuser1817037', 'password' => 'APIpass1817037'})
28
+
29
+ @action = Twocheckout::Sale.refund({'sale_id' => 4769044324, 'comment' => "test refund", 'category' => 1})
30
+ puts @action
31
+ ```
32
+
33
+ *Example Response:*
34
+
35
+ ```json
36
+ {
37
+ "response_code" : "OK",
38
+ "response_message" : "refund added to invoice"
39
+ }
40
+ ```
41
+
42
+ Example Checkout Usage:
43
+ -----------------------
44
+
45
+ *Example Usage:*
46
+
47
+ ```ruby
48
+ require "sinatra"
49
+
50
+ get '/' do
51
+ @@form = Twocheckout::Charge.submit({'sid' => 1817037, 'cart_order_id' => 'Example Sale', 'total' => 1.00})
52
+ @@form
53
+ end
54
+ ```
55
+
56
+ Example Return Usage:
57
+ ---------------------
58
+
59
+ *Example Usage:*
60
+
61
+ ```ruby
62
+ require "sinatra"
63
+
64
+ post '/' do
65
+ @@response = Twocheckout::Return.request({ :credentials => {'sid' => '532001', 'secret' => 'tango'}, :params => params})
66
+ @@response.inspect
67
+ end
68
+ ```
69
+
70
+ *Example Response:*
71
+
72
+ ```json
73
+ {
74
+ "code" : "PASS",
75
+ "message" : "Hash Matched"
76
+ }
77
+ ```
78
+
79
+ Example INS Usage:
80
+ ------------------
81
+
82
+ *Example Usage:*
83
+
84
+ ```ruby
85
+ require "sinatra"
86
+
87
+ post '/' do
88
+ @@response = Twocheckout::Ins.request({ :credentials => {'sid' => 532001, 'secret' => 'tango'}, :params => params})
89
+ @@response.inspect
90
+ end
91
+ ```
92
+
93
+ *Example Response:*
94
+
95
+ ```json
96
+ {
97
+ "code" : "PASS",
98
+ "message" : "Hash Matched"
99
+ }
100
+ ```
101
+
102
+ Full documentation for each binding will be provided in the [Wiki](https://github.com/craigchristenson/2checkout-ruby/wiki).
@@ -0,0 +1,260 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
3
+ require '../../lib/twocheckout.rb'
4
+
5
+ describe Twocheckout::Sale do
6
+ before do
7
+ Twocheckout.api_credentials=({'username' => 'APIuser1817037', 'password' => 'APIpass1817037'})
8
+ end
9
+
10
+ #retrieve sale
11
+ it "Sale retrieve returns sale" do
12
+ action = Twocheckout::Sale.retrieve({'sale_id' => 4786293822})
13
+ action = JSON.parse(action)
14
+ assert_equal('Sale detail retrieved', action['response_message'])
15
+ end
16
+
17
+ #retrieve invoice
18
+ it "Sale retrieve returns sale" do
19
+ action = Twocheckout::Sale.retrieve({'invoice_id' => 4786293831})
20
+ action = JSON.parse(action)
21
+ assert_equal('Sale detail retrieved', action['response_message'])
22
+ end
23
+
24
+ #retrieve list
25
+ it "Sale retrieve returns list" do
26
+ action = Twocheckout::Sale.retrieve()
27
+ action = JSON.parse(action)
28
+ assert_equal('Sales summaries retrieved successfully.', action['response_message'])
29
+ end
30
+
31
+ #refund sale
32
+ it "Sale refund returns successful result when passing sale_id" do
33
+ action = Twocheckout::Sale.refund({'sale_id' => 4786293822, 'comment' => "test refund", 'category' => 1})
34
+ action = JSON.parse(action)
35
+ if action['response_message']
36
+ assert_equal('refund added to invoice', action['response_message'])
37
+ else
38
+ assert_equal('Invoice was already refunded.', action["errors"][0]["message"])
39
+ end
40
+ end
41
+
42
+ #refund invoice
43
+ it "Sale refund returns successful result when passing invoice_id" do
44
+ action = Twocheckout::Sale.refund({'invoice_id' => 4786293831, 'comment' => "test refund", 'category' => 1})
45
+ action = JSON.parse(action)
46
+ if action['response_message']
47
+ assert_equal('refund added to invoice', action['response_message'])
48
+ else
49
+ assert_equal("Invoice was already refunded.", action["errors"][0]["message"])
50
+ end
51
+ end
52
+
53
+ #refund lineitem
54
+ it "Sale refund returns successful result when passing lineitem_id" do
55
+ action = Twocheckout::Sale.refund({'lineitem_id' => 4789788509, 'comment' => "test refund", 'category' => 1})
56
+ action = JSON.parse(action)
57
+ if action['response_message']
58
+ assert_equal('lineitem refunded', action['response_message'])
59
+ else
60
+ assert_equal('This lineitem cannot be refunded.', action["errors"][0]["message"])
61
+ end
62
+ end
63
+
64
+ #stop recurring lineitem
65
+ it "Sale stop returns successful result when passing lineitem_id" do
66
+ action = Twocheckout::Sale.stop({'lineitem_id' => 4789788509})
67
+ action = JSON.parse(action)
68
+ if action['response_message']
69
+ assert_equal('Recurring billing stopped for lineitem', action['response_message'])
70
+ else
71
+ assert_equal('Lineitem is not scheduled to recur.', action["errors"][0]["message"])
72
+ end
73
+ end
74
+
75
+ #stop recurring sale
76
+ it "Sale stop returns successful result when passing sale_id" do
77
+ action = Twocheckout::Sale.stop('sale_id' => 4786293822)
78
+ action = JSON.parse(action)
79
+ if action[0]
80
+ assert_equal('Recurring billing stopped for lineitem', action['response_message'])
81
+ else
82
+ assert_equal("No Active recurring lineitems.", action["errors"][0]["message"])
83
+ end
84
+ end
85
+
86
+ #create comment
87
+ it "Sale comment returns successful result" do
88
+ action = Twocheckout::Sale.comment({'sale_id' => 4786293822, 'sale_comment' => "test"})
89
+ action = JSON.parse(action)
90
+ assert_equal('Created comment successfully.', action['response_message'])
91
+ end
92
+
93
+ #mark shipped
94
+ it "Sale ship returns successful result" do
95
+ action = Twocheckout::Sale.ship({'sale_id' => 4786293822, 'tracking_number' => "test"})
96
+ action = JSON.parse(action)
97
+ if action['response_message']
98
+ assert_equal('Sale marked shipped.', action['response_message'])
99
+ else
100
+ assert_equal('Item not shippable.', action["errors"][0]["message"])
101
+ end
102
+ end
103
+
104
+ #reauth
105
+ it "Sale reauth returns successful result" do
106
+ action = Twocheckout::Sale.reauth({'sale_id' => 4786293822})
107
+ action = JSON.parse(action)
108
+ if action['response_message']
109
+ assert_equal('Payment reauthorized.', action['response_message'])
110
+ else
111
+ assert_equal('Payment is already pending or deposited and cannot be reauthorized.', action["errors"][0]["message"])
112
+ end
113
+ end
114
+ end
115
+
116
+ describe Twocheckout::Product do
117
+ before do
118
+ Twocheckout.api_credentials=({'username' => 'APIuser1817037', 'password' => 'APIpass1817037'})
119
+ action = Twocheckout::Product.create({'name' => "test product", 'price' => 1.00})
120
+ action = JSON.parse(action)
121
+ @product_id = action['product_id']
122
+ end
123
+
124
+ #create
125
+ it "Product create returns successful result" do
126
+ action = Twocheckout::Product.create({'name' => "test product", 'price' => 1.00})
127
+ action = JSON.parse(action)
128
+ assert_equal('Product successfully created', action['response_message'])
129
+ end
130
+
131
+ #retrieve list
132
+ it "Product retrieve returns successful result" do
133
+ action = Twocheckout::Product.retrieve()
134
+ action = JSON.parse(action)
135
+ assert_equal('Product list successfully retrieved.', action['response_message'])
136
+ end
137
+
138
+ #retrieve product
139
+ it "Product retrieve returns successful result" do
140
+ action = Twocheckout::Product.retrieve({'product_id' => @product_id})
141
+ action = JSON.parse(action)
142
+ assert_equal('Product detail information retrieved successfully', action['response_message'])
143
+ end
144
+
145
+ #update
146
+ it "Product update returns successful result" do
147
+ action = Twocheckout::Product.update({'product_id' => @product_id, 'name' => "test product"})
148
+ action = JSON.parse(action)
149
+ assert_equal('Product successfully updated', action['response_message'])
150
+ end
151
+
152
+ #delete
153
+ it "Product delete returns successful result" do
154
+ action = Twocheckout::Product.delete({'product_id' => @product_id})
155
+ action = JSON.parse(action)
156
+ assert_equal('Product successfully deleted.', action['response_message'])
157
+ end
158
+ end
159
+
160
+ describe Twocheckout::Coupon do
161
+ before do
162
+ Twocheckout.api_credentials=({'username' => 'APIuser1817037', 'password' => 'APIpass1817037'})
163
+ action = Twocheckout::Coupon.create({'date_expire' => "2099-12-01",
164
+ 'type' => "shipping", 'minimum_purchase' => 1.00})
165
+ action = JSON.parse(action)
166
+ @coupon_code = action['coupon_code']
167
+ end
168
+
169
+ #create
170
+ it "Coupon create returns successful result" do
171
+ action = Twocheckout::Coupon.create({'date_expire' => "2099-12-01",
172
+ 'type' => "shipping", 'minimum_purchase' => 1.00})
173
+ action = JSON.parse(action)
174
+ assert_equal('Coupon successfully created', action['response_message'])
175
+ end
176
+
177
+ #retrieve
178
+ it "Coupon retrieve returns successful result" do
179
+ action = Twocheckout::Coupon.retrieve()
180
+ action = JSON.parse(action)
181
+ assert_equal('Coupon information retrieved successfully.', action['response_message'])
182
+ end
183
+
184
+ #update
185
+ it "Coupon update returns successful result" do
186
+ action = Twocheckout::Coupon.update({'coupon_code' => @coupon_code, 'date_expire' => "2099-12-10"})
187
+ action = JSON.parse(action)
188
+ assert_equal('Coupon updated successfully', action['response_message'])
189
+ end
190
+
191
+ #delete
192
+ it "Coupon delete returns successful result" do
193
+ action = Twocheckout::Coupon.delete({'coupon_code' => @coupon_code})
194
+ action = JSON.parse(action)
195
+ assert_equal('Coupon successfully deleted.', action['response_message'])
196
+ end
197
+ end
198
+
199
+ describe Twocheckout::Option do
200
+ before do
201
+ Twocheckout.api_credentials=({'username' => 'APIuser1817037', 'password' => 'APIpass1817037'})
202
+ action = Twocheckout::Option.create({'option_name' => "test product", 'option_value_name' => "example",'option_value_surcharge' => 1.00})
203
+ action = JSON.parse(action)
204
+ @option_id = action['option_id']
205
+ end
206
+
207
+ #create
208
+ it "Option create returns successful result" do
209
+ action = Twocheckout::Option.create({'option_name' => "test product", 'option_value_name' => "example",'option_value_surcharge' => 1.00})
210
+ action = JSON.parse(action)
211
+ assert_equal('Option created successfully', action['response_message'])
212
+ end
213
+
214
+ #retrieve
215
+ it "Option retrieve returns successful result" do
216
+ action = Twocheckout::Option.retrieve()
217
+ action = JSON.parse(action)
218
+ assert_equal('Option information retrieved successfully.', action['response_message'])
219
+ end
220
+
221
+ #update
222
+ it "Option update returns successful result" do
223
+ action = Twocheckout::Option.update({'option_name' => "test option", 'option_id' => @option_id})
224
+ action = JSON.parse(action)
225
+ assert_equal('Option updated successfully', action['response_message'])
226
+ end
227
+
228
+ #delete
229
+ it "Option delete returns successful result" do
230
+ action = Twocheckout::Option.delete({'option_id' => @option_id})
231
+ action = JSON.parse(action)
232
+ assert_equal('Option deleted successfully', action['response_message'])
233
+ end
234
+ end
235
+
236
+ describe Twocheckout::Return do
237
+ before do
238
+ @params = {'order_number' => '4789848870', 'total' => '0.01', 'key' => 'CDF3E502AA1597DD4401760783432337'}
239
+ end
240
+
241
+ #check
242
+ it "Return check returns successful result" do
243
+ action = Twocheckout::Return.request({ :credentials => {'sid' => '1817037', 'secret' => 'tango'}, :params => @params})
244
+ action = JSON.parse(action)
245
+ assert_equal('PASS', action['code'])
246
+ end
247
+ end
248
+
249
+ describe Twocheckout::Ins do
250
+ before do
251
+ @params = {'sale_id' => '4789848870', 'invoice_id' => '4789848879', 'md5_hash' => '827220324C722873694758F38D8D3624'}
252
+ end
253
+
254
+ #check
255
+ it "Return check returns successful result" do
256
+ action = Twocheckout::Ins.request({ :credentials => {'sid' => '1817037', 'secret' => 'tango'}, :params => @params})
257
+ action = JSON.parse(action)
258
+ assert_equal('PASS', action['code'])
259
+ end
260
+ end
@@ -0,0 +1,62 @@
1
+ require 'rest_client'
2
+ require 'rubygems'
3
+ require 'cgi'
4
+ require 'json'
5
+ require 'net/http'
6
+ require 'base64'
7
+ require 'digest/md5'
8
+
9
+ require File.dirname(__FILE__) + '/twocheckout/api/sale.rb'
10
+ require File.dirname(__FILE__) + '/twocheckout/api/company.rb'
11
+ require File.dirname(__FILE__) + '/twocheckout/api/contact.rb'
12
+ require File.dirname(__FILE__) + '/twocheckout/api/product.rb'
13
+ require File.dirname(__FILE__) + '/twocheckout/api/option.rb'
14
+ require File.dirname(__FILE__) + '/twocheckout/api/coupon.rb'
15
+ require File.dirname(__FILE__) + '/twocheckout/charge.rb'
16
+ require File.dirname(__FILE__) + '/twocheckout/return.rb'
17
+ require File.dirname(__FILE__) + '/twocheckout/ins.rb'
18
+ require File.dirname(__FILE__) + '/twocheckout/util.rb'
19
+ require File.dirname(__FILE__) + '/twocheckout/message.rb'
20
+
21
+ module Twocheckout
22
+ @api_base = 'https://www.2checkout.com/api/'
23
+ @api_credentials = nil
24
+
25
+ def self.api_url(url='')
26
+ @api_base + url
27
+ end
28
+
29
+ def self.api_credentials=(options = {})
30
+ @api_credentials = options
31
+ end
32
+
33
+ def self.api_base=(api_base)
34
+ @api_base = api_base
35
+ end
36
+
37
+ def self.request(method, url, params=nil)
38
+
39
+ if method == :get
40
+ @url = api_url(url) + '?' + params.map{|k,v| "#{k}=#{v}"}.join('&')
41
+ params = nil
42
+ elsif method == :post
43
+ @url = api_url(url)
44
+ else
45
+
46
+ end
47
+
48
+ opts = {
49
+ :method => method,
50
+ :url => @url,
51
+ :headers => {:accept => :json, :content_type => :json},
52
+ :user => @api_credentials['username'],
53
+ :password => @api_credentials['password'],
54
+ :payload => params
55
+ }
56
+ begin
57
+ RestClient::Request.execute(opts)
58
+ rescue => e
59
+ TwocheckoutMessage.new(e.response).retrieve
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,8 @@
1
+ module Twocheckout
2
+ class Company
3
+
4
+ def self.retrieve(params={})
5
+ Twocheckout.request(:get, 'acct/detail_company_info', params)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Twocheckout
2
+ class Contact
3
+
4
+ def self.retrieve(params={})
5
+ Twocheckout.request(:get, 'acct/detail_contact_info', params)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ module Twocheckout
2
+ class Coupon
3
+
4
+ def self.create(params={})
5
+ Twocheckout.request(:post, 'products/create_coupon', params)
6
+ end
7
+
8
+ def self.retrieve(params={})
9
+ if params.has_key?("coupon_code")
10
+ Twocheckout.request(:get, 'products/detail_coupon', params)
11
+ else
12
+ Twocheckout.request(:get, 'products/list_coupons', params)
13
+ end
14
+ end
15
+
16
+ def self.update(params={})
17
+ Twocheckout.request(:post, 'products/update_coupon', params)
18
+ end
19
+
20
+ def self.delete(params={})
21
+ Twocheckout.request(:post, 'products/delete_coupon', params)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Twocheckout
2
+ class Option
3
+
4
+ def self.create(params={})
5
+ Twocheckout.request(:post, 'products/create_option', params)
6
+ end
7
+
8
+ def self.retrieve(params={})
9
+ if params.has_key?("option_id")
10
+ Twocheckout.request(:get, 'products/detail_option', params)
11
+ else
12
+ Twocheckout.request(:get, 'products/list_options', params)
13
+ end
14
+ end
15
+
16
+ def self.update(params={})
17
+ Twocheckout.request(:post, 'products/update_option', params)
18
+ end
19
+
20
+ def self.delete(params={})
21
+ Twocheckout.request(:post, 'products/delete_option', params)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Twocheckout
2
+ class Product
3
+
4
+ def self.create(params={})
5
+ Twocheckout.request(:post, 'products/create_product', params)
6
+ end
7
+
8
+ def self.retrieve(params={})
9
+ if params.has_key?("product_id")
10
+ Twocheckout.request(:get, 'products/detail_product', params)
11
+ else
12
+ Twocheckout.request(:get, 'products/list_products', params)
13
+ end
14
+ end
15
+
16
+ def self.update(params={})
17
+ Twocheckout.request(:post, 'products/update_product', params)
18
+ end
19
+
20
+ def self.delete(params={})
21
+ Twocheckout.request(:post, 'products/delete_product', params)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,84 @@
1
+ module Twocheckout
2
+ class Sale
3
+
4
+ def self.retrieve(params={})
5
+ if params.has_key?("sale_id") || params.has_key?("invoice_id")
6
+ Twocheckout.request(:get, 'sales/detail_sale', params)
7
+ else
8
+ Twocheckout.request(:get, 'sales/list_sales', params)
9
+ end
10
+ end
11
+
12
+ def self.refund(params={})
13
+ if params.has_key?("lineitem_id")
14
+ result = Twocheckout.request(:post, 'sales/refund_lineitem', params)
15
+ elsif params.has_key?("sale_id") || params.has_key?("invoice_id")
16
+ result = Twocheckout.request(:post, 'sales/refund_invoice', params)
17
+ else
18
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "You must pass a sale_id, invoice_id or lineitem_id."}]}
19
+ result = TwocheckoutMessage.new(message).retrieve
20
+ end
21
+ result
22
+ end
23
+
24
+ def self.stop(params={})
25
+ if params.has_key?("lineitem_id")
26
+ result = Twocheckout.request(:post, 'sales/stop_lineitem_recurring', params)
27
+ elsif params.has_key?("sale_id")
28
+ @sale = Twocheckout.request(:get, 'sales/detail_sale', params)
29
+ @sale = JSON.parse(@sale)
30
+ if @sale.has_key?("errors")
31
+ return @sale
32
+ end
33
+ @lineitems = Twocheckout::Util.active(@sale)
34
+ if @lineitems.empty?
35
+ message = {:errors => [{:code => "NOTICE", :message => "No Active recurring lineitems."}]}
36
+ result = TwocheckoutMessage.new(message).retrieve
37
+ else
38
+ result = {}
39
+ i=0
40
+ @lineitems.each do |k,v|
41
+ params={'lineitem_id' => v}
42
+ response = Twocheckout.request(:post, 'sales/stop_lineitem_recurring', params)
43
+ result[i] = response
44
+ i+=1
45
+ end
46
+ end
47
+ else
48
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "You must pass a sale_id or lineitem_id."}]}
49
+ result = TwocheckoutMessage.new(message).retrieve
50
+ end
51
+ result
52
+ end
53
+
54
+ def self.comment(params={})
55
+ if params.has_key?("sale_id" && "sale_comment")
56
+ result = Twocheckout.request(:post, 'sales/create_comment', params)
57
+ else
58
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "You must pass a sale_id and sale_comment."}]}
59
+ result = TwocheckoutMessage.new(message).retrieve
60
+ end
61
+ result
62
+ end
63
+
64
+ def self.ship(params={})
65
+ if params.has_key?("sale_id" && "tracking_number")
66
+ result = Twocheckout.request(:post, 'sales/mark_shipped', params)
67
+ else
68
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "You must pass a sale_id and tracking_number."}]}
69
+ result = TwocheckoutMessage.new(message).retrieve
70
+ end
71
+ result
72
+ end
73
+
74
+ def self.reauth(params={})
75
+ if params.has_key?("sale_id") || params.has_key?("invoice_id")
76
+ result = Twocheckout.request(:post, 'sales/reauth', params)
77
+ else
78
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "You must pass a sale_id or invoice_id."}]}
79
+ result = TwocheckoutMessage.new(message).retrieve
80
+ end
81
+ result
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,26 @@
1
+ module Twocheckout
2
+ class Charge
3
+
4
+ def self.form(params={})
5
+ @form = "<form id=\"2checkout\" action=\"https://www.2checkout.com/checkout/spurchase\" method=\"post\">\n";
6
+ params.each do |k,v|
7
+ @form = @form + "<input type=\"hidden\" name=\"" + k + "\" value=\"" + v.to_s + "\" />\n"
8
+ end
9
+ @form + "<input type=\"submit\" value=\"Proceed to Checkout\" />\n</form>"
10
+ end
11
+
12
+ def self.submit(params={})
13
+ @form = "<form id=\"2checkout\" action=\"https://www.2checkout.com/checkout/spurchase\" method=\"post\">\n";
14
+ params.each do |k,v|
15
+ @form = @form + "<input type=\"hidden\" name=\"" + k + "\" value=\"" + v.to_s + "\" />\n"
16
+ end
17
+ @form = @form + "</form>\n"
18
+ @form = @form + "<script type=\"text/javascript\">document.getElementById('2checkout').submit();</script>"
19
+ end
20
+
21
+ def self.link(params={}, url="https://www.2checkout.com/checkout/spurchase?")
22
+ @querystring = params.map{|k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}"}.join("&")
23
+ @purchase_url = url + @querystring
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ module Twocheckout
2
+ class Ins
3
+
4
+ # Checks against MD5 Hash
5
+ def self.check(sale_id, sid, invoice_id, secret, key)
6
+ Digest::MD5.hexdigest("#{sale_id}#{sid}#{invoice_id}#{secret}").upcase == key
7
+ end
8
+
9
+ # Parses Header Redirect Query String
10
+ def self.request(options={})
11
+ params = options[:params]
12
+ credentials = options[:credentials]
13
+ if params.is_a?(Hash)
14
+ if check(params['sale_id'], credentials['sid'], params['invoice_id'], credentials['secret'], params['md5_hash'])
15
+ message = {:code => "PASS", :message => "Hash Matched"}
16
+ result = TwocheckoutMessage.new(message).retrieve
17
+ else
18
+ message = {:code => "FAIL", :message => "Hash Mismatch"}
19
+ result = TwocheckoutMessage.new(message).retrieve
20
+ end
21
+ else
22
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "Hash was not passed"}]}
23
+ result = TwocheckoutMessage.new(message).retrieve
24
+ end
25
+ result
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ module Twocheckout
2
+ class TwocheckoutMessage < StandardError
3
+ attr_reader :message
4
+
5
+ def initialize(message=nil)
6
+ @message = message
7
+ end
8
+
9
+ def retrieve
10
+ if @message.is_a?(Hash)
11
+ @message = JSON.generate(@message)
12
+ "#{@message}"
13
+ else
14
+ "#{@message}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ module Twocheckout
2
+ class Return
3
+
4
+ # Checks against MD5 Hash
5
+ def self.check(secret, sid, order_number, total, key)
6
+ Digest::MD5.hexdigest("#{secret}#{sid}#{order_number}#{total}").upcase == key
7
+ end
8
+
9
+ # Parses Header Redirect Query String
10
+ def self.request(options={})
11
+ params = options[:params]
12
+ credentials = options[:credentials]
13
+ if params.is_a?(String)
14
+ params = Twocheckout::Util.parse(params)
15
+ end
16
+ if params['demo'] == 'Y'
17
+ params['order_number'] = 1
18
+ end
19
+ if params.is_a?(Hash)
20
+ if check(credentials['secret'], credentials['sid'], params['order_number'], params['total'], params['key'])
21
+ message = {:code => "PASS", :message => "Hash Matched"}
22
+ result = TwocheckoutMessage.new(message).retrieve
23
+ else
24
+ message = {:code => "FAIL", :message => "Hash Mismatch"}
25
+ result = TwocheckoutMessage.new(message).retrieve
26
+ end
27
+ else
28
+ message = {:errors => [{:code => "INVALID PARAMETER", :message => "Hash was not passed"}]}
29
+ result = TwocheckoutMessage.new(message).retrieve
30
+ end
31
+ result
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ module Twocheckout
2
+ class Util
3
+
4
+ # Parse Header Redirect
5
+ def self.parse(querystring)
6
+ params = querystring.split('&').inject({}) do |result, q|
7
+ k,v = q.split('=')
8
+ if !v.nil?
9
+ result.merge({k => v})
10
+ elsif !result.key?(k)
11
+ result.merge({k => true})
12
+ else
13
+ result
14
+ end
15
+ end
16
+ params
17
+ end
18
+
19
+ # Get active recurring lineitems
20
+ def self.active(params)
21
+ @invoice = params['sale']['invoices'].last['lineitems']
22
+ @lineitems = {}
23
+ i=0
24
+ @invoice.each do |li|
25
+ if li['billing']['recurring_status'] == 'active'
26
+ li.each do |k,v|
27
+ if k == "lineitem_id"
28
+ @lineitems[i] = v
29
+ i+=1
30
+ end
31
+ end
32
+ end
33
+ end
34
+ @lineitems
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
3
+
4
+ Gem::Specification.new do |s|
5
+ s.platform = Gem::Platform::RUBY
6
+ s.name = 'twocheckout'
7
+ s.version = '0.0.1'
8
+ s.summary = '2Checkout Ruby Library'
9
+ s.description = '0.0.1'
10
+ s.summary = '2Checkout Ruby Library'
11
+ s.author = 'Craig Christenson'
12
+ s.email = 'christensoncraig@gmail.com'
13
+ s.homepage = 'https://github.com/craigchristenson'
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.add_dependency('rest-client', '~> 1.4')
18
+ s.require_paths = %w{lib}
19
+ s.requirements << 'none'
20
+
21
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twocheckout
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Craig Christenson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.4'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.4'
30
+ description: 0.0.1
31
+ email: christensoncraig@gmail.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - .gitignore
37
+ - LICENSE
38
+ - README.md
39
+ - lib/test/test_twocheckout.rb
40
+ - lib/twocheckout.rb
41
+ - lib/twocheckout/api/company.rb
42
+ - lib/twocheckout/api/contact.rb
43
+ - lib/twocheckout/api/coupon.rb
44
+ - lib/twocheckout/api/option.rb
45
+ - lib/twocheckout/api/product.rb
46
+ - lib/twocheckout/api/sale.rb
47
+ - lib/twocheckout/charge.rb
48
+ - lib/twocheckout/ins.rb
49
+ - lib/twocheckout/message.rb
50
+ - lib/twocheckout/return.rb
51
+ - lib/twocheckout/util.rb
52
+ - twocheckout.gemspec
53
+ homepage: https://github.com/craigchristenson
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements:
72
+ - none
73
+ rubyforge_project:
74
+ rubygems_version: 1.8.24
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: 2Checkout Ruby Library
78
+ test_files: []