prismpay 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|