prismpay 0.0.5 → 0.0.6
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/lib/prismpay.rb +158 -15
- data/lib/prismpay_am.rb +16 -11
- data/spec/prismpay_spec.rb +84 -0
- metadata +1 -1
data/lib/prismpay.rb
CHANGED
@@ -14,14 +14,14 @@ module PrismPay
|
|
14
14
|
WSDL = File.expand_path("../TransactionService.xml", __FILE__)
|
15
15
|
|
16
16
|
ACH_CHECK_ACCT_TYPE = {"checking" => 1, "savings" => 2}
|
17
|
-
ACH_SEC_CODES = %w(POP, ARC, TEL, PPD, ICL, RCK, BOC)
|
17
|
+
ACH_SEC_CODES = %w(POP, ARC, TEL, PPD, ICL, RCK, BOC, CCDN)
|
18
18
|
|
19
19
|
attr_accessor :acctid, :password
|
20
20
|
attr_reader :client
|
21
21
|
|
22
22
|
def initialize(options = {})
|
23
23
|
merchant_info = options
|
24
|
-
merchant_info
|
24
|
+
merchant_info.merge!({:login => 'TEST0'}) unless merchant_info[:login]
|
25
25
|
|
26
26
|
if merchant_info.respond_to?("has_key?")
|
27
27
|
@acctid = merchant_info[:login] if merchant_info.has_key?(:login)
|
@@ -128,11 +128,23 @@ module PrismPay
|
|
128
128
|
# coming from a client into a prismpay vendor.
|
129
129
|
############################################################
|
130
130
|
|
131
|
-
def ach_sale
|
132
|
-
|
131
|
+
# def ach_sale(amount, bank_account, options ={})
|
132
|
+
# response = @client.request :process_ach_sale do
|
133
|
+
# http.auth.ssl.verify_mode = :none
|
134
|
+
# soap.body &build_ach_sale()
|
135
|
+
# end
|
133
136
|
|
134
|
-
|
135
|
-
end
|
137
|
+
# PrismCreditResponse.new(response)
|
138
|
+
# end
|
139
|
+
|
140
|
+
# def ach_credit(amount, auth, pp_txn_id, options = {})
|
141
|
+
# response = @client.request :process_ach_credit do
|
142
|
+
# http.auth.ssl.verify_mode = :none
|
143
|
+
# soap.body &build_ach_credit()
|
144
|
+
# end
|
145
|
+
|
146
|
+
# PrismCreditResponse.new(response)
|
147
|
+
# end
|
136
148
|
|
137
149
|
|
138
150
|
############################################################
|
@@ -142,18 +154,50 @@ module PrismPay
|
|
142
154
|
# disbursments to a third party as well
|
143
155
|
############################################################
|
144
156
|
|
145
|
-
def ext_ach_sale()
|
146
|
-
|
157
|
+
def ext_ach_sale(amount, bank_account, options = {})
|
158
|
+
response = @client.request :process_ext_ach_sale do
|
159
|
+
http.auth.ssl.verify_mode = :none
|
160
|
+
soap.body &build_ext_ach_sale_disburse(amount, bank_account, options)
|
161
|
+
end
|
147
162
|
|
148
|
-
|
163
|
+
PrismCreditResponse.new(response)
|
149
164
|
end
|
150
165
|
|
151
|
-
|
166
|
+
############################################################
|
167
|
+
# ext_ach_void doesn't work in generic testing accounts
|
168
|
+
############################################################
|
169
|
+
# def ext_ach_void(identification, pp_txn_id, options = {})
|
170
|
+
# response = @client.request :process_ext_ach_void do
|
171
|
+
# http.auth.ssl.verify_mode = :none
|
172
|
+
# soap.body &build_ext_ach_refund_void(nil, identification,
|
173
|
+
# pp_txn_id, options)
|
174
|
+
# end
|
175
|
+
|
176
|
+
# PrismCreditResponse.new(response)
|
177
|
+
# end
|
178
|
+
|
179
|
+
def ext_ach_refund(amount, identification, pp_txn_id, options = {})
|
180
|
+
response = @client.request :process_ext_ach_credit do
|
181
|
+
http.auth.ssl.verify_mode = :none
|
182
|
+
soap.body &build_ext_ach_refund_void(amount, identification,
|
183
|
+
pp_txn_id, options)
|
184
|
+
end
|
185
|
+
|
186
|
+
PrismCreditResponse.new(response)
|
152
187
|
end
|
153
188
|
|
154
|
-
def ext_ach_consumer_disbursement
|
189
|
+
def ext_ach_consumer_disbursement(amount, bank_account, options = {})
|
190
|
+
response = @client.request :process_ext_ach_consumer_disbursement do
|
191
|
+
http.auth.ssl.verify_mode = :none
|
192
|
+
soap.body &build_ext_ach_sale_disburse(amount, bank_account, options)
|
193
|
+
end
|
194
|
+
|
195
|
+
PrismCreditResponse.new(response)
|
155
196
|
end
|
156
197
|
|
198
|
+
|
199
|
+
|
200
|
+
# helper methods
|
157
201
|
private
|
158
202
|
|
159
203
|
def build_address(addr, type= "bill")
|
@@ -180,8 +224,8 @@ module PrismPay
|
|
180
224
|
xml_block = Proc.new { |xml|
|
181
225
|
xml.miscprocess("xsi:type" => "urn:ProfileRetrieve"){
|
182
226
|
xml.acctid @acctid
|
227
|
+
xml.merchantpin @password if @password
|
183
228
|
xml.subid options[:subid] if options[:subid]
|
184
|
-
xml.accountkey @password if @password
|
185
229
|
xml.last4digits options[:last_four]
|
186
230
|
xml.userprofileid options[:profileid]
|
187
231
|
xml.merchantpin options[:merchantpin] if options[:merchantpin]
|
@@ -196,6 +240,7 @@ module PrismPay
|
|
196
240
|
xml_block = Proc.new { |xml|
|
197
241
|
xml.miscprocess("xsi:type" => "urn:VoidCreditPost"){
|
198
242
|
xml.acctid @acctid
|
243
|
+
xml.merchantpin @password if @password
|
199
244
|
xml.amount amount
|
200
245
|
xml.orderid pp_txn_id
|
201
246
|
xml.historyid id
|
@@ -211,6 +256,7 @@ module PrismPay
|
|
211
256
|
xml_block = Proc.new {|xml|
|
212
257
|
xml.miscprocess("xsi:type" => "urn:VoidCreditPost"){
|
213
258
|
xml.acctid @acctid
|
259
|
+
xml.merchantpin @password if @password
|
214
260
|
xml.amount amount
|
215
261
|
xml.orderid pp_txn_id
|
216
262
|
# xml.customizedfields{
|
@@ -234,6 +280,7 @@ module PrismPay
|
|
234
280
|
xml_block = Proc.new {|xml|
|
235
281
|
xml.miscprocess("xsi:type" => "urn:VoidCreditPost"){
|
236
282
|
xml.acctid @acctid
|
283
|
+
xml.merchantpin @password if @password
|
237
284
|
xml.amount amount
|
238
285
|
xml.orderid pp_txn_id
|
239
286
|
xml.historyid auth
|
@@ -251,7 +298,7 @@ module PrismPay
|
|
251
298
|
|
252
299
|
missing_fields_for_options = {
|
253
300
|
:acctid => '',
|
254
|
-
:
|
301
|
+
:merchantpin => '',
|
255
302
|
:subid => ''
|
256
303
|
}
|
257
304
|
|
@@ -311,7 +358,8 @@ module PrismPay
|
|
311
358
|
xml_block = Proc.new{ |xml|
|
312
359
|
xml.ccinfo("xsi:type" => "urn:CreditCardInfo") {
|
313
360
|
xml.acctid @acctid
|
314
|
-
xml.
|
361
|
+
xml.merchantpin @password if @password
|
362
|
+
# xml.merchantpin options[:password] if options.has_key?(:password)
|
315
363
|
# xml.subid "xsi:nil" => "true"
|
316
364
|
xml.ccname "#{credit_card.first_name} #{credit_card.last_name}"
|
317
365
|
# xml.swipedata "xsi:nil" => "true"
|
@@ -365,12 +413,14 @@ module PrismPay
|
|
365
413
|
return xml_block
|
366
414
|
end
|
367
415
|
|
416
|
+
|
368
417
|
def build_profile_sale(amount, profile_id, last_four, options)
|
369
418
|
# as of now auth is historyid and we need :orderid set in options
|
370
419
|
|
371
420
|
xml_block = Proc.new {|xml|
|
372
421
|
xml.miscprocess("xsi:type" => "urn:MPTransProcess"){
|
373
422
|
xml.acctid @acctid
|
423
|
+
xml.merchantpin @password if @password
|
374
424
|
xml.last4digits last_four
|
375
425
|
xml.userprofileid profile_id
|
376
426
|
xml.amount amount
|
@@ -381,9 +431,102 @@ module PrismPay
|
|
381
431
|
end
|
382
432
|
|
383
433
|
|
434
|
+
def build_ext_ach_sale_disburse(amount, bank_account, options)
|
435
|
+
# should probably pass in the companyname under options
|
436
|
+
acct_type = "#{bank_account.account_holder_type} " +
|
437
|
+
"#{bank_account.account_type}"
|
438
|
+
|
439
|
+
xml_block = Proc.new { |xml|
|
440
|
+
xml.ckinfo("xsi:type" => "urn:ACHInfo"){
|
441
|
+
xml.acctid @acctid
|
442
|
+
xml.merchantpin(@password) if @password
|
443
|
+
xml.ckname bank_account.name
|
444
|
+
xml.ckaba bank_account.routing_number
|
445
|
+
xml.ckacct bank_account.account_number
|
446
|
+
xml.ckno(bank_account.cknumber) if bank_account.number
|
447
|
+
xml.amount amount
|
448
|
+
if bank_account.account_holder_type =~ /business/i
|
449
|
+
xml.cktype('CCD')
|
450
|
+
else
|
451
|
+
xml.cktype('PPD')
|
452
|
+
end
|
453
|
+
xml.ckaccttypedesc acct_type
|
454
|
+
xml.companyname options[:companyname]
|
455
|
+
xml.ipaddress
|
456
|
+
}
|
457
|
+
}
|
458
|
+
|
459
|
+
return xml_block
|
460
|
+
end
|
461
|
+
|
462
|
+
def build_ext_ach_refund_void(amount, auth, pp_txn_id, options)
|
463
|
+
# should probably pass in the companyname under options
|
464
|
+
|
465
|
+
xml_block = Proc.new { |xml|
|
466
|
+
xml.ckinfo("xsi:type" => "urn:ACHInfo"){
|
467
|
+
xml.acctid @acctid
|
468
|
+
xml.merchantpin(@password) if @password
|
469
|
+
xml.orderid pp_txn_id
|
470
|
+
xml.historyid auth
|
471
|
+
xml.amount amount if amount
|
472
|
+
xml.ipaddress
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
return xml_block
|
477
|
+
end
|
478
|
+
|
479
|
+
|
480
|
+
|
384
481
|
end # class PrismPay
|
385
482
|
|
386
483
|
|
484
|
+
class BankAccount
|
485
|
+
# mimic ActiveMerchant check object for compatibility, tesing, and
|
486
|
+
# stand alone purposes
|
487
|
+
|
488
|
+
attr_accessor :first_name, :last_name, :account_number, :routing_number,
|
489
|
+
:account_holder_type, :account_type, :cknumber
|
490
|
+
|
491
|
+
def number=(n)
|
492
|
+
@cknumber = n
|
493
|
+
end
|
494
|
+
|
495
|
+
def number
|
496
|
+
@cknumber
|
497
|
+
end
|
498
|
+
|
499
|
+
def [](method)
|
500
|
+
eval ("self.#{method}")
|
501
|
+
end
|
502
|
+
|
503
|
+
def []=(method, rval)
|
504
|
+
eval ("self.#{method} = rval")
|
505
|
+
end
|
506
|
+
|
507
|
+
def name
|
508
|
+
[@first_name, @last_name].join(' ')
|
509
|
+
end
|
510
|
+
|
511
|
+
def name=(n)
|
512
|
+
names = n.split(' ')
|
513
|
+
@first_name = names[0]
|
514
|
+
@last_name = names[1]
|
515
|
+
end
|
516
|
+
|
517
|
+
def initialize(checkinfo = {})
|
518
|
+
if checkinfo.respond_to?("has_key?")
|
519
|
+
@account_number = checkinfo[:account_number] if checkinfo.has_key?(:account_number)
|
520
|
+
@name = checkinfo[:name] if checkinfo.has_key?(:name)
|
521
|
+
@routing_number = checkinfo[:routing_number] if checkinfo.has_key?(:routing_number)
|
522
|
+
@cknumber = checkinfo[:number] if checkinfo.has_key?(:number)
|
523
|
+
@account_type = checkinfo[:account_type] if checkinfo.has_key?(:account_type)
|
524
|
+
@account_holder_type = checkinfo[:account_holder_type] if checkinfo.has_key?(:account_holder_type)
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
end # BankAccount
|
529
|
+
|
387
530
|
class CreditCard
|
388
531
|
# credit card information... mimic ActiveMerchant
|
389
532
|
attr_accessor :number, :month, :year, :first_name,
|
@@ -407,7 +550,7 @@ module PrismPay
|
|
407
550
|
eval ("self.#{method} = rval")
|
408
551
|
end
|
409
552
|
|
410
|
-
def initialize(ccinfo)
|
553
|
+
def initialize(ccinfo = {})
|
411
554
|
if ccinfo.respond_to?("has_key?")
|
412
555
|
@number = ccinfo[:number] if ccinfo.has_key?(:number)
|
413
556
|
@month = ccinfo[:month] if ccinfo.has_key?(:month)
|
data/lib/prismpay_am.rb
CHANGED
@@ -21,21 +21,26 @@ module ActiveMerchant
|
|
21
21
|
super
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
24
|
# Transactions
|
26
|
-
def check_purchase
|
25
|
+
def check_purchase(amount, check, options = {})
|
26
|
+
result = @gateway.ext_ach_sale(amount, check, options)
|
27
|
+
result.active_merchant_response
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_refund(amount, identification, pp_txn_id, options = {})
|
31
|
+
|
32
|
+
result = @gateway.ext_ach_refund(amount, identification,
|
33
|
+
pp_txn_id, options)
|
34
|
+
|
35
|
+
result.active_merchant_response
|
27
36
|
end
|
28
37
|
|
29
|
-
def
|
38
|
+
def check_consumer_disbursement(amount, check, options = {})
|
39
|
+
result = @gateway.ext_ach_consumer_disbursement(amount, check, options)
|
40
|
+
result.active_merchant_response
|
30
41
|
end
|
31
42
|
|
32
43
|
def profile_sale(amount, profile_id, last_four, options = {})
|
33
|
-
Rails.logger.info "########################################"
|
34
|
-
Rails.logger.info "# I am getting called"
|
35
|
-
Rails.logger.info "# amount #{amount}"
|
36
|
-
Rails.logger.info "# pofile Id #{profile_id}"
|
37
|
-
Rails.logger.info "# last four #{last_four}"
|
38
|
-
Rails.logger.info "########################################"
|
39
44
|
result = @gateway.profile_sale(amount, profile_id, last_four, options)
|
40
45
|
result.active_merchant_response
|
41
46
|
end
|
@@ -56,12 +61,12 @@ module ActiveMerchant
|
|
56
61
|
end
|
57
62
|
|
58
63
|
def void(amount, identification, pp_txn_id, options = {})
|
59
|
-
result = @gateway.cc_void(identification, options)
|
64
|
+
result = @gateway.cc_void(amount, identification, pp_txn_id, options)
|
60
65
|
result.active_merchant_response
|
61
66
|
end
|
62
67
|
|
63
68
|
def refund(amount, identification, pp_txn_id, options ={ })
|
64
|
-
result = @gateway.credit(amount, identification, options)
|
69
|
+
result = @gateway.credit(amount, identification, pp_txn_id, options)
|
65
70
|
result.active_merchant_response
|
66
71
|
end
|
67
72
|
end
|
data/spec/prismpay_spec.rb
CHANGED
@@ -351,3 +351,87 @@ describe PrismPay::PrismPay, "credit" do
|
|
351
351
|
end
|
352
352
|
end
|
353
353
|
|
354
|
+
describe PrismPay::PrismPay, "ext_ach_sale", :bfd => true do
|
355
|
+
|
356
|
+
ba = PrismPay::BankAccount.new
|
357
|
+
ba[:name] = "George Jones"
|
358
|
+
ba[:account_number] = "9999999999"
|
359
|
+
ba[:routing_number] = "9999999999"
|
360
|
+
ba[:account_holder_type] = 'personal'
|
361
|
+
ba[:account_type] = 'checking'
|
362
|
+
|
363
|
+
amount = "1.22"
|
364
|
+
|
365
|
+
options = {
|
366
|
+
:login => "TEST0",
|
367
|
+
:order_id => Time.now.strftime("%y%m%d%H%M%S"),
|
368
|
+
}
|
369
|
+
|
370
|
+
gateway = PrismPay::PrismPay.new(options)
|
371
|
+
|
372
|
+
|
373
|
+
it "should transact sale with a call to ext_ach_sale" do
|
374
|
+
|
375
|
+
response = gateway.ext_ach_sale(amount, ba, options).soap_response
|
376
|
+
response.body[:multi_ref][:status].should =~ /Approved/
|
377
|
+
|
378
|
+
save_refund_trans(response.body[:multi_ref][:orderid],
|
379
|
+
response.body[:multi_ref][:historyid],
|
380
|
+
amount)
|
381
|
+
|
382
|
+
amount2 = 5.55
|
383
|
+
|
384
|
+
response = gateway.ext_ach_sale(amount, ba, options).soap_response
|
385
|
+
|
386
|
+
save_void_trans(response.body[:multi_ref][:orderid],
|
387
|
+
response.body[:multi_ref][:historyid],
|
388
|
+
amount)
|
389
|
+
|
390
|
+
|
391
|
+
end
|
392
|
+
|
393
|
+
|
394
|
+
it "should transact an ext_ach_consumer_disbursement" do
|
395
|
+
|
396
|
+
response = gateway.ext_ach_consumer_disbursement(amount, ba, options).soap_response
|
397
|
+
response.body[:multi_ref][:status].should =~ /Approved/
|
398
|
+
|
399
|
+
|
400
|
+
end
|
401
|
+
|
402
|
+
|
403
|
+
it "should void a previous transaction" do
|
404
|
+
values = get_last_trans("./void~")
|
405
|
+
|
406
|
+
orderid = values[:order_id]
|
407
|
+
authcode = values[:historyid]
|
408
|
+
amount = values[:amount]
|
409
|
+
|
410
|
+
response = gateway.ext_ach_void(amount, authcode, orderid).soap_response
|
411
|
+
response.body[:multi_ref][:status].should =~ /Approved/
|
412
|
+
|
413
|
+
if response.body[:multi_ref][:status] =~ /Approved/
|
414
|
+
processed_trans "#{orderid}:#{authcode}:#{amount}\n", "./void~"
|
415
|
+
end
|
416
|
+
|
417
|
+
end
|
418
|
+
|
419
|
+
|
420
|
+
it "should refund a transaction" do
|
421
|
+
values = get_last_trans("./credit~")
|
422
|
+
|
423
|
+
orderid = values[:order_id]
|
424
|
+
authcode = values[:historyid]
|
425
|
+
amount = values[:amount]
|
426
|
+
|
427
|
+
response = gateway.ext_ach_refund(amount, authcode, orderid).soap_response
|
428
|
+
response.body[:multi_ref][:status].should =~ /Approved/
|
429
|
+
|
430
|
+
if response.body[:multi_ref][:status] =~ /Approved/
|
431
|
+
processed_trans "#{orderid}:#{authcode}:#{amount}\n", "./credit~"
|
432
|
+
end
|
433
|
+
|
434
|
+
end
|
435
|
+
|
436
|
+
end
|
437
|
+
|