killbill-litle 1.2.1 → 1.3.0
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.
- 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
|