killbill-cybersource 4.0.1 → 4.0.2
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
- data/Gemfile.lock +18 -18
- data/NEWS +5 -0
- data/README.md +2 -0
- data/VERSION +1 -1
- data/lib/cybersource/api.rb +3 -0
- data/lib/cybersource/ext/active_merchant/active_merchant.rb +6 -1
- data/pom.xml +1 -1
- data/spec/cybersource/base_plugin_spec.rb +105 -0
- data/spec/cybersource/remote/integration_spec.rb +10 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b493be89fec342f29d8b2301b33df6d1fb2242f
|
4
|
+
data.tar.gz: af046593004ae23ac977ea4c818df2fc53620e5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f76a9a57ab6780e4bfefc3deb1429a7d86cfba8efb70bc45d0ac058557c36edf0912cdd6a87209dd699ba0bfd4fbcbbfbfaeb46a1ce6a4447aca02bbff59b5a
|
7
|
+
data.tar.gz: fd5086b9920e5cc9b734b094b94952e428b37b19d41f9bc4879fec8f3051ed85812aedd9440a94ca6eec5da944c507275ddd6747a19e17806b55212b9443fdee
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
killbill-cybersource (4.0.
|
4
|
+
killbill-cybersource (4.0.2)
|
5
5
|
actionpack (~> 4.1.0)
|
6
6
|
actionview (~> 4.1.0)
|
7
7
|
activemerchant (~> 1.48.0)
|
@@ -19,13 +19,13 @@ PATH
|
|
19
19
|
GEM
|
20
20
|
remote: https://rubygems.org/
|
21
21
|
specs:
|
22
|
-
actionpack (4.1.
|
23
|
-
actionview (= 4.1.
|
24
|
-
activesupport (= 4.1.
|
22
|
+
actionpack (4.1.15)
|
23
|
+
actionview (= 4.1.15)
|
24
|
+
activesupport (= 4.1.15)
|
25
25
|
rack (~> 1.5.2)
|
26
26
|
rack-test (~> 0.6.2)
|
27
|
-
actionview (4.1.
|
28
|
-
activesupport (= 4.1.
|
27
|
+
actionview (4.1.15)
|
28
|
+
activesupport (= 4.1.15)
|
29
29
|
builder (~> 3.1)
|
30
30
|
erubis (~> 2.7.0)
|
31
31
|
active_utils (3.0.0)
|
@@ -36,17 +36,17 @@ GEM
|
|
36
36
|
builder (>= 2.1.2, < 4.0.0)
|
37
37
|
i18n (>= 0.6.9)
|
38
38
|
nokogiri (~> 1.4)
|
39
|
-
activemodel (4.1.
|
40
|
-
activesupport (= 4.1.
|
39
|
+
activemodel (4.1.15)
|
40
|
+
activesupport (= 4.1.15)
|
41
41
|
builder (~> 3.1)
|
42
|
-
activerecord (4.1.
|
43
|
-
activemodel (= 4.1.
|
44
|
-
activesupport (= 4.1.
|
42
|
+
activerecord (4.1.15)
|
43
|
+
activemodel (= 4.1.15)
|
44
|
+
activesupport (= 4.1.15)
|
45
45
|
arel (~> 5.0.0)
|
46
46
|
activerecord-bogacs (0.4.1)
|
47
|
-
activerecord-jdbc-adapter (1.3.
|
47
|
+
activerecord-jdbc-adapter (1.3.20)
|
48
48
|
activerecord (>= 2.2)
|
49
|
-
activesupport (4.1.
|
49
|
+
activesupport (4.1.15)
|
50
50
|
i18n (~> 0.6, >= 0.6.9)
|
51
51
|
json (~> 1.7, >= 1.7.7)
|
52
52
|
minitest (~> 5.1)
|
@@ -78,21 +78,21 @@ GEM
|
|
78
78
|
ruby-maven (~> 3.3, >= 3.3.3)
|
79
79
|
jdbc-mariadb (1.2.3)
|
80
80
|
jdbc-sqlite3 (3.8.11.2)
|
81
|
-
jruby-openssl (0.9.
|
81
|
+
jruby-openssl (0.9.16-java)
|
82
82
|
json (1.8.3-java)
|
83
|
-
killbill (7.0.
|
83
|
+
killbill (7.0.3)
|
84
84
|
rack (>= 1.5.2)
|
85
85
|
sinatra (~> 1.3.4)
|
86
86
|
typhoeus (~> 0.6.9)
|
87
87
|
tzinfo (~> 1.2.0)
|
88
88
|
maven-tools (1.0.13)
|
89
89
|
virtus (~> 1.0)
|
90
|
-
minitest (5.8.
|
90
|
+
minitest (5.8.4)
|
91
91
|
monetize (1.1.0)
|
92
92
|
money (~> 6.5.0)
|
93
93
|
money (6.5.1)
|
94
94
|
i18n (>= 0.6.4, <= 0.7.0)
|
95
|
-
nokogiri (1.6.7.
|
95
|
+
nokogiri (1.6.7.2-java)
|
96
96
|
offsite_payments (2.1.0)
|
97
97
|
actionpack (>= 3.2.20, < 5.0.0)
|
98
98
|
active_utils (~> 3.0.0)
|
@@ -146,4 +146,4 @@ DEPENDENCIES
|
|
146
146
|
rspec (~> 2.12.0)
|
147
147
|
|
148
148
|
BUNDLED WITH
|
149
|
-
1.
|
149
|
+
1.11.2
|
data/NEWS
CHANGED
data/README.md
CHANGED
@@ -135,6 +135,8 @@ Plugin properties
|
|
135
135
|
| skip_gw | If true, skip the call to CyberSource |
|
136
136
|
| payment_processor_account_id | Config entry name of the merchant account to use |
|
137
137
|
| external_key_as_order_id | If true, set the payment external key as the CyberSource order id |
|
138
|
+
| ignore_avs | If true, ignore the results of AVS checking |
|
139
|
+
| ignore_cvv | If true, ignore the results of CVN checking |
|
138
140
|
| cc_first_name | Credit card holder first name |
|
139
141
|
| cc_last_name | Credit card holder last name |
|
140
142
|
| cc_type | Credit card brand |
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.0.
|
1
|
+
4.0.2
|
data/lib/cybersource/api.rb
CHANGED
@@ -282,6 +282,9 @@ module Killbill #:nodoc:
|
|
282
282
|
end
|
283
283
|
options[:email] = email
|
284
284
|
end
|
285
|
+
|
286
|
+
::Killbill::Plugin::ActiveMerchant::Utils.normalize_property(properties, 'ignore_avs')
|
287
|
+
::Killbill::Plugin::ActiveMerchant::Utils.normalize_property(properties, 'ignore_cvv')
|
285
288
|
end
|
286
289
|
|
287
290
|
def get_report_api(kb_tenant_id)
|
@@ -25,9 +25,14 @@ module ActiveMerchant
|
|
25
25
|
response = parse(raw_response)
|
26
26
|
|
27
27
|
success = response[:decision] == 'ACCEPT'
|
28
|
-
message = @@response_codes[('r' + response[:reasonCode]).to_sym] rescue response[:message]
|
29
28
|
authorization = success ? [options[:order_id], response[:requestID], response[:requestToken]].compact.join(";") : nil
|
30
29
|
|
30
|
+
if response[:faultcode] == 'wsse:FailedCheck'
|
31
|
+
message = { :exception_message => response[:message], :payment_plugin_status => :CANCELED }.to_json
|
32
|
+
else
|
33
|
+
message = @@response_codes[('r' + response[:reasonCode]).to_sym] rescue response[:message]
|
34
|
+
end
|
35
|
+
|
31
36
|
Response.new(success, message, response,
|
32
37
|
:test => test?,
|
33
38
|
:authorization => authorization,
|
data/pom.xml
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
<groupId>org.kill-bill.billing.plugin.ruby</groupId>
|
26
26
|
<artifactId>cybersource-plugin</artifactId>
|
27
27
|
<packaging>pom</packaging>
|
28
|
-
<version>4.0.
|
28
|
+
<version>4.0.2</version>
|
29
29
|
<name>cybersource-plugin</name>
|
30
30
|
<url>http://github.com/killbill/killbill-cybersource-plugin</url>
|
31
31
|
<description>Plugin for accessing Cybersource as a payment gateway</description>
|
@@ -46,6 +46,66 @@ describe Killbill::Cybersource::PaymentPlugin do
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
context 'Business Rules' do
|
50
|
+
|
51
|
+
it 'does not ignore AVS nor CVN' do
|
52
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post) do |host, request_body|
|
53
|
+
request_body.should_not match('<ignoreAVSResult>')
|
54
|
+
request_body.should_not match('<ignoreCVResult>')
|
55
|
+
successful_purchase_response
|
56
|
+
end
|
57
|
+
purchase
|
58
|
+
purchase(:PROCESSED, [build_property('ignore_avs', 'false'), build_property('ignore_cvv', 'false')])
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'ignores AVS and CVN' do
|
62
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post) do |host, request_body|
|
63
|
+
request_body.should match('<ignoreAVSResult>')
|
64
|
+
request_body.should match('<ignoreCVResult>')
|
65
|
+
successful_purchase_response
|
66
|
+
end
|
67
|
+
purchase(:PROCESSED, [build_property('ignore_avs', 'true'), build_property('ignore_cvv', 'true')])
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'ignores AVS but not CVN' do
|
71
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post) do |host, request_body|
|
72
|
+
request_body.should match('<ignoreAVSResult>')
|
73
|
+
request_body.should_not match('<ignoreCVResult>')
|
74
|
+
successful_purchase_response
|
75
|
+
end
|
76
|
+
purchase(:PROCESSED, [build_property('ignore_avs', 'true')])
|
77
|
+
purchase(:PROCESSED, [build_property('ignore_avs', 'true'), build_property('ignore_cvv', 'false')])
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'ignores CVN but not AVS' do
|
81
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post) do |host, request_body|
|
82
|
+
request_body.should_not match('<ignoreAVSResult>')
|
83
|
+
request_body.should match('<ignoreCVResult>')
|
84
|
+
successful_purchase_response
|
85
|
+
end
|
86
|
+
purchase(:PROCESSED, [build_property('ignore_cvv', 'true')])
|
87
|
+
purchase(:PROCESSED, [build_property('ignore_avs', 'false'), build_property('ignore_cvv', 'true')])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'Errors handling' do
|
92
|
+
|
93
|
+
it 'handles expired passwords as CANCELED transactions' do
|
94
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post).and_return(password_expired_response)
|
95
|
+
purchase(:CANCELED).gateway_error.should == 'wsse:FailedCheck: Security Data : Merchant password has expired.'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'handles bad passwords as CANCELED transactions' do
|
99
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post).and_return(bad_password_response)
|
100
|
+
purchase(:CANCELED).gateway_error.should == 'wsse:FailedCheck: Security Data : UsernameToken authentication failed.'
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'handles unsuccessful authorizations as ERROR transactions' do
|
104
|
+
::ActiveMerchant::Billing::CyberSourceGateway.any_instance.stub(:ssl_post).and_return(unsuccessful_authorization_response)
|
105
|
+
purchase(:ERROR).gateway_error.should == 'Invalid account number'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
49
109
|
private
|
50
110
|
|
51
111
|
def with_transaction(kb_payment_id, transaction_type, created_at, context)
|
@@ -64,4 +124,49 @@ describe Killbill::Cybersource::PaymentPlugin do
|
|
64
124
|
ensure
|
65
125
|
t.destroy! unless t.nil?
|
66
126
|
end
|
127
|
+
|
128
|
+
def purchase(expected_status = :PROCESSED, properties = [])
|
129
|
+
kb_payment_id = SecureRandom.uuid
|
130
|
+
kb_payment = @plugin.kb_apis.proxied_services[:payment_api].add_payment(kb_payment_id)
|
131
|
+
kb_transaction_id = kb_payment.transactions[0].id
|
132
|
+
|
133
|
+
properties << build_property('email', 'foo@bar.com')
|
134
|
+
properties << build_property('token', '1234')
|
135
|
+
|
136
|
+
payment_response = @plugin.purchase_payment(SecureRandom.uuid, kb_payment_id, kb_transaction_id, SecureRandom.uuid, BigDecimal.new('100'), 'USD', properties, build_call_context)
|
137
|
+
payment_response.status.should eq(expected_status), payment_response.gateway_error
|
138
|
+
payment_response
|
139
|
+
end
|
140
|
+
|
141
|
+
def successful_purchase_response
|
142
|
+
<<-XML
|
143
|
+
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
144
|
+
<soap:Header>
|
145
|
+
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-2636690"><wsu:Created>2008-01-15T21:42:03.343Z</wsu:Created></wsu:Timestamp></wsse:Security></soap:Header><soap:Body><c:replyMessage xmlns:c="urn:schemas-cybersource-com:transaction-data-1.26"><c:merchantReferenceCode>b0a6cf9aa07f1a8495f89c364bbd6a9a</c:merchantReferenceCode><c:requestID>2004333231260008401927</c:requestID><c:decision>ACCEPT</c:decision><c:reasonCode>100</c:reasonCode><c:requestToken>Afvvj7Ke2Fmsbq0wHFE2sM6R4GAptYZ0jwPSA+R9PhkyhFTb0KRjoE4+ynthZrG6tMBwjAtT</c:requestToken><c:purchaseTotals><c:currency>USD</c:currency></c:purchaseTotals><c:ccAuthReply><c:reasonCode>100</c:reasonCode><c:amount>1.00</c:amount><c:authorizationCode>123456</c:authorizationCode><c:avsCode>Y</c:avsCode><c:avsCodeRaw>Y</c:avsCodeRaw><c:cvCode>M</c:cvCode><c:cvCodeRaw>M</c:cvCodeRaw><c:authorizedDateTime>2008-01-15T21:42:03Z</c:authorizedDateTime><c:processorResponse>00</c:processorResponse><c:authFactorCode>U</c:authFactorCode></c:ccAuthReply></c:replyMessage></soap:Body></soap:Envelope>
|
146
|
+
XML
|
147
|
+
end
|
148
|
+
|
149
|
+
def password_expired_response
|
150
|
+
<<-XML
|
151
|
+
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
152
|
+
<soap:Header>
|
153
|
+
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-2636690"><wsu:Created>2008-01-15T21:42:03.343Z</wsu:Created></wsu:Timestamp></wsse:Security></soap:Header><soap:Body><soap:Fault xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:c="urn:schemas-cybersource-com:transaction-data-1.0"><faultcode>wsse:FailedCheck</faultcode><faultstring>Security Data : Merchant password has expired.</faultstring></soap:Fault></soap:Body></soap:Envelope>
|
154
|
+
XML
|
155
|
+
end
|
156
|
+
|
157
|
+
def bad_password_response
|
158
|
+
<<-XML
|
159
|
+
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
160
|
+
<soap:Header>
|
161
|
+
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-2636690"><wsu:Created>2008-01-15T21:42:03.343Z</wsu:Created></wsu:Timestamp></wsse:Security></soap:Header><soap:Body><soap:Fault xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:c="urn:schemas-cybersource-com:transaction-data-1.0"><faultcode>wsse:FailedCheck</faultcode><faultstring>Security Data : UsernameToken authentication failed.</faultstring></soap:Fault></soap:Body></soap:Envelope>
|
162
|
+
XML
|
163
|
+
end
|
164
|
+
|
165
|
+
def unsuccessful_authorization_response
|
166
|
+
<<-XML
|
167
|
+
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
168
|
+
<soap:Header>
|
169
|
+
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-28121162"><wsu:Created>2008-01-15T21:50:41.580Z</wsu:Created></wsu:Timestamp></wsse:Security></soap:Header><soap:Body><c:replyMessage xmlns:c="urn:schemas-cybersource-com:transaction-data-1.26"><c:merchantReferenceCode>a1efca956703a2a5037178a8a28f7357</c:merchantReferenceCode><c:requestID>2004338415330008402434</c:requestID><c:decision>REJECT</c:decision><c:reasonCode>231</c:reasonCode><c:requestToken>Afvvj7KfIgU12gooCFE2/DanQIApt+G1OgTSA+R9PTnyhFTb0KRjgFY+ynyIFNdoKKAghwgx</c:requestToken><c:ccAuthReply><c:reasonCode>231</c:reasonCode></c:ccAuthReply></c:replyMessage></soap:Body></soap:Envelope>
|
170
|
+
XML
|
171
|
+
end
|
67
172
|
end
|
@@ -214,6 +214,16 @@ describe Killbill::Cybersource::PaymentPlugin do
|
|
214
214
|
payment_response = @plugin.void_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[2].id, @pm.kb_payment_method_id, @properties, @call_context)
|
215
215
|
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
216
216
|
payment_response.transaction_type.should == :VOID
|
217
|
+
Killbill::Cybersource::CybersourceResponse.last.params_amount.should == '10.00'
|
218
|
+
|
219
|
+
# From the CyberSource documentation:
|
220
|
+
# When you void a capture, a hold remains on the unused credit card funds. If you are not going to re-capture the authorization as described in "Capture After Void," page 71, and if
|
221
|
+
# your processor supports authorization reversal after void as described in "Authorization Reversal After Void," page 39, CyberSource recommends that you request an authorization reversal
|
222
|
+
# to release the hold on the unused credit card funds.
|
223
|
+
payment_response = @plugin.void_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[3].id, @pm.kb_payment_method_id, @properties, @call_context)
|
224
|
+
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
225
|
+
payment_response.transaction_type.should == :VOID
|
226
|
+
Killbill::Cybersource::CybersourceResponse.last.params_amount.should == '100.00'
|
217
227
|
end
|
218
228
|
|
219
229
|
it 'should be able to credit' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: killbill-cybersource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kill Bill core team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: killbill
|