bluepay 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +28 -0
- data/Rakefile +89 -0
- data/lib/Bluepay.rb +206 -0
- data/test/bp20post_test.rb +12 -0
- metadata +49 -0
data/README
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
== Welcome to Bluepay
|
2
|
+
|
3
|
+
Bluepay is used to process credit cards and ach transactions using the BluePay 2.0 Gateway.
|
4
|
+
|
5
|
+
BluePay, Inc. is a merchant account provider and payment gateway. The BluePay 2.0 Gateway processes credit card and
|
6
|
+
ACH transactions through a virtual terminal and various API/SDK/Payment Interfaces.
|
7
|
+
|
8
|
+
To apply for a BluePay merchant account and payment gateway, visit http://www.bluepay.com.
|
9
|
+
|
10
|
+
== Example
|
11
|
+
|
12
|
+
require "Bluepay"
|
13
|
+
|
14
|
+
tob = Bluepay.new("123123123123", "ABCDabcdABCDabcdABCDabcdABCDabcd")
|
15
|
+
tob.easy_sale("1.00")
|
16
|
+
tob.use_card("4111111111111111", "1109", "123")
|
17
|
+
tob.process()
|
18
|
+
puts "Status: " + tob.get_status()
|
19
|
+
puts "Message: " + tob.get_message()
|
20
|
+
puts "Transaction ID: " + tob.get_trans_id()
|
21
|
+
|
22
|
+
== About
|
23
|
+
|
24
|
+
Author:: Chris Jansen
|
25
|
+
ReadmeDoc:: Christopher Kois
|
26
|
+
Copyright:: Copyright (c) 2008 BluePay, Inc.
|
27
|
+
License:: GPL - GNU General Public License - http://www.gnu.org/licenses/gpl.html
|
28
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
require 'rake/contrib/rubyforgepublisher'
|
7
|
+
|
8
|
+
PKG_VERSION = "1.0.1"
|
9
|
+
|
10
|
+
PKG_FILES = FileList[
|
11
|
+
"lib/**/*", "bin/*", "test/**/*", "[A-Z]*", "Rakefile", "doc/**/*"
|
12
|
+
]
|
13
|
+
|
14
|
+
desc "Default Task"
|
15
|
+
task :default => [ :test ]
|
16
|
+
|
17
|
+
# Run the unit tests
|
18
|
+
desc "Run all unit tests"
|
19
|
+
Rake::TestTask.new("test") { |t|
|
20
|
+
t.libs << "lib"
|
21
|
+
t.pattern = 'test/*/*_test.rb'
|
22
|
+
t.verbose = true
|
23
|
+
}
|
24
|
+
|
25
|
+
# Make a console, useful when working on tests
|
26
|
+
desc "Generate a test console"
|
27
|
+
task :console do
|
28
|
+
verbose( false ) { sh "irb -I lib/ -r 'bluepay'" }
|
29
|
+
end
|
30
|
+
|
31
|
+
# Genereate the RDoc documentation
|
32
|
+
desc "Create documentation"
|
33
|
+
Rake::RDocTask.new("doc") { |rdoc|
|
34
|
+
rdoc.title = "Ruby Merchant Bluepay"
|
35
|
+
rdoc.rdoc_dir = 'doc'
|
36
|
+
rdoc.rdoc_files.include('README')
|
37
|
+
rdoc.rdoc_files.include('lib/*.rb')
|
38
|
+
}
|
39
|
+
|
40
|
+
# Genereate the package
|
41
|
+
spec = Gem::Specification.new do |s|
|
42
|
+
|
43
|
+
#### Basic information.
|
44
|
+
|
45
|
+
s.name = 'bluepay'
|
46
|
+
s.version = PKG_VERSION
|
47
|
+
s.summary = <<-EOF
|
48
|
+
Bluepay is used to process credit card and ach transactions through the BluePay 2.0 Gateway.
|
49
|
+
EOF
|
50
|
+
s.description = <<-EOF
|
51
|
+
This package allows a user to run credit card and ach transactions through the BluePay 2.0
|
52
|
+
Gateway. BluePay is a merchant account provider and payment gateway. BluePay, Inc. is a
|
53
|
+
one-stop shop merchant services provider. For more information, visit: http://www.bluepay.com
|
54
|
+
EOF
|
55
|
+
|
56
|
+
#### Which files are to be included in this gem? Everything! (Except SVN directories.)
|
57
|
+
|
58
|
+
s.files = PKG_FILES
|
59
|
+
|
60
|
+
#### Load-time details: library and application (you will need one or both).
|
61
|
+
|
62
|
+
s.require_path = 'lib'
|
63
|
+
s.autorequire = 'bluepay'
|
64
|
+
|
65
|
+
#### Documentation and testing.
|
66
|
+
|
67
|
+
s.has_rdoc = true
|
68
|
+
|
69
|
+
#### Author and project details.
|
70
|
+
|
71
|
+
s.author = "Chris Jansen"
|
72
|
+
s.email = "cjansen@bluepay.com"
|
73
|
+
s.homepage = "http://www.bluepay.com/"
|
74
|
+
end
|
75
|
+
|
76
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
77
|
+
pkg.need_zip = true
|
78
|
+
pkg.need_tar = true
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "Report code statistics (KLOCs, etc) from the application"
|
82
|
+
task :stats do
|
83
|
+
require 'code_statistics'
|
84
|
+
CodeStatistics.new(
|
85
|
+
["Library", "lib"],
|
86
|
+
["Units", "test"]
|
87
|
+
).to_s
|
88
|
+
end
|
89
|
+
|
data/lib/Bluepay.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2008 BluePay, Inc.
|
4
|
+
# Author: Chris Jansen
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
# a copy of this software and associated documentation files (the
|
8
|
+
# "Software"), to deal in the Software without restriction, including
|
9
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
# the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be
|
15
|
+
# included in all copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
#++
|
25
|
+
#
|
26
|
+
# See Bluepay documentation.
|
27
|
+
|
28
|
+
require "net/http"
|
29
|
+
require "net/https"
|
30
|
+
require "uri"
|
31
|
+
require "md5"
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
class Bluepay
|
36
|
+
|
37
|
+
@@SERVER = "secure.bluepay.com"
|
38
|
+
@@PATH = "/interfaces/bp20post"
|
39
|
+
|
40
|
+
def initialize(account,key,mode='TEST')
|
41
|
+
@ACCOUNT_ID = account
|
42
|
+
@SECRET_KEY = key
|
43
|
+
@PARAM_HASH = { 'MODE' => mode }
|
44
|
+
@RETURN_HASH = Hash.new()
|
45
|
+
end
|
46
|
+
|
47
|
+
# used to set all other parameters... there's a lot of them.
|
48
|
+
# See Bluepay20post.txt
|
49
|
+
def set_param(key, val)
|
50
|
+
@PARAM_HASH[key] = val
|
51
|
+
end
|
52
|
+
|
53
|
+
# Set up an ACH transaction. Expects:
|
54
|
+
# acc_type: C for Checking, S for Savings
|
55
|
+
# routing: Bank routing number
|
56
|
+
# account: Customer's checking or savings account number
|
57
|
+
# doc_type: WEB, TEL, ARC, etc -- see docs. Optional.
|
58
|
+
# REMEMBER: Ach requires some other fields,
|
59
|
+
# such as address and phone
|
60
|
+
def use_check(acc_type, routing, account, doc_type)
|
61
|
+
@PARAM_HASH['PAYMENT_ACCOUNT'] = "#{acc_type}:#{routing}:#{account}"
|
62
|
+
@PARAM_HASH['DOC_TYPE'] = doc_type
|
63
|
+
@PARAM_HASH['PAYMENT_TYPE'] = "ACH"
|
64
|
+
end
|
65
|
+
|
66
|
+
# Set up a credit card payment.
|
67
|
+
def use_card(account, expire, cvv)
|
68
|
+
@PARAM_HASH['PAYMENT_ACCOUNT'] = account
|
69
|
+
@PARAM_HASH['CARD_EXPIRE'] = expire
|
70
|
+
@PARAM_HASH['CARD_CVV2'] = cvv
|
71
|
+
end
|
72
|
+
|
73
|
+
# Set up a sale
|
74
|
+
def easy_sale(amount)
|
75
|
+
@PARAM_HASH['TRANS_TYPE'] = 'SALE'
|
76
|
+
@PARAM_HASH['AMOUNT'] = amount
|
77
|
+
end
|
78
|
+
|
79
|
+
# Set up an Auth-only
|
80
|
+
def easy_auth(amount)
|
81
|
+
@PARAM_HASH['TRANS_TYPE'] = 'AUTH'
|
82
|
+
@PARAM_HASH['AMOUNT'] = amount
|
83
|
+
end
|
84
|
+
|
85
|
+
# Capture an auth
|
86
|
+
def easy_capture(trans_id)
|
87
|
+
@PARAM_HASH['TRANS_TYPE'] = 'CAPTURE'
|
88
|
+
@PARAM_HASH['MASTER_ID'] = trans_id
|
89
|
+
end
|
90
|
+
|
91
|
+
# Refund
|
92
|
+
def easy_refund(trans_id)
|
93
|
+
@PARAM_HASH['TRANS_TYPE'] = 'REFUND'
|
94
|
+
@PARAM_HASH['MASTER_ID'] = trans_id
|
95
|
+
end
|
96
|
+
|
97
|
+
# This is the important stuff to get
|
98
|
+
# the best rates on CC transactions.
|
99
|
+
def customer_data(name1, name2, addr1, city, state, zip)
|
100
|
+
@PARAM_HASH['NAME1'] = name1
|
101
|
+
@PARAM_HASH['NAME2'] = name2
|
102
|
+
@PARAM_HASH['ADDR1'] = addr1
|
103
|
+
@PARAM_HASH['CITY'] = city
|
104
|
+
@PARAM_HASH['STATE'] = state
|
105
|
+
@PARAM_HASH['ZIP'] = zip
|
106
|
+
end
|
107
|
+
|
108
|
+
# Turns a hash into a foo=bar&baz=bat style string
|
109
|
+
def uri_query(h)
|
110
|
+
a = Array.new()
|
111
|
+
h.each_pair {|key, val| a.push(URI.escape(key) + "=" + URI.escape(val)) }
|
112
|
+
return a.join("&")
|
113
|
+
end
|
114
|
+
|
115
|
+
# Sets TAMPER_PROOF_SEAL in @PARAM_HASH
|
116
|
+
def calc_tps()
|
117
|
+
# Take the cheap way out. I wrote bp20post and I hereby publically
|
118
|
+
# state the TPS in bp20post is stupid.
|
119
|
+
@PARAM_HASH["TPS_DEF"] = "HELLO_MOTHER"
|
120
|
+
@PARAM_HASH["TAMPER_PROOF_SEAL"] = MD5.new(@SECRET_KEY).hexdigest
|
121
|
+
end
|
122
|
+
|
123
|
+
# Run a transaction - you must have called appropriate functions
|
124
|
+
# to set the transaction type, etc before calling this.
|
125
|
+
def process()
|
126
|
+
ua = Net::HTTP.new(@@SERVER, 443)
|
127
|
+
ua.use_ssl = true
|
128
|
+
|
129
|
+
# Generate the query string and headers
|
130
|
+
calc_tps()
|
131
|
+
query = "ACCOUNT_ID=#{@ACCOUNT_ID}&"
|
132
|
+
query += uri_query(@PARAM_HASH)
|
133
|
+
|
134
|
+
queryheaders = {
|
135
|
+
'User-Agent' => 'Bluepay Ruby Client',
|
136
|
+
'Content-Type' => 'application/x-www-form-urlencoded'
|
137
|
+
}
|
138
|
+
|
139
|
+
# Make Bluepay do Super CreditCard Magic
|
140
|
+
headers, body = ua.post(@@PATH, query, queryheaders)
|
141
|
+
|
142
|
+
# Split the response into the response hash.
|
143
|
+
# Also, we stuff in RESPONSE_CODE expected to be 200 or 400...
|
144
|
+
@RESPONSE_HASH = { "RESPONSE_CODE" => headers.code }
|
145
|
+
body.split("&").each { |pair|
|
146
|
+
(key, val) = pair.split("=")
|
147
|
+
val = "" if(val == nil)
|
148
|
+
@RESPONSE_HASH[URI.unescape(key)] = URI.unescape(val)
|
149
|
+
}
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns ! on WTF, E for Error, 1 for Approved, 0 for Decline
|
153
|
+
def get_status()
|
154
|
+
return 'E' if(@RESPONSE_HASH['RESPONSE_CODE'] == 400)
|
155
|
+
return '1' if(@RESPONSE_HASH['STATUS'] == '1');
|
156
|
+
return '0' if(@RESPONSE_HASH['STATUS'] == '0');
|
157
|
+
return 'E' if(@RESPONSE_HASH['STATUS'] == 'E');
|
158
|
+
return '!'
|
159
|
+
end
|
160
|
+
|
161
|
+
# Returns the human-readable response from Bluepay.
|
162
|
+
# Or a nasty error.
|
163
|
+
def get_message()
|
164
|
+
m = @RESPONSE_HASH['MESSAGE']
|
165
|
+
if (m == nil or m == "")
|
166
|
+
return "ERROR - NO MESSAGE FROM BLUEPAY"
|
167
|
+
end
|
168
|
+
return m
|
169
|
+
end
|
170
|
+
|
171
|
+
# Returns the single-character AVS response from the
|
172
|
+
# Card Issuing Bank
|
173
|
+
def get_avs_code()
|
174
|
+
return @RESPONSE_HASH['AVS']
|
175
|
+
end
|
176
|
+
|
177
|
+
# Same as avs_code, but for CVV2
|
178
|
+
def get_cvv2_code()
|
179
|
+
return @RESPONSE_HASH['CVV2']
|
180
|
+
end
|
181
|
+
|
182
|
+
# In the case of an approved transaction, contains the
|
183
|
+
# 6-character authorization code from the processing network.
|
184
|
+
# In the case of a decline or error, the contents may be junk.
|
185
|
+
def get_auth_code()
|
186
|
+
return @RESPONSE_HASH['AUTH_CODE']
|
187
|
+
end
|
188
|
+
|
189
|
+
# The all-important transaction ID.
|
190
|
+
def get_trans_id()
|
191
|
+
return @RESPONSE_HASH['TRANS_ID']
|
192
|
+
end
|
193
|
+
|
194
|
+
# If you set up a rebilling, this'll get it's ID.
|
195
|
+
def get_rebill_id()
|
196
|
+
return @RESPONSE_HASH['REBID']
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require "Bluepay"
|
4
|
+
|
5
|
+
tob = Bluepay.new("123123123123", "ABCDabcdABCDabcdABCDabcdABCDabcd")
|
6
|
+
tob.easy_sale("1.00")
|
7
|
+
tob.use_card("4111111111111111", "1109", "123")
|
8
|
+
tob.process()
|
9
|
+
puts "Status: " + tob.get_status()
|
10
|
+
puts "Message: " + tob.get_message()
|
11
|
+
puts "Transaction ID: " + tob.get_trans_id()
|
12
|
+
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: bluepay
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.1
|
7
|
+
date: 2008-05-23 00:00:00 -05:00
|
8
|
+
summary: Bluepay is used to process credit card and ach transactions through the BluePay 2.0 Gateway.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: cjansen@bluepay.com
|
12
|
+
homepage: http://www.bluepay.com/
|
13
|
+
rubyforge_project:
|
14
|
+
description: "This package allows a user to run credit card and ach transactions through the BluePay 2.0 Gateway. BluePay is a merchant account provider and payment gateway. BluePay, Inc. is a one-stop shop merchant services provider. For more information, visit: http://www.bluepay.com"
|
15
|
+
autorequire: bluepay
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Chris Jansen
|
31
|
+
files:
|
32
|
+
- lib/Bluepay.rb
|
33
|
+
- test/bp20post_test.rb
|
34
|
+
- README
|
35
|
+
- Rakefile
|
36
|
+
test_files: []
|
37
|
+
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
extra_rdoc_files: []
|
41
|
+
|
42
|
+
executables: []
|
43
|
+
|
44
|
+
extensions: []
|
45
|
+
|
46
|
+
requirements: []
|
47
|
+
|
48
|
+
dependencies: []
|
49
|
+
|