killbill-litle 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Jarfile +4 -2
- data/NEWS +2 -0
- data/VERSION +1 -1
- data/killbill-litle.gemspec +1 -1
- data/lib/litle/api.rb +33 -33
- data/lib/litle/config/configuration.rb +1 -1
- data/lib/litle/models/litle_payment_method.rb +34 -18
- data/lib/litle/models/litle_response.rb +46 -31
- data/lib/litle/private_api.rb +3 -4
- data/pom.xml +1 -1
- data/spec/litle/base_plugin_spec.rb +16 -7
- data/spec/litle/integration_spec.rb +77 -53
- metadata +5 -4
data/Jarfile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
-
jar 'com.ning.billing:killbill-api', '0.
|
2
|
-
jar 'com.ning.billing:killbill-
|
1
|
+
jar 'com.ning.billing:killbill-api', '0.3.0'
|
2
|
+
jar 'com.ning.billing.plugin:killbill-plugin-api-notification', '0.2.4'
|
3
|
+
jar 'com.ning.billing.plugin:killbill-plugin-api-payment', '0.2.4'
|
4
|
+
jar 'com.ning.billing:killbill-util:tests', '0.2.6-SNAPSHOT'
|
3
5
|
jar 'javax.servlet:javax.servlet-api', '3.0.1'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
data/killbill-litle.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
|
23
23
|
s.rdoc_options << '--exclude' << '.'
|
24
24
|
|
25
|
-
s.add_dependency 'killbill', '~> 1.
|
25
|
+
s.add_dependency 'killbill', '~> 1.1.2'
|
26
26
|
s.add_dependency 'activemerchant', '~> 2.0.0'
|
27
27
|
s.add_dependency 'activerecord', '~> 3.2.1'
|
28
28
|
s.add_dependency 'sinatra', '~> 1.3.4'
|
data/lib/litle/api.rb
CHANGED
@@ -13,15 +13,15 @@ module Killbill::Litle
|
|
13
13
|
ActiveRecord::Base.connection.close
|
14
14
|
end
|
15
15
|
|
16
|
-
def process_payment(kb_account_id, kb_payment_id, kb_payment_method_id, amount_in_cents, currency, call_context, options = {})
|
16
|
+
def process_payment(kb_account_id, kb_payment_id, kb_payment_method_id, amount_in_cents, currency, call_context = nil, options = {})
|
17
17
|
# If the payment was already made, just return the status
|
18
18
|
# TODO Should we set the Litle Id field to check for dups (https://www.litle.com/mc-secure/DupeChecking_V1.2.pdf)?
|
19
|
-
litle_transaction = LitleTransaction.from_kb_payment_id(kb_payment_id
|
19
|
+
litle_transaction = LitleTransaction.from_kb_payment_id(kb_payment_id) rescue nil
|
20
20
|
return litle_transaction.litle_response.to_payment_response unless litle_transaction.nil?
|
21
21
|
|
22
22
|
# Required argument
|
23
23
|
# Note! The field is limited to 25 chars, so we convert the UUID (in hex) to base64
|
24
|
-
options[:order_id] ||= Utils.compact_uuid kb_payment_id
|
24
|
+
options[:order_id] ||= Utils.compact_uuid kb_payment_id
|
25
25
|
|
26
26
|
# Set a default report group
|
27
27
|
options[:merchant] ||= report_group_for_currency(currency)
|
@@ -36,17 +36,17 @@ module Killbill::Litle
|
|
36
36
|
response.to_payment_response
|
37
37
|
end
|
38
38
|
|
39
|
-
def get_payment_info(kb_account_id, kb_payment_id, tenant_context, options = {})
|
39
|
+
def get_payment_info(kb_account_id, kb_payment_id, tenant_context = nil, options = {})
|
40
40
|
# We assume the payment is immutable in Litle and only look at our tables since there
|
41
41
|
# doesn't seem to be a Litle API to fetch details for a given transaction.
|
42
42
|
# TODO How can we support Authorization/Sale Recycling?
|
43
|
-
litle_transaction = LitleTransaction.from_kb_payment_id(kb_payment_id
|
43
|
+
litle_transaction = LitleTransaction.from_kb_payment_id(kb_payment_id)
|
44
44
|
|
45
45
|
litle_transaction.litle_response.to_payment_response
|
46
46
|
end
|
47
47
|
|
48
|
-
def process_refund(kb_account_id, kb_payment_id, amount_in_cents, currency, call_context, options = {})
|
49
|
-
litle_transaction = LitleTransaction.find_candidate_transaction_for_refund(kb_payment_id
|
48
|
+
def process_refund(kb_account_id, kb_payment_id, amount_in_cents, currency, call_context = nil, options = {})
|
49
|
+
litle_transaction = LitleTransaction.find_candidate_transaction_for_refund(kb_payment_id, amount_in_cents)
|
50
50
|
|
51
51
|
# Set a default report group
|
52
52
|
options[:merchant] ||= report_group_for_currency(currency)
|
@@ -59,15 +59,15 @@ module Killbill::Litle
|
|
59
59
|
response.to_refund_response
|
60
60
|
end
|
61
61
|
|
62
|
-
def get_refund_info(kb_account_id, kb_payment_id, tenant_context, options = {})
|
62
|
+
def get_refund_info(kb_account_id, kb_payment_id, tenant_context = nil, options = {})
|
63
63
|
# We assume the refund is immutable in Litle and only look at our tables since there
|
64
64
|
# doesn't seem to be a Litle API to fetch details for a given transaction.
|
65
|
-
litle_transaction = LitleTransaction.refund_from_kb_payment_id(kb_payment_id
|
65
|
+
litle_transaction = LitleTransaction.refund_from_kb_payment_id(kb_payment_id)
|
66
66
|
|
67
67
|
litle_transaction.litle_response.to_refund_response
|
68
68
|
end
|
69
69
|
|
70
|
-
def add_payment_method(kb_account_id, kb_payment_method_id, payment_method_props, set_default, call_context, options = {})
|
70
|
+
def add_payment_method(kb_account_id, kb_payment_method_id, payment_method_props, set_default, call_context = nil, options = {})
|
71
71
|
# Set a default report group
|
72
72
|
options[:merchant] ||= report_group_for_account(kb_account_id)
|
73
73
|
|
@@ -80,8 +80,8 @@ module Killbill::Litle
|
|
80
80
|
response = save_response_and_transaction litle_response, :add_payment_method
|
81
81
|
|
82
82
|
if response.success
|
83
|
-
LitlePaymentMethod.create :kb_account_id => kb_account_id
|
84
|
-
:kb_payment_method_id => kb_payment_method_id
|
83
|
+
LitlePaymentMethod.create :kb_account_id => kb_account_id,
|
84
|
+
:kb_payment_method_id => kb_payment_method_id,
|
85
85
|
:litle_token => response.litle_token,
|
86
86
|
:cc_first_name => find_value_from_payment_method_props(payment_method_props, 'ccFirstName'),
|
87
87
|
:cc_last_name => find_value_from_payment_method_props(payment_method_props, 'ccLastName'),
|
@@ -100,26 +100,26 @@ module Killbill::Litle
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
-
def delete_payment_method(kb_account_id, kb_payment_method_id, call_context, options = {})
|
104
|
-
LitlePaymentMethod.mark_as_deleted! kb_payment_method_id
|
103
|
+
def delete_payment_method(kb_account_id, kb_payment_method_id, call_context = nil, options = {})
|
104
|
+
LitlePaymentMethod.mark_as_deleted! kb_payment_method_id
|
105
105
|
end
|
106
106
|
|
107
|
-
def get_payment_method_detail(kb_account_id, kb_payment_method_id, tenant_context, options = {})
|
108
|
-
LitlePaymentMethod.from_kb_payment_method_id(kb_payment_method_id
|
107
|
+
def get_payment_method_detail(kb_account_id, kb_payment_method_id, tenant_context = nil, options = {})
|
108
|
+
LitlePaymentMethod.from_kb_payment_method_id(kb_payment_method_id).to_payment_method_response
|
109
109
|
end
|
110
110
|
|
111
|
-
def set_default_payment_method(kb_account_id, kb_payment_method_id, call_context, options = {})
|
111
|
+
def set_default_payment_method(kb_account_id, kb_payment_method_id, call_context = nil, options = {})
|
112
112
|
# No-op
|
113
113
|
end
|
114
114
|
|
115
|
-
def get_payment_methods(kb_account_id, refresh_from_gateway, call_context, options = {})
|
116
|
-
LitlePaymentMethod.from_kb_account_id(kb_account_id
|
115
|
+
def get_payment_methods(kb_account_id, refresh_from_gateway = false, call_context = nil, options = {})
|
116
|
+
LitlePaymentMethod.from_kb_account_id(kb_account_id).collect { |pm| pm.to_payment_method_info_response }
|
117
117
|
end
|
118
118
|
|
119
119
|
def reset_payment_methods(kb_account_id, payment_methods)
|
120
120
|
return if payment_methods.nil?
|
121
121
|
|
122
|
-
litle_pms = LitlePaymentMethod.from_kb_account_id(kb_account_id
|
122
|
+
litle_pms = LitlePaymentMethod.from_kb_account_id(kb_account_id)
|
123
123
|
|
124
124
|
payment_methods.delete_if do |payment_method_info_plugin|
|
125
125
|
should_be_deleted = false
|
@@ -127,16 +127,16 @@ module Killbill::Litle
|
|
127
127
|
# Do litle_pm and payment_method_info_plugin represent the same Litle payment method?
|
128
128
|
if litle_pm.external_payment_method_id == payment_method_info_plugin.external_payment_method_id
|
129
129
|
# Do we already have a kb_payment_method_id?
|
130
|
-
if litle_pm.kb_payment_method_id == payment_method_info_plugin.payment_method_id
|
130
|
+
if litle_pm.kb_payment_method_id == payment_method_info_plugin.payment_method_id
|
131
131
|
should_be_deleted = true
|
132
132
|
break
|
133
133
|
elsif litle_pm.kb_payment_method_id.nil?
|
134
134
|
# We didn't have the kb_payment_method_id - update it
|
135
|
-
litle_pm.kb_payment_method_id = payment_method_info_plugin.payment_method_id
|
135
|
+
litle_pm.kb_payment_method_id = payment_method_info_plugin.payment_method_id
|
136
136
|
should_be_deleted = litle_pm.save
|
137
137
|
break
|
138
|
-
|
139
|
-
|
138
|
+
# Otherwise the same token points to 2 different kb_payment_method_id. This should never happen,
|
139
|
+
# but we cowardly will insert a second row below
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
@@ -146,8 +146,8 @@ module Killbill::Litle
|
|
146
146
|
|
147
147
|
# The remaining elements in payment_methods are not in our table (this should never happen?!)
|
148
148
|
payment_methods.each do |payment_method_info_plugin|
|
149
|
-
LitlePaymentMethod.create :kb_account_id => payment_method_info_plugin.account_id
|
150
|
-
:kb_payment_method_id => payment_method_info_plugin.payment_method_id
|
149
|
+
LitlePaymentMethod.create :kb_account_id => payment_method_info_plugin.account_id,
|
150
|
+
:kb_payment_method_id => payment_method_info_plugin.payment_method_id,
|
151
151
|
:litle_token => payment_method_info_plugin.external_payment_method_id
|
152
152
|
end
|
153
153
|
end
|
@@ -162,35 +162,35 @@ module Killbill::Litle
|
|
162
162
|
def report_group_for_account(kb_account_id)
|
163
163
|
currency = account_currency(kb_account_id)
|
164
164
|
report_group_for_currency(currency)
|
165
|
-
rescue
|
166
|
-
|
165
|
+
rescue => e
|
166
|
+
'Default Report Group'
|
167
167
|
end
|
168
168
|
|
169
169
|
def account_currency(kb_account_id)
|
170
|
-
account = @kb_apis.get_account_by_id(kb_account_id)
|
170
|
+
account = @kb_apis.account_user_api.get_account_by_id(kb_account_id, @kb_apis.create_context)
|
171
171
|
account.currency
|
172
172
|
end
|
173
173
|
|
174
174
|
def report_group_for_currency(currency)
|
175
|
-
"Report Group for #{currency.
|
175
|
+
"Report Group for #{currency.to_s}"
|
176
176
|
end
|
177
177
|
|
178
178
|
def get_token(kb_payment_method_id)
|
179
|
-
LitlePaymentMethod.from_kb_payment_method_id(kb_payment_method_id
|
179
|
+
LitlePaymentMethod.from_kb_payment_method_id(kb_payment_method_id).litle_token
|
180
180
|
end
|
181
181
|
|
182
182
|
def save_response_and_transaction(litle_response, api_call, kb_payment_id=nil, amount_in_cents=0)
|
183
183
|
@logger.warn "Unsuccessful #{api_call}: #{litle_response.message}" unless litle_response.success?
|
184
184
|
|
185
185
|
# Save the response to our logs
|
186
|
-
response = LitleResponse.from_response(api_call, kb_payment_id
|
186
|
+
response = LitleResponse.from_response(api_call, kb_payment_id, litle_response)
|
187
187
|
response.save!
|
188
188
|
|
189
189
|
if response.success and !kb_payment_id.blank? and !response.litle_txn_id.blank?
|
190
190
|
# Record the transaction
|
191
191
|
transaction = response.create_litle_transaction!(:amount_in_cents => amount_in_cents,
|
192
192
|
:api_call => api_call,
|
193
|
-
:kb_payment_id => kb_payment_id
|
193
|
+
:kb_payment_id => kb_payment_id,
|
194
194
|
:litle_txn_id => response.litle_txn_id)
|
195
195
|
@logger.debug "Recorded transaction: #{transaction.inspect}"
|
196
196
|
end
|
@@ -31,7 +31,7 @@ module Killbill::Litle
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def self.gateway_for_currency(currency)
|
34
|
-
currency_sym = currency.
|
34
|
+
currency_sym = currency.to_s.upcase.to_sym
|
35
35
|
gateway = @@gateways[currency_sym]
|
36
36
|
raise "Gateway for #{currency} not configured!" if gateway.nil?
|
37
37
|
gateway
|
@@ -37,28 +37,35 @@ module Killbill::Litle
|
|
37
37
|
|
38
38
|
def to_payment_method_response
|
39
39
|
properties = []
|
40
|
-
properties <<
|
40
|
+
properties << create_pm_kv_info('token', litle_token)
|
41
41
|
|
42
|
-
Killbill::Plugin::Model::PaymentMethodPlugin.new
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
42
|
+
pm_plugin = Killbill::Plugin::Model::PaymentMethodPlugin.new
|
43
|
+
pm_plugin.external_payment_method_id = external_payment_method_id
|
44
|
+
pm_plugin.is_default_payment_method = is_default
|
45
|
+
pm_plugin.properties = properties
|
46
|
+
pm_plugin.type = 'CreditCard'
|
47
|
+
pm_plugin.cc_name = cc_name
|
48
|
+
pm_plugin.cc_type = cc_type
|
49
|
+
pm_plugin.cc_expiration_month = cc_exp_month
|
50
|
+
pm_plugin.cc_expiration_year = cc_exp_year
|
51
|
+
pm_plugin.cc_last4 = cc_last_4
|
52
|
+
pm_plugin.address1 = address1
|
53
|
+
pm_plugin.address2 = address2
|
54
|
+
pm_plugin.city = city
|
55
|
+
pm_plugin.state = state
|
56
|
+
pm_plugin.zip = zip
|
57
|
+
pm_plugin.country = country
|
58
|
+
|
59
|
+
pm_plugin
|
58
60
|
end
|
59
61
|
|
60
62
|
def to_payment_method_info_response
|
61
|
-
Killbill::Plugin::Model::PaymentMethodInfoPlugin.new
|
63
|
+
pm_info_plugin = Killbill::Plugin::Model::PaymentMethodInfoPlugin.new
|
64
|
+
pm_info_plugin.account_id = kb_account_id
|
65
|
+
pm_info_plugin.payment_method_id = kb_payment_method_id
|
66
|
+
pm_info_plugin.is_default = is_default
|
67
|
+
pm_info_plugin.external_payment_method_id = external_payment_method_id
|
68
|
+
pm_info_plugin
|
62
69
|
end
|
63
70
|
|
64
71
|
def is_default
|
@@ -77,5 +84,14 @@ module Killbill::Litle
|
|
77
84
|
nil
|
78
85
|
end
|
79
86
|
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def create_pm_kv_info(key, value)
|
91
|
+
prop = Killbill::Plugin::Model::PaymentMethodKVInfo.new
|
92
|
+
prop.key = key
|
93
|
+
prop.value = value
|
94
|
+
prop
|
95
|
+
end
|
80
96
|
end
|
81
97
|
end
|
@@ -47,33 +47,33 @@ module Killbill::Litle
|
|
47
47
|
|
48
48
|
def self.from_response(api_call, kb_payment_id, response)
|
49
49
|
LitleResponse.new({
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
50
|
+
:api_call => api_call,
|
51
|
+
:kb_payment_id => kb_payment_id,
|
52
|
+
:message => response.message,
|
53
|
+
:authorization => response.authorization,
|
54
|
+
:fraud_review => response.fraud_review?,
|
55
|
+
:test => response.test?,
|
56
|
+
:params_litleonelineresponse_message => extract(response, "litleOnlineResponse", "message"),
|
57
|
+
:params_litleonelineresponse_response => extract(response, "litleOnlineResponse", "response"),
|
58
|
+
:params_litleonelineresponse_version => extract(response, "litleOnlineResponse", "version"),
|
59
|
+
:params_litleonelineresponse_xmlns => extract(response, "litleOnlineResponse", "xmlns"),
|
60
|
+
:params_litleonelineresponse_saleresponse_customer_id => extract(response, "litleOnlineResponse", "saleResponse", "customerId"),
|
61
|
+
:params_litleonelineresponse_saleresponse_id => extract(response, "litleOnlineResponse", "saleResponse", "id"),
|
62
|
+
:params_litleonelineresponse_saleresponse_report_group => extract(response, "litleOnlineResponse", "saleResponse", "reportGroup"),
|
63
|
+
:params_litleonelineresponse_saleresponse_litle_txn_id => extract(response, "litleOnlineResponse", "saleResponse", "litleTxnId"),
|
64
|
+
:params_litleonelineresponse_saleresponse_order_id => extract(response, "litleOnlineResponse", "saleResponse", "orderId"),
|
65
|
+
:params_litleonelineresponse_saleresponse_response => extract(response, "litleOnlineResponse", "saleResponse", "response"),
|
66
|
+
:params_litleonelineresponse_saleresponse_response_time => extract(response, "litleOnlineResponse", "saleResponse", "responseTime"),
|
67
|
+
:params_litleonelineresponse_saleresponse_message => extract(response, "litleOnlineResponse", "saleResponse", "message"),
|
68
|
+
:params_litleonelineresponse_saleresponse_auth_code => extract(response, "litleOnlineResponse", "saleResponse", "authCode"),
|
69
|
+
:avs_result_code => response.avs_result.kind_of?(ActiveMerchant::Billing::AVSResult) ? response.avs_result.code : response.avs_result['code'],
|
70
|
+
:avs_result_message => response.avs_result.kind_of?(ActiveMerchant::Billing::AVSResult) ? response.avs_result.message : response.avs_result['message'],
|
71
|
+
:avs_result_street_match => response.avs_result.kind_of?(ActiveMerchant::Billing::AVSResult) ? response.avs_result.street_match : response.avs_result['street_match'],
|
72
|
+
:avs_result_postal_match => response.avs_result.kind_of?(ActiveMerchant::Billing::AVSResult) ? response.avs_result.postal_match : response.avs_result['postal_match'],
|
73
|
+
:cvv_result_code => response.cvv_result.kind_of?(ActiveMerchant::Billing::CVVResult) ? response.cvv_result.code : response.cvv_result['code'],
|
74
|
+
:cvv_result_message => response.cvv_result.kind_of?(ActiveMerchant::Billing::CVVResult) ? response.cvv_result.message : response.cvv_result['message'],
|
75
|
+
:success => response.success?
|
76
|
+
})
|
77
77
|
end
|
78
78
|
|
79
79
|
def to_payment_response
|
@@ -104,11 +104,26 @@ module Killbill::Litle
|
|
104
104
|
gateway_error_code = params_litleonelineresponse_saleresponse_response
|
105
105
|
|
106
106
|
if type == :payment
|
107
|
-
|
108
|
-
|
107
|
+
p_info_plugin = Killbill::Plugin::Model::PaymentInfoPlugin.new
|
108
|
+
p_info_plugin.amount = amount_in_cents
|
109
|
+
p_info_plugin.created_date = created_date
|
110
|
+
p_info_plugin.effective_date = effective_date
|
111
|
+
p_info_plugin.status = (success ? :PROCESSED : :ERROR)
|
112
|
+
p_info_plugin.gateway_error = gateway_error
|
113
|
+
p_info_plugin.gateway_error_code = gateway_error_code
|
114
|
+
p_info_plugin.first_payment_reference_id = first_payment_reference_id
|
115
|
+
p_info_plugin.second_payment_reference_id = second_payment_reference_id
|
116
|
+
p_info_plugin
|
109
117
|
else
|
110
|
-
|
111
|
-
|
118
|
+
r_info_plugin = Killbill::Plugin::Model::RefundInfoPlugin.new
|
119
|
+
r_info_plugin.amount = amount_in_cents
|
120
|
+
r_info_plugin.created_date = created_date
|
121
|
+
r_info_plugin.effective_date = effective_date
|
122
|
+
r_info_plugin.status = (success ? :PROCESSED : :ERROR)
|
123
|
+
r_info_plugin.gateway_error = gateway_error
|
124
|
+
r_info_plugin.gateway_error_code = gateway_error_code
|
125
|
+
r_info_plugin.reference_id = first_payment_reference_id
|
126
|
+
r_info_plugin
|
112
127
|
end
|
113
128
|
end
|
114
129
|
|
data/lib/litle/private_api.rb
CHANGED
@@ -14,11 +14,10 @@ module Killbill::Litle
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def get_currency(
|
18
|
-
kb_account_id = Killbill::Plugin::Model::UUID.new(kb_account_id_s)
|
17
|
+
def get_currency(kb_account_id)
|
19
18
|
account = kb_apis.get_account_by_id(kb_account_id)
|
20
|
-
account.currency
|
21
|
-
rescue
|
19
|
+
account.currency
|
20
|
+
rescue => e
|
22
21
|
'USD'
|
23
22
|
end
|
24
23
|
|
data/pom.xml
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
<groupId>com.ning.killbill.ruby</groupId>
|
26
26
|
<artifactId>litle-plugin</artifactId>
|
27
27
|
<packaging>pom</packaging>
|
28
|
-
<version>1.
|
28
|
+
<version>1.3.0</version>
|
29
29
|
<name>litle-plugin</name>
|
30
30
|
<url>http://github.com/killbill/killbill-litle-plugin</url>
|
31
31
|
<description>Plugin for accessing Litle as a payment gateway</description>
|
@@ -32,7 +32,7 @@ describe Killbill::Litle::PaymentPlugin do
|
|
32
32
|
it 'should reset payment methods' do
|
33
33
|
kb_account_id = '129384'
|
34
34
|
|
35
|
-
@plugin.get_payment_methods(kb_account_id
|
35
|
+
@plugin.get_payment_methods(kb_account_id).size.should == 0
|
36
36
|
verify_pms kb_account_id, 0
|
37
37
|
|
38
38
|
# Create a pm with a kb_payment_method_id
|
@@ -44,19 +44,19 @@ describe Killbill::Litle::PaymentPlugin do
|
|
44
44
|
# Add some in KillBill and reset
|
45
45
|
payment_methods = []
|
46
46
|
# Random order... Shouldn't matter...
|
47
|
-
payment_methods <<
|
48
|
-
payment_methods <<
|
49
|
-
payment_methods <<
|
47
|
+
payment_methods << create_pm_info_plugin(kb_account_id, 'kb-3', false, 'litle-3')
|
48
|
+
payment_methods << create_pm_info_plugin(kb_account_id, 'kb-2', false, 'litle-2')
|
49
|
+
payment_methods << create_pm_info_plugin(kb_account_id, 'kb-4', false, 'litle-4')
|
50
50
|
@plugin.reset_payment_methods kb_account_id, payment_methods
|
51
51
|
verify_pms kb_account_id, 4
|
52
52
|
|
53
53
|
# Add a payment method without a kb_payment_method_id
|
54
54
|
Killbill::Litle::LitlePaymentMethod.create :kb_account_id => kb_account_id,
|
55
55
|
:litle_token => 'litle-5'
|
56
|
-
@plugin.get_payment_methods(kb_account_id
|
56
|
+
@plugin.get_payment_methods(kb_account_id).size.should == 5
|
57
57
|
|
58
58
|
# Verify we can match it
|
59
|
-
payment_methods <<
|
59
|
+
payment_methods << create_pm_info_plugin(kb_account_id, 'kb-5', false, 'litle-5')
|
60
60
|
@plugin.reset_payment_methods kb_account_id, payment_methods
|
61
61
|
verify_pms kb_account_id, 5
|
62
62
|
|
@@ -66,7 +66,7 @@ describe Killbill::Litle::PaymentPlugin do
|
|
66
66
|
private
|
67
67
|
|
68
68
|
def verify_pms(kb_account_id, size)
|
69
|
-
pms = @plugin.get_payment_methods(kb_account_id
|
69
|
+
pms = @plugin.get_payment_methods(kb_account_id)
|
70
70
|
pms.size.should == size
|
71
71
|
pms.each do |pm|
|
72
72
|
pm.account_id.should == kb_account_id
|
@@ -74,4 +74,13 @@ describe Killbill::Litle::PaymentPlugin do
|
|
74
74
|
pm.external_payment_method_id.should == 'litle-' + pm.payment_method_id.split('-')[1]
|
75
75
|
end
|
76
76
|
end
|
77
|
+
|
78
|
+
def create_pm_info_plugin(kb_account_id, kb_payment_method_id, is_default, external_payment_method_id)
|
79
|
+
pm_info_plugin = Killbill::Plugin::Model::PaymentMethodInfoPlugin.new
|
80
|
+
pm_info_plugin.account_id = kb_account_id
|
81
|
+
pm_info_plugin.payment_method_id = kb_payment_method_id
|
82
|
+
pm_info_plugin.is_default = is_default
|
83
|
+
pm_info_plugin.external_payment_method_id = external_payment_method_id
|
84
|
+
pm_info_plugin
|
85
|
+
end
|
77
86
|
end
|
@@ -3,33 +3,30 @@ require 'logger'
|
|
3
3
|
|
4
4
|
ActiveMerchant::Billing::Base.mode = :test
|
5
5
|
|
6
|
-
class
|
6
|
+
class FakeJavaUserAccountApi
|
7
|
+
attr_accessor :accounts
|
7
8
|
|
8
|
-
def initialize
|
9
|
-
|
9
|
+
def initialize
|
10
|
+
@accounts = []
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
def get_account_by_id(id, context)
|
14
|
+
@accounts.find { |account| account.id == id.to_s }
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_account_by_key(external_key, context)
|
18
|
+
@accounts.find { |account| account.external_key == external_key.to_s }
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
18
22
|
describe Killbill::Litle::PaymentPlugin do
|
19
23
|
before(:each) do
|
20
|
-
@call_context = Killbill::Plugin::Model::CallContext.new(SecureRandom.uuid,
|
21
|
-
'token',
|
22
|
-
'rspec tester',
|
23
|
-
'TEST',
|
24
|
-
'user',
|
25
|
-
'testing',
|
26
|
-
'this is from a test',
|
27
|
-
Time.now,
|
28
|
-
Time.now)
|
29
|
-
|
30
24
|
@plugin = Killbill::Litle::PaymentPlugin.new
|
31
|
-
|
32
|
-
@
|
25
|
+
|
26
|
+
@account_api = FakeJavaUserAccountApi.new
|
27
|
+
svcs = {:account_user_api => @account_api}
|
28
|
+
@plugin.kb_apis = Killbill::Plugin::KillbillApi.new('litle', svcs)
|
29
|
+
|
33
30
|
@plugin.logger = Logger.new(STDOUT)
|
34
31
|
@plugin.conf_dir = File.expand_path(File.dirname(__FILE__) + '../../../')
|
35
32
|
@plugin.start_plugin
|
@@ -39,49 +36,49 @@ describe Killbill::Litle::PaymentPlugin do
|
|
39
36
|
@plugin.stop_plugin
|
40
37
|
end
|
41
38
|
|
42
|
-
it
|
39
|
+
it 'should be able to create and retrieve payment methods' do
|
43
40
|
pm = create_payment_method
|
44
41
|
|
45
|
-
pms = @plugin.get_payment_methods(pm.kb_account_id
|
42
|
+
pms = @plugin.get_payment_methods(pm.kb_account_id)
|
46
43
|
pms.size.should == 1
|
47
44
|
pms[0].external_payment_method_id.should == pm.litle_token
|
48
45
|
|
49
|
-
pm_details = @plugin.get_payment_method_detail(pm.kb_account_id, pm.kb_payment_method_id
|
46
|
+
pm_details = @plugin.get_payment_method_detail(pm.kb_account_id, pm.kb_payment_method_id)
|
50
47
|
pm_details.external_payment_method_id.should == pm.litle_token
|
51
48
|
|
52
|
-
@plugin.delete_payment_method(pm.kb_account_id, pm.kb_payment_method_id
|
49
|
+
@plugin.delete_payment_method(pm.kb_account_id, pm.kb_payment_method_id)
|
53
50
|
|
54
|
-
@plugin.get_payment_methods(pm.kb_account_id
|
55
|
-
lambda { @plugin.get_payment_method_detail(pm.kb_account_id, pm.kb_payment_method_id
|
51
|
+
@plugin.get_payment_methods(pm.kb_account_id).size.should == 0
|
52
|
+
lambda { @plugin.get_payment_method_detail(pm.kb_account_id, pm.kb_payment_method_id) }.should raise_error RuntimeError
|
56
53
|
end
|
57
54
|
|
58
|
-
it
|
55
|
+
it 'should be able to charge and refund' do
|
59
56
|
pm = create_payment_method
|
60
57
|
amount_in_cents = 10000
|
61
58
|
currency = 'USD'
|
62
59
|
kb_payment_id = SecureRandom.uuid
|
63
60
|
|
64
|
-
payment_response = @plugin.process_payment pm.kb_account_id, kb_payment_id, pm.kb_payment_method_id, amount_in_cents, currency
|
61
|
+
payment_response = @plugin.process_payment pm.kb_account_id, kb_payment_id, pm.kb_payment_method_id, amount_in_cents, currency
|
65
62
|
payment_response.amount.should == amount_in_cents
|
66
|
-
payment_response.status.should ==
|
63
|
+
payment_response.status.should == :PROCESSED
|
67
64
|
|
68
65
|
# Verify our table directly
|
69
66
|
response = Killbill::Litle::LitleResponse.find_by_api_call_and_kb_payment_id :charge, kb_payment_id
|
70
67
|
response.test.should be_true
|
71
68
|
response.success.should be_true
|
72
|
-
response.message.should ==
|
69
|
+
response.message.should == 'Approved'
|
73
70
|
response.params_litleonelineresponse_saleresponse_order_id.should == Killbill::Litle::Utils.compact_uuid(kb_payment_id)
|
74
71
|
|
75
|
-
payment_response = @plugin.get_payment_info pm.kb_account_id, kb_payment_id
|
72
|
+
payment_response = @plugin.get_payment_info pm.kb_account_id, kb_payment_id
|
76
73
|
payment_response.amount.should == amount_in_cents
|
77
|
-
payment_response.status.should ==
|
74
|
+
payment_response.status.should == :PROCESSED
|
78
75
|
|
79
76
|
# Check we cannot refund an amount greater than the original charge
|
80
|
-
lambda { @plugin.process_refund pm.kb_account_id, kb_payment_id, amount_in_cents + 1, currency
|
77
|
+
lambda { @plugin.process_refund pm.kb_account_id, kb_payment_id, amount_in_cents + 1, currency }.should raise_error RuntimeError
|
81
78
|
|
82
|
-
refund_response = @plugin.process_refund pm.kb_account_id, kb_payment_id, amount_in_cents, currency
|
79
|
+
refund_response = @plugin.process_refund pm.kb_account_id, kb_payment_id, amount_in_cents, currency
|
83
80
|
refund_response.amount.should == amount_in_cents
|
84
|
-
refund_response.status.should ==
|
81
|
+
refund_response.status.should == :PROCESSED
|
85
82
|
|
86
83
|
# Verify our table directly
|
87
84
|
response = Killbill::Litle::LitleResponse.find_by_api_call_and_kb_payment_id :refund, kb_payment_id
|
@@ -89,18 +86,18 @@ describe Killbill::Litle::PaymentPlugin do
|
|
89
86
|
response.success.should be_true
|
90
87
|
|
91
88
|
# Check we can retrieve the refund
|
92
|
-
refund_response = @plugin.get_refund_info pm.kb_account_id, kb_payment_id
|
89
|
+
refund_response = @plugin.get_refund_info pm.kb_account_id, kb_payment_id
|
93
90
|
# Apparently, Litle returns positive amounts for refunds
|
94
91
|
refund_response.amount.should == amount_in_cents
|
95
|
-
refund_response.status.should ==
|
92
|
+
refund_response.status.should == :PROCESSED
|
96
93
|
|
97
94
|
# Make sure we can charge again the same payment method
|
98
95
|
second_amount_in_cents = 29471
|
99
96
|
second_kb_payment_id = SecureRandom.uuid
|
100
97
|
|
101
|
-
payment_response = @plugin.process_payment pm.kb_account_id, second_kb_payment_id, pm.kb_payment_method_id, second_amount_in_cents, currency
|
98
|
+
payment_response = @plugin.process_payment pm.kb_account_id, second_kb_payment_id, pm.kb_payment_method_id, second_amount_in_cents, currency
|
102
99
|
payment_response.amount.should == second_amount_in_cents
|
103
|
-
payment_response.status.should ==
|
100
|
+
payment_response.status.should == :PROCESSED
|
104
101
|
end
|
105
102
|
|
106
103
|
private
|
@@ -109,6 +106,9 @@ describe Killbill::Litle::PaymentPlugin do
|
|
109
106
|
kb_account_id = SecureRandom.uuid
|
110
107
|
kb_payment_method_id = SecureRandom.uuid
|
111
108
|
|
109
|
+
# Create a new account
|
110
|
+
create_kb_account kb_account_id
|
111
|
+
|
112
112
|
# Generate a token in Litle
|
113
113
|
paypage_registration_id = '123456789012345678901324567890abcdefghi'
|
114
114
|
cc_first_name = 'John'
|
@@ -125,22 +125,23 @@ describe Killbill::Litle::PaymentPlugin do
|
|
125
125
|
country = 'IFP'
|
126
126
|
|
127
127
|
properties = []
|
128
|
-
properties <<
|
129
|
-
properties <<
|
130
|
-
properties <<
|
131
|
-
properties <<
|
132
|
-
properties <<
|
133
|
-
properties <<
|
134
|
-
properties <<
|
135
|
-
properties <<
|
136
|
-
properties <<
|
137
|
-
properties <<
|
138
|
-
properties <<
|
139
|
-
properties <<
|
140
|
-
properties <<
|
141
|
-
|
142
|
-
info = Killbill::Plugin::Model::PaymentMethodPlugin.new
|
143
|
-
|
128
|
+
properties << create_pm_kv_info('paypageRegistrationId', paypage_registration_id)
|
129
|
+
properties << create_pm_kv_info('ccFirstName', cc_first_name)
|
130
|
+
properties << create_pm_kv_info('ccLastName', cc_last_name)
|
131
|
+
properties << create_pm_kv_info('ccType', cc_type)
|
132
|
+
properties << create_pm_kv_info('ccExpMonth', cc_exp_month)
|
133
|
+
properties << create_pm_kv_info('ccExpYear', cc_exp_year)
|
134
|
+
properties << create_pm_kv_info('ccLast4', cc_last_4)
|
135
|
+
properties << create_pm_kv_info('address1', address1)
|
136
|
+
properties << create_pm_kv_info('address2', address2)
|
137
|
+
properties << create_pm_kv_info('city', city)
|
138
|
+
properties << create_pm_kv_info('state', state)
|
139
|
+
properties << create_pm_kv_info('zip', zip)
|
140
|
+
properties << create_pm_kv_info('country', country)
|
141
|
+
|
142
|
+
info = Killbill::Plugin::Model::PaymentMethodPlugin.new
|
143
|
+
info.properties = properties
|
144
|
+
payment_method = @plugin.add_payment_method(kb_account_id, kb_payment_method_id, info, true)
|
144
145
|
|
145
146
|
pm = Killbill::Litle::LitlePaymentMethod.from_kb_payment_method_id kb_payment_method_id
|
146
147
|
pm.should == payment_method
|
@@ -162,4 +163,27 @@ describe Killbill::Litle::PaymentPlugin do
|
|
162
163
|
|
163
164
|
pm
|
164
165
|
end
|
166
|
+
|
167
|
+
def create_kb_account(kb_account_id)
|
168
|
+
external_key = Time.now.to_i.to_s + '-test'
|
169
|
+
email = external_key + '@tester.com'
|
170
|
+
|
171
|
+
account = Killbill::Plugin::Model::Account.new
|
172
|
+
account.id = kb_account_id
|
173
|
+
account.external_key = external_key
|
174
|
+
account.email = email
|
175
|
+
account.name = 'Integration spec'
|
176
|
+
account.currency = :USD
|
177
|
+
|
178
|
+
@account_api.accounts << account
|
179
|
+
|
180
|
+
return external_key, kb_account_id
|
181
|
+
end
|
182
|
+
|
183
|
+
def create_pm_kv_info(key, value)
|
184
|
+
prop = Killbill::Plugin::Model::PaymentMethodKVInfo.new
|
185
|
+
prop.key = key
|
186
|
+
prop.value = value
|
187
|
+
prop
|
188
|
+
end
|
165
189
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: killbill-litle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: killbill
|
@@ -17,13 +17,13 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 1.
|
20
|
+
version: 1.1.2
|
21
21
|
none: false
|
22
22
|
requirement: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.1.2
|
27
27
|
none: false
|
28
28
|
prerelease: false
|
29
29
|
type: :runtime
|
@@ -213,6 +213,7 @@ files:
|
|
213
213
|
- ".travis.yml"
|
214
214
|
- Gemfile
|
215
215
|
- Jarfile
|
216
|
+
- NEWS
|
216
217
|
- README.md
|
217
218
|
- Rakefile
|
218
219
|
- VERSION
|