activemerchant 1.42.8 → 1.42.9
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG +8 -0
- data/lib/active_merchant/billing/gateways/pac_net_raven.rb +31 -4
- data/lib/active_merchant/billing/gateways/pin.rb +1 -1
- data/lib/active_merchant/billing/gateways/sage.rb +24 -1
- data/lib/active_merchant/billing/gateways/sage/sage_vault.rb +149 -0
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +9 -6
- data/lib/active_merchant/version.rb +1 -1
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: baa3b2ef41f3fd7b7ee93ae111090938ffee872a
|
4
|
+
data.tar.gz: 3104e5e77e0895fc86563e6ada9381b37d827f05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5eb2c499dad2b3d33e7c820ce3c2afa77ea7376e19a84a348e4577d7ec10f7b8bbc8c8c6facf881ed65ea32de8762b3a1638ad7e5e7d4019545455364c36e323
|
7
|
+
data.tar.gz: 97f099bce96fa830eccc9be8d2b2a5934a01e58c4dcb94811827fff49321f48506f1e326f9d7797570af726298664d688241cfaf59e7627627727f1eff497455
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
= ActiveMerchant CHANGELOG
|
2
2
|
|
3
|
+
== Version 1.42.9 (April 15, 2014)
|
4
|
+
|
5
|
+
* Spreedly: Add ip, description and gateway_specific_fields [faizalzakaria]
|
6
|
+
* Sage (US): Support store/unstore of cards. [rwdaigle]
|
7
|
+
* Pin: Add american express to supported cards [nagash]
|
8
|
+
* Raven: Update handling of CVV/AVS [bslobodin]
|
9
|
+
* Raven: Use UUID for RequestID [bslobodin]
|
10
|
+
|
3
11
|
== Version 1.42.8 (April 4, 2014)
|
4
12
|
|
5
13
|
* Cecabank: Handle invalid xml response body [duff]
|
@@ -1,11 +1,35 @@
|
|
1
1
|
module ActiveMerchant #:nodoc:
|
2
2
|
module Billing #:nodoc:
|
3
3
|
class PacNetRavenGateway < Gateway
|
4
|
+
|
5
|
+
AVS_ADDRESS_CODES = {
|
6
|
+
'avs_address_unavailable' => 'X',
|
7
|
+
'avs_address_not_checked' => 'X',
|
8
|
+
'avs_address_matched' => 'Y',
|
9
|
+
'avs_address_not_matched' => 'N',
|
10
|
+
'avs_address_partial_match' => 'N'
|
11
|
+
}
|
12
|
+
|
13
|
+
AVS_POSTAL_CODES = {
|
14
|
+
'avs_postal_unavailable' => 'X',
|
15
|
+
'avs_postal_not_checked' => 'X',
|
16
|
+
'avs_postal_matched' => 'Y',
|
17
|
+
'avs_postal_not_matched' => 'N',
|
18
|
+
'avs_postal_partial_match' => 'N'
|
19
|
+
}
|
20
|
+
|
21
|
+
CVV2_CODES = {
|
22
|
+
'cvv2_matched' => 'Y',
|
23
|
+
'cvv2_not_matched' => 'N',
|
24
|
+
'cvv2_unavailable' => 'X',
|
25
|
+
'cvv2_not_checked' => 'X'
|
26
|
+
}
|
27
|
+
|
4
28
|
self.test_url = 'https://demo.deepcovelabs.com/realtime/'
|
5
29
|
self.live_url = 'https://raven.pacnetservices.com/realtime/'
|
6
30
|
|
7
31
|
self.supported_countries = ['US']
|
8
|
-
self.supported_cardtypes = [:visa, :master
|
32
|
+
self.supported_cardtypes = [:visa, :master]
|
9
33
|
self.money_format = :cents
|
10
34
|
self.default_currency = 'USD'
|
11
35
|
self.homepage_url = 'http://www.pacnetservices.com/'
|
@@ -102,8 +126,11 @@ module ActiveMerchant #:nodoc:
|
|
102
126
|
:test => test_mode,
|
103
127
|
:authorization => response['TrackingNumber'],
|
104
128
|
:fraud_review => fraud_review?(response),
|
105
|
-
:avs_result => {
|
106
|
-
|
129
|
+
:avs_result => {
|
130
|
+
:postal_match => AVS_POSTAL_CODES[response['AVSPostalResponseCode']],
|
131
|
+
:street_match => AVS_ADDRESS_CODES[response['AVSAddressResponseCode']]
|
132
|
+
},
|
133
|
+
:cvv_result => CVV2_CODES[response['CVV2ResponseCode']]
|
107
134
|
)
|
108
135
|
end
|
109
136
|
|
@@ -161,7 +188,7 @@ module ActiveMerchant #:nodoc:
|
|
161
188
|
end
|
162
189
|
|
163
190
|
def request_id
|
164
|
-
|
191
|
+
SecureRandom.uuid
|
165
192
|
end
|
166
193
|
|
167
194
|
def signature(action, post, parameters = {})
|
@@ -7,7 +7,7 @@ module ActiveMerchant #:nodoc:
|
|
7
7
|
self.default_currency = 'AUD'
|
8
8
|
self.money_format = :cents
|
9
9
|
self.supported_countries = ['AU']
|
10
|
-
self.supported_cardtypes = [:visa, :master]
|
10
|
+
self.supported_cardtypes = [:visa, :master, :american_express]
|
11
11
|
self.homepage_url = 'http://www.pin.net.au/'
|
12
12
|
self.display_name = 'Pin'
|
13
13
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/sage/sage_bankcard'
|
2
2
|
require File.dirname(__FILE__) + '/sage/sage_virtual_check'
|
3
|
+
require File.dirname(__FILE__) + '/sage/sage_vault'
|
3
4
|
|
4
5
|
module ActiveMerchant #:nodoc:
|
5
6
|
module Billing #:nodoc:
|
@@ -138,7 +139,26 @@ module ActiveMerchant #:nodoc:
|
|
138
139
|
end
|
139
140
|
end
|
140
141
|
|
142
|
+
# Stores a credit card in the Sage vault.
|
143
|
+
#
|
144
|
+
# ==== Parameters
|
145
|
+
#
|
146
|
+
# * <tt>credit_card</tt> - The CreditCard object to be stored.
|
147
|
+
def store(credit_card, options = {})
|
148
|
+
vault.store(credit_card, options)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Deletes a stored card from the Sage vault.
|
152
|
+
#
|
153
|
+
# ==== Parameters
|
154
|
+
#
|
155
|
+
# * <tt>identification</tt> - The 'GUID' identifying the stored card.
|
156
|
+
def unstore(identification, options = {})
|
157
|
+
vault.unstore(identification, options)
|
158
|
+
end
|
159
|
+
|
141
160
|
private
|
161
|
+
|
142
162
|
def bankcard
|
143
163
|
@bankcard ||= SageBankcardGateway.new(@options)
|
144
164
|
end
|
@@ -146,7 +166,10 @@ module ActiveMerchant #:nodoc:
|
|
146
166
|
def virtual_check
|
147
167
|
@virtual_check ||= SageVirtualCheckGateway.new(@options)
|
148
168
|
end
|
169
|
+
|
170
|
+
def vault
|
171
|
+
@vault ||= SageVaultGateway.new(@options)
|
172
|
+
end
|
149
173
|
end
|
150
174
|
end
|
151
175
|
end
|
152
|
-
|
@@ -0,0 +1,149 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
class SageVaultGateway < Gateway #:nodoc:
|
4
|
+
self.live_url = 'https://www.sagepayments.net/web_services/wsVault/wsVault.asmx'
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
requires!(options, :login, :password)
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def store(credit_card, options = {})
|
12
|
+
request = build_store_request(credit_card, options)
|
13
|
+
commit(:store, request)
|
14
|
+
end
|
15
|
+
|
16
|
+
def unstore(identification, options = {})
|
17
|
+
request = build_unstore_request(identification, options)
|
18
|
+
commit(:unstore, request)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# A valid request example, since the Sage docs have none:
|
24
|
+
#
|
25
|
+
# <?xml version="1.0" encoding="UTF-8" ?>
|
26
|
+
# <SOAP-ENV:Envelope
|
27
|
+
# xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
|
28
|
+
# xmlns:ns1="https://www.sagepayments.net/web_services/wsVault/wsVault">
|
29
|
+
# <SOAP-ENV:Body>
|
30
|
+
# <ns1:INSERT_CREDIT_CARD_DATA>
|
31
|
+
# <ns1:M_ID>279277516172</ns1:M_ID>
|
32
|
+
# <ns1:M_KEY>O3I8G2H8V6A3</ns1:M_KEY>
|
33
|
+
# <ns1:CARDNUMBER>4111111111111111</ns1:CARDNUMBER>
|
34
|
+
# <ns1:EXPIRATION_DATE>0915</ns1:EXPIRATION_DATE>
|
35
|
+
# </ns1:INSERT_CREDIT_CARD_DATA>
|
36
|
+
# </SOAP-ENV:Body>
|
37
|
+
# </SOAP-ENV:Envelope>
|
38
|
+
def build_store_request(credit_card, options)
|
39
|
+
xml = Builder::XmlMarkup.new
|
40
|
+
add_credit_card(xml, credit_card, options)
|
41
|
+
xml.target!
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_unstore_request(identification, options)
|
45
|
+
xml = Builder::XmlMarkup.new
|
46
|
+
add_identification(xml, identification, options)
|
47
|
+
xml.target!
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_customer_data(xml)
|
51
|
+
xml.tag! 'ns1:M_ID', @options[:login]
|
52
|
+
xml.tag! 'ns1:M_KEY', @options[:password]
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_credit_card(xml, credit_card, options)
|
56
|
+
xml.tag! 'ns1:CARDNUMBER', credit_card.number
|
57
|
+
xml.tag! 'ns1:EXPIRATION_DATE', exp_date(credit_card)
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_identification(xml, identification, options)
|
61
|
+
xml.tag! 'ns1:GUID', identification
|
62
|
+
end
|
63
|
+
|
64
|
+
def exp_date(credit_card)
|
65
|
+
year = sprintf("%.4i", credit_card.year)
|
66
|
+
month = sprintf("%.2i", credit_card.month)
|
67
|
+
|
68
|
+
"#{month}#{year[-2..-1]}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def commit(action, request)
|
72
|
+
response = parse(ssl_post(live_url,
|
73
|
+
build_soap_request(action, request),
|
74
|
+
build_headers(action))
|
75
|
+
)
|
76
|
+
|
77
|
+
case action
|
78
|
+
when :store
|
79
|
+
success = response[:success] == 'true'
|
80
|
+
message = response[:message].downcase.capitalize if response[:message]
|
81
|
+
when :unstore
|
82
|
+
success = response[:delete_data_result] == 'true'
|
83
|
+
message = success ? 'Succeeded' : 'Failed'
|
84
|
+
end
|
85
|
+
|
86
|
+
Response.new(success, message, response,
|
87
|
+
authorization: response[:guid]
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
ENVELOPE_NAMESPACES = {
|
92
|
+
'xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/",
|
93
|
+
'xmlns:ns1' => "https://www.sagepayments.net/web_services/wsVault/wsVault"
|
94
|
+
}
|
95
|
+
|
96
|
+
ACTION_ELEMENTS = {
|
97
|
+
store: 'INSERT_CREDIT_CARD_DATA',
|
98
|
+
unstore: 'DELETE_DATA'
|
99
|
+
}
|
100
|
+
|
101
|
+
def build_soap_request(action, body)
|
102
|
+
xml = Builder::XmlMarkup.new
|
103
|
+
|
104
|
+
xml.instruct!
|
105
|
+
xml.tag! 'SOAP-ENV:Envelope', ENVELOPE_NAMESPACES do
|
106
|
+
xml.tag! 'SOAP-ENV:Body' do
|
107
|
+
xml.tag! "ns1:#{ACTION_ELEMENTS[action]}" do
|
108
|
+
add_customer_data(xml)
|
109
|
+
xml << body
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
xml.target!
|
114
|
+
end
|
115
|
+
|
116
|
+
SOAP_ACTIONS = {
|
117
|
+
store: 'https://www.sagepayments.net/web_services/wsVault/wsVault/INSERT_CREDIT_CARD_DATA',
|
118
|
+
unstore: 'https://www.sagepayments.net/web_services/wsVault/wsVault/DELETE_DATA'
|
119
|
+
}
|
120
|
+
|
121
|
+
def build_headers(action)
|
122
|
+
{
|
123
|
+
"SOAPAction" => SOAP_ACTIONS[action],
|
124
|
+
"Content-Type" => "text/xml; charset=utf-8"
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
128
|
+
def parse(body)
|
129
|
+
response = {}
|
130
|
+
hashify_xml!(body, response)
|
131
|
+
response
|
132
|
+
end
|
133
|
+
|
134
|
+
def hashify_xml!(xml, response)
|
135
|
+
xml = REXML::Document.new(xml)
|
136
|
+
|
137
|
+
# Store
|
138
|
+
xml.elements.each("//Table1/*") do |node|
|
139
|
+
response[node.name.underscore.to_sym] = node.text
|
140
|
+
end
|
141
|
+
|
142
|
+
# Unstore
|
143
|
+
xml.elements.each("//DELETE_DATAResponse/*") do |node|
|
144
|
+
response[node.name.underscore.to_sym] = node.text
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -110,7 +110,7 @@ module ActiveMerchant #:nodoc:
|
|
110
110
|
def save_card(retain, credit_card, options)
|
111
111
|
request = build_xml_request('payment_method') do |doc|
|
112
112
|
add_credit_card(doc, credit_card, options)
|
113
|
-
|
113
|
+
add_extra_options(:data, doc, options)
|
114
114
|
doc.retained(true) if retain
|
115
115
|
end
|
116
116
|
|
@@ -130,6 +130,8 @@ module ActiveMerchant #:nodoc:
|
|
130
130
|
def auth_purchase_request(money, payment_method_token, options)
|
131
131
|
build_xml_request('transaction') do |doc|
|
132
132
|
add_invoice(doc, money, options)
|
133
|
+
doc.ip(options[:ip])
|
134
|
+
add_extra_options(:gateway_specific_fields, doc, options)
|
133
135
|
doc.payment_method_token(payment_method_token)
|
134
136
|
doc.retain_on_success(true) if options[:store]
|
135
137
|
end
|
@@ -139,6 +141,7 @@ module ActiveMerchant #:nodoc:
|
|
139
141
|
doc.amount amount(money)
|
140
142
|
doc.currency_code(options[:currency] || currency(money) || default_currency)
|
141
143
|
doc.order_id(options[:order_id])
|
144
|
+
doc.description(options[:description])
|
142
145
|
end
|
143
146
|
|
144
147
|
def add_credit_card(doc, credit_card, options)
|
@@ -159,17 +162,17 @@ module ActiveMerchant #:nodoc:
|
|
159
162
|
end
|
160
163
|
end
|
161
164
|
|
162
|
-
def
|
163
|
-
doc.
|
164
|
-
|
165
|
+
def add_extra_options(type, doc, options)
|
166
|
+
doc.send(type) do
|
167
|
+
extra_options_to_doc(doc, options[type])
|
165
168
|
end
|
166
169
|
end
|
167
170
|
|
168
|
-
def
|
171
|
+
def extra_options_to_doc(doc, value)
|
169
172
|
return doc.text value unless value.kind_of? Hash
|
170
173
|
value.each do |k, v|
|
171
174
|
doc.send(k) do
|
172
|
-
|
175
|
+
extra_options_to_doc(doc, v)
|
173
176
|
end
|
174
177
|
end
|
175
178
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activemerchant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.42.
|
4
|
+
version: 1.42.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Luetke
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
ZJB9YPQZG+vWBdDSca3sUMtvFxpLUFwdKF5APSPOVnhbFJ3vSXY1ulP/R6XW9vnw
|
31
31
|
6kkQi2fHhU20ugMzp881Eixr+TjC0RvUerLG7g==
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2014-04-
|
33
|
+
date: 2014-04-15 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: activesupport
|
@@ -350,6 +350,7 @@ files:
|
|
350
350
|
- lib/active_merchant/billing/gateways/sage.rb
|
351
351
|
- lib/active_merchant/billing/gateways/sage/sage_bankcard.rb
|
352
352
|
- lib/active_merchant/billing/gateways/sage/sage_core.rb
|
353
|
+
- lib/active_merchant/billing/gateways/sage/sage_vault.rb
|
353
354
|
- lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb
|
354
355
|
- lib/active_merchant/billing/gateways/sage_pay.rb
|
355
356
|
- lib/active_merchant/billing/gateways/sallie_mae.rb
|
metadata.gz.sig
CHANGED
Binary file
|