vaulted_billing 0.0.14 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +73 -1
- data/lib/ext/cacert.pem +3509 -0
- data/lib/vaulted_billing/configuration.rb +49 -2
- data/lib/vaulted_billing/credit_card.rb +34 -13
- data/lib/vaulted_billing/customer.rb +18 -3
- data/lib/vaulted_billing/gateways/authorize_net_cim.rb +0 -1
- data/lib/vaulted_billing/gateways/bogus.rb +11 -1
- data/lib/vaulted_billing/gateways/nmi_customer_vault.rb +0 -1
- data/lib/vaulted_billing/https_interface.rb +2 -7
- data/lib/vaulted_billing/transaction.rb +19 -0
- data/lib/vaulted_billing/version.rb +1 -1
- data/lib/vaulted_billing.rb +17 -2
- metadata +4 -14
@@ -1,13 +1,34 @@
|
|
1
|
+
|
1
2
|
module VaultedBilling
|
3
|
+
##
|
4
|
+
# This configuration holds the default values to use when instantiating
|
5
|
+
# VaultedBilling gateways. This configuration is accessed via
|
6
|
+
# VaultedBilling.config, or set en mass via a Hash with
|
7
|
+
# VaultedBilling.set_config(...).
|
8
|
+
#
|
2
9
|
class Configuration
|
3
|
-
|
10
|
+
##
|
11
|
+
# This class holds default configuration options for a specific
|
12
|
+
# gateway in the library.
|
13
|
+
#
|
14
|
+
class GatewayConfiguration
|
4
15
|
attr_accessor :username, :password, :test_mode
|
5
16
|
|
17
|
+
##
|
18
|
+
# Possible options are:
|
19
|
+
#
|
20
|
+
# * password - The default password for the gateway.
|
21
|
+
# * test_mode - A boolean indicating whether or not to use the test mode of the gateway (sandbox server, test API, etc.)
|
22
|
+
# * username - The default username for the gateway.
|
23
|
+
#
|
24
|
+
# Unless otherwise defined, test_mode will default to being true.
|
25
|
+
#
|
6
26
|
def initialize(options = {}, &block)
|
7
27
|
options = options.with_indifferent_access
|
8
28
|
self.username = options[:username]
|
9
29
|
self.password = options[:password]
|
10
|
-
self.test_mode = options.has_key?(:test_mode) ?
|
30
|
+
self.test_mode = options.has_key?(:test_mode) ?
|
31
|
+
options[:test_mode] : true
|
11
32
|
yield(self) if block_given?
|
12
33
|
end
|
13
34
|
end
|
@@ -15,24 +36,50 @@ module VaultedBilling
|
|
15
36
|
attr_accessor :logger
|
16
37
|
alias :logger? :logger
|
17
38
|
|
39
|
+
attr_accessor :ca_file
|
40
|
+
|
18
41
|
attr_accessor :test_mode
|
19
42
|
|
43
|
+
##
|
44
|
+
# Possible options are as follows:
|
45
|
+
#
|
46
|
+
# * authorize_net_cim - A hash of GatewayConfiguration options for the Authorize.net CIM
|
47
|
+
# * bogus - A hash of GatewayConfiguration options for the Bogus gateway
|
48
|
+
# * nmi_customer_vault - A hash of GatewayConfiguration options for the NMI Customer Vault
|
49
|
+
# * test_mode - A boolean indicating whether or not the system defaults to using the test end points on the gateways.
|
50
|
+
#
|
20
51
|
def initialize(options = {})
|
21
52
|
options = options.with_indifferent_access
|
22
53
|
self.test_mode = options.has_key?(:test_mode) ? options[:test_mode] : true
|
23
54
|
@_authorize_net_cim = GatewayConfiguration.new(options[:authorize_net_cim]) if options[:authorize_net_cim]
|
24
55
|
@_nmi_customer_vault = GatewayConfiguration.new(options[:nmi_customer_vault]) if options[:nmi_customer_vault]
|
25
56
|
@_bogus = GatewayConfiguration.new(options[:bogus]) if options[:bogus]
|
57
|
+
@ca_file = File.expand_path('../../ext/cacert.pem', __FILE__)
|
26
58
|
end
|
27
59
|
|
60
|
+
##
|
61
|
+
# Returns a VaultedBilling::Configuration::GatewayConfiguration
|
62
|
+
# instance to be used for defining default settings for the
|
63
|
+
# Authorize.net CIM gateway.
|
64
|
+
#
|
28
65
|
def authorize_net_cim
|
29
66
|
@_authorize_net_cim ||= GatewayConfiguration.new
|
30
67
|
end
|
31
68
|
|
69
|
+
##
|
70
|
+
# Returns a VaultedBilling::Configuration::GatewayConfiguration
|
71
|
+
# instance to be used for defining default settings for the
|
72
|
+
# NMI Customer Vault gateway.
|
73
|
+
#
|
32
74
|
def nmi_customer_vault
|
33
75
|
@_nmi_customer_vault ||= GatewayConfiguration.new
|
34
76
|
end
|
35
77
|
|
78
|
+
##
|
79
|
+
# Returns a VaultedBilling::Configuration::GatewayConfiguration
|
80
|
+
# instance to be used for defining default settings for the
|
81
|
+
# Bogus gateway.
|
82
|
+
#
|
36
83
|
def bogus
|
37
84
|
@_bogus ||= GatewayConfiguration.new
|
38
85
|
end
|
@@ -1,19 +1,40 @@
|
|
1
1
|
module VaultedBilling
|
2
|
+
##
|
3
|
+
# Intermediary class used to translate your local credit card information
|
4
|
+
# into data which VaultedBilling can recognize and use.
|
5
|
+
#
|
6
|
+
# Generally - and this is gateway specific - the only data which is
|
7
|
+
# actually required is the card number and expiration date (expires_on).
|
8
|
+
# Most of the other data is optional and may or may not be stored by
|
9
|
+
# your gateway.
|
10
|
+
#
|
11
|
+
# Note: The vault_id is the unique identifier generated by your gateway
|
12
|
+
# when you initially store the customer information. This should be
|
13
|
+
# kept and stored locally, related to your local credit card information.
|
14
|
+
# If you generate a CreditCard object with a vault_id, it is assumed that
|
15
|
+
# the card is already stored on the gateway and is not new information.
|
16
|
+
#
|
2
17
|
class CreditCard
|
3
|
-
attr_accessor :
|
4
|
-
attr_accessor :
|
5
|
-
attr_accessor :
|
6
|
-
attr_accessor :cvv_number
|
7
|
-
attr_accessor :expires_on
|
8
|
-
attr_accessor :first_name
|
9
|
-
attr_accessor :last_name
|
10
|
-
attr_accessor :
|
11
|
-
attr_accessor :
|
12
|
-
attr_accessor :
|
13
|
-
attr_accessor :
|
14
|
-
attr_accessor :
|
15
|
-
attr_accessor :
|
18
|
+
attr_accessor :card_number # The customer's credit card number
|
19
|
+
attr_accessor :country # The country of the credit card address.
|
20
|
+
attr_accessor :currency # The currency used by the credit card.
|
21
|
+
attr_accessor :cvv_number # The verification number (CVV2) on the card.
|
22
|
+
attr_accessor :expires_on # The date on which the credit card expires.
|
23
|
+
attr_accessor :first_name # The first name of the cardholder.
|
24
|
+
attr_accessor :last_name # The last name of the cardholder.
|
25
|
+
attr_accessor :locality # The "city" of the address on the card.
|
26
|
+
attr_accessor :phone # A phone number for the cardholder.
|
27
|
+
attr_accessor :postal_code # The postal code (zipcode) for the card.
|
28
|
+
attr_accessor :region # The "state" of the address on the card.
|
29
|
+
attr_accessor :street_address # The house number and street name of the card address.
|
30
|
+
attr_accessor :vault_id # The unique, gateway-generated identifier for this credit card.
|
16
31
|
|
32
|
+
##
|
33
|
+
# You may define any of the CreditCard attributes by passing a hash
|
34
|
+
# with the attribute name as the key:
|
35
|
+
#
|
36
|
+
# CreditCard.new(:card_number => '4111....')
|
37
|
+
#
|
17
38
|
def initialize(attributes = {})
|
18
39
|
attributes = HashWithIndifferentAccess.new(attributes)
|
19
40
|
attributes.each_pair do |key, value|
|
@@ -1,9 +1,24 @@
|
|
1
1
|
module VaultedBilling
|
2
|
+
##
|
3
|
+
# An intermediary object for VaultedBilling which represents a single
|
4
|
+
# customer on the gateway.
|
5
|
+
#
|
6
|
+
# Many gateways support you in defining multiple credit cards or payment
|
7
|
+
# methods under a single customer object. To support this, they will
|
8
|
+
# generate one identifier for the top-level customer, and then separate
|
9
|
+
# identifiers for each payment method (see VaultedBilling::CreditCard).
|
10
|
+
#
|
2
11
|
class Customer
|
3
|
-
attr_accessor :
|
4
|
-
attr_accessor :merchant_id
|
5
|
-
attr_accessor :
|
12
|
+
attr_accessor :email # Optional email address for the customer.
|
13
|
+
attr_accessor :merchant_id # Optional custom identifier for the customer (i.e. your database key).
|
14
|
+
attr_accessor :vault_id # Gateway generated unique identifier for this customer in their system.
|
6
15
|
|
16
|
+
##
|
17
|
+
# You can mass assign the attributes by passing a hash with keys
|
18
|
+
# matching attributes of the Customer:
|
19
|
+
#
|
20
|
+
# Customer.new(:merchant_id => 1)
|
21
|
+
#
|
7
22
|
def initialize(attributes = {})
|
8
23
|
attributes = HashWithIndifferentAccess.new(attributes)
|
9
24
|
@vault_id = attributes[:vault_id]
|
@@ -13,7 +13,6 @@ module VaultedBilling
|
|
13
13
|
def initialize(options = {})
|
14
14
|
self.test_uri = 'https://apitest.authorize.net/xml/v1/request.api'
|
15
15
|
self.live_uri = 'https://api.authorize.net/xml/v1/request.api'
|
16
|
-
self.ssl_pem = File.read(File.expand_path(File.join(File.dirname(__FILE__), '..', 'certificate_authorities', 'entrust.pem')))
|
17
16
|
|
18
17
|
options = HashWithIndifferentAccess.new(options)
|
19
18
|
@login = options[:username] || VaultedBilling.config.authorize_net_cim.username
|
@@ -2,6 +2,16 @@ require 'digest/md5'
|
|
2
2
|
|
3
3
|
module VaultedBilling
|
4
4
|
module Gateways
|
5
|
+
##
|
6
|
+
# The Bogus gateway should only be used for simple interface testing
|
7
|
+
# to the VaultedBilling library. All customer and credit card requests
|
8
|
+
# will always return successfully. All transaction requests (purchase,
|
9
|
+
# authorize, capture, etc.) will always return successfully.
|
10
|
+
#
|
11
|
+
# The primary purpose of this gateway is to provide you with an end
|
12
|
+
# point for testing your interface, as well as a fairly reasonable
|
13
|
+
# gateway for performing simple, non-network based tests against.
|
14
|
+
#
|
5
15
|
class Bogus
|
6
16
|
include VaultedBilling::Gateway
|
7
17
|
|
@@ -69,4 +79,4 @@ module VaultedBilling
|
|
69
79
|
end
|
70
80
|
end
|
71
81
|
end
|
72
|
-
end
|
82
|
+
end
|
@@ -17,7 +17,6 @@ module VaultedBilling
|
|
17
17
|
|
18
18
|
def initialize(options = {})
|
19
19
|
self.live_uri = self.test_uri = "https://secure.nmi.com/api/transact.php"
|
20
|
-
self.ssl_pem = File.read(File.expand_path(File.join(File.dirname(__FILE__), '..', 'certificate_authorities', 'verisign.pem')))
|
21
20
|
|
22
21
|
options = HashWithIndifferentAccess.new(options)
|
23
22
|
@username = options[:username] || VaultedBilling.config.nmi_customer_vault.username
|
@@ -41,7 +41,6 @@ module VaultedBilling
|
|
41
41
|
end
|
42
42
|
|
43
43
|
attr_writer :use_test_uri
|
44
|
-
attr_writer :ssl_pem
|
45
44
|
|
46
45
|
def live_uri=(input)
|
47
46
|
@live_uri = input ? URI.parse(input) : nil
|
@@ -70,12 +69,8 @@ module VaultedBilling
|
|
70
69
|
request.body = data
|
71
70
|
response = Net::HTTP.new(uri.host, uri.port).tap do |https|
|
72
71
|
https.use_ssl = true
|
73
|
-
|
74
|
-
|
75
|
-
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
76
|
-
else
|
77
|
-
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
78
|
-
end
|
72
|
+
https.ca_file = VaultedBilling.config.ca_file
|
73
|
+
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
79
74
|
end
|
80
75
|
|
81
76
|
before_post_caller(data)
|
@@ -1,11 +1,30 @@
|
|
1
1
|
module VaultedBilling
|
2
|
+
##
|
3
|
+
# This class encapsulates the data returned by the gateway / payment
|
4
|
+
# processor for transaction requests. An instance of this class will
|
5
|
+
# be returned from all transaction requests (authorize, capture,
|
6
|
+
# refund, void, etc.) performed against a gateway.
|
7
|
+
#
|
2
8
|
class Transaction
|
9
|
+
# The transaction identifier from the processor
|
3
10
|
attr_accessor :id
|
11
|
+
|
12
|
+
# The authorization code for the transaction
|
4
13
|
attr_accessor :authcode
|
14
|
+
|
15
|
+
# The address verification service response
|
5
16
|
attr_accessor :avs_response
|
17
|
+
|
18
|
+
# The card verification number response
|
6
19
|
attr_accessor :cvv_response
|
20
|
+
|
21
|
+
# The response code from the processor
|
7
22
|
attr_accessor :code
|
23
|
+
|
24
|
+
# The message from the processor
|
8
25
|
attr_accessor :message
|
26
|
+
|
27
|
+
# The masked card number used in the transaction, if available
|
9
28
|
attr_accessor :masked_card_number
|
10
29
|
|
11
30
|
def initialize(attributes = {})
|
data/lib/vaulted_billing.rb
CHANGED
@@ -8,8 +8,6 @@ module VaultedBilling
|
|
8
8
|
autoload :Transaction, 'vaulted_billing/transaction'
|
9
9
|
autoload :HttpsInterface, 'vaulted_billing/https_interface'
|
10
10
|
|
11
|
-
mattr_accessor :config
|
12
|
-
|
13
11
|
Dir[File.expand_path('../vaulted_billing/core_ext/**/*.rb', __FILE__)].each do |extension|
|
14
12
|
require extension
|
15
13
|
end
|
@@ -25,10 +23,27 @@ module VaultedBilling
|
|
25
23
|
Gateways.const_get(name.to_s.camelize)
|
26
24
|
end
|
27
25
|
|
26
|
+
##
|
27
|
+
# Returns the VaultedBilling::Configuration. This is primarily used to
|
28
|
+
# modify the default settings used when new gateways are instantiated.
|
29
|
+
#
|
28
30
|
def self.config
|
29
31
|
@@config ||= VaultedBilling::Configuration.new
|
30
32
|
end
|
31
33
|
|
34
|
+
##
|
35
|
+
# A helper method to allow you to set the configuration en mass via
|
36
|
+
# a properly formatted Hash of options:
|
37
|
+
#
|
38
|
+
# VaultedBilling.set_config({
|
39
|
+
# :test_mode => false,
|
40
|
+
# :authorize_net_cim => {
|
41
|
+
# :username => 'APIName',
|
42
|
+
# :password => 'APIPassword',
|
43
|
+
# :test_mode => false,
|
44
|
+
# :nmi_customer_vault => { ... }
|
45
|
+
# })
|
46
|
+
#
|
32
47
|
def self.set_config(options = {})
|
33
48
|
@@config = VaultedBilling::Configuration.new(options)
|
34
49
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vaulted_billing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 3
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 15
|
9
|
+
version: 0.0.15
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Nathaniel Bibler
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date:
|
17
|
+
date: 2011-01-03 00:00:00 -05:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 5
|
30
28
|
segments:
|
31
29
|
- 2
|
32
30
|
- 3
|
@@ -41,7 +39,6 @@ dependencies:
|
|
41
39
|
requirements:
|
42
40
|
- - ">="
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 15
|
45
42
|
segments:
|
46
43
|
- 2
|
47
44
|
- 1
|
@@ -57,7 +54,6 @@ dependencies:
|
|
57
54
|
requirements:
|
58
55
|
- - ">="
|
59
56
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 3
|
61
57
|
segments:
|
62
58
|
- 2
|
63
59
|
- 3
|
@@ -73,7 +69,6 @@ dependencies:
|
|
73
69
|
requirements:
|
74
70
|
- - ">="
|
75
71
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 25
|
77
72
|
segments:
|
78
73
|
- 0
|
79
74
|
- 0
|
@@ -89,7 +84,6 @@ dependencies:
|
|
89
84
|
requirements:
|
90
85
|
- - ">="
|
91
86
|
- !ruby/object:Gem::Version
|
92
|
-
hash: 7
|
93
87
|
segments:
|
94
88
|
- 1
|
95
89
|
- 4
|
@@ -105,7 +99,6 @@ dependencies:
|
|
105
99
|
requirements:
|
106
100
|
- - ">="
|
107
101
|
- !ruby/object:Gem::Version
|
108
|
-
hash: 13
|
109
102
|
segments:
|
110
103
|
- 1
|
111
104
|
- 6
|
@@ -121,7 +114,6 @@ dependencies:
|
|
121
114
|
requirements:
|
122
115
|
- - ">="
|
123
116
|
- !ruby/object:Gem::Version
|
124
|
-
hash: 31
|
125
117
|
segments:
|
126
118
|
- 1
|
127
119
|
- 3
|
@@ -137,7 +129,6 @@ dependencies:
|
|
137
129
|
requirements:
|
138
130
|
- - ">="
|
139
131
|
- !ruby/object:Gem::Version
|
140
|
-
hash: 17
|
141
132
|
segments:
|
142
133
|
- 0
|
143
134
|
- 3
|
@@ -155,6 +146,7 @@ extensions: []
|
|
155
146
|
extra_rdoc_files: []
|
156
147
|
|
157
148
|
files:
|
149
|
+
- lib/ext/cacert.pem
|
158
150
|
- lib/vaulted_billing/certificate_authorities/entrust.pem
|
159
151
|
- lib/vaulted_billing/certificate_authorities/verisign.pem
|
160
152
|
- lib/vaulted_billing/configuration.rb
|
@@ -185,7 +177,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
177
|
requirements:
|
186
178
|
- - ">="
|
187
179
|
- !ruby/object:Gem::Version
|
188
|
-
hash: 3
|
189
180
|
segments:
|
190
181
|
- 0
|
191
182
|
version: "0"
|
@@ -194,7 +185,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
185
|
requirements:
|
195
186
|
- - ">="
|
196
187
|
- !ruby/object:Gem::Version
|
197
|
-
hash: 23
|
198
188
|
segments:
|
199
189
|
- 1
|
200
190
|
- 3
|