virtual_merchant 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,35 @@
1
+ module VirtualMerchant
2
+ class Communication
3
+ require 'net/http'
4
+ require "rexml/document"
5
+
6
+ attr_accessor :xml, :url, :http_referer, :uri
7
+
8
+ def initialize(data)
9
+ @xml = data[:xml]
10
+ @url = data[:url]
11
+ @uri = URI.parse(@url)
12
+ @http_referer = data[:http_referer]
13
+ end
14
+
15
+ def send
16
+ http = Net::HTTP.new(@uri.host, @uri.port)
17
+ http.use_ssl = true
18
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
19
+ begin
20
+ http.post(uri.request_uri, xml, header).body
21
+ rescue
22
+ false
23
+ end
24
+ end
25
+
26
+ private
27
+ def header
28
+ if @http_referer
29
+ header = { 'Referer' => @http_referer }
30
+ else
31
+ header = {}
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,25 +1,54 @@
1
1
  module VirtualMerchant
2
+ require "rexml/document"
2
3
  class Response
3
- attr_accessor :result_message, :result, :blurred_card_number, :exp_date, :approval_code,
4
- :cvv2_response, :transaction_id, :transaction_time, :error, :approved
5
-
6
- def initialize(info)
7
- @result_message = info[:result_message]
8
- if info[:error]
9
- @result_type = "error"
10
- @error = info[:error]
11
- @approved = false
4
+ attr_accessor :result_message, :result, :blurred_card_number, :exp_date,
5
+ :approval_code, :cvv2_response, :transaction_id, :transaction_time, :error,
6
+ :approved
7
+
8
+ def initialize(xml_string)
9
+ if xml_string == false
10
+ error_response("-1", "VirtualMerchant did not respond.")
12
11
  else
13
- @approved = true
14
- @result_type = "approval"
15
- @result = info[:result]
16
- @blurred_card_number = info[:blurred_card_number]
17
- @exp_date = info[:exp_date]
18
- @approval_code = info[:approval_code]
19
- @cvv2_response = info[:cvv2_response]
20
- @transaction_id = info[:transaction_id]
21
- @transaction_time = info[:transaction_time]
12
+ decode_xml(xml_string)
22
13
  end
23
14
  end
15
+
16
+ private
17
+ def decode_xml(xml_string)
18
+ doc = REXML::Document.new(xml_string)
19
+ REXML::XPath.each(doc, "txn") do |xml|
20
+ if xml.elements["errorCode"]
21
+ #Something was wrong with the transaction so an
22
+ #errorCode and errorMessage were sent back
23
+ error_response(
24
+ xml.elements["errorCode"].text, xml.elements["errorMessage"].text)
25
+ elsif (xml.elements["ssl_result"] && xml.elements["ssl_result"].text != "0")
26
+ #something closer to an approval, but still declined
27
+ error_response(
28
+ xml.elements["ssl_result"].text, xml.elements["ssl_result_message"].text)
29
+ else
30
+ #a clean transaction has taken place
31
+ approval(xml)
32
+ end
33
+ end
34
+ end
35
+
36
+ def error_response(code, message)
37
+ @approved = false
38
+ @result_message = message
39
+ @error = code
40
+ end
41
+
42
+ def approval(xml)
43
+ @approved = true
44
+ @result_message = xml.elements["ssl_result_message"].text
45
+ @result = xml.elements["ssl_result"].text
46
+ @blurred_card_number = xml.elements["ssl_card_number"].text
47
+ @exp_date = xml.elements["ssl_exp_date"].text
48
+ @approval_code = xml.elements["ssl_approval_code"].text
49
+ @cvv2_response = xml.elements["ssl_cvv2_response"].text
50
+ @transaction_id = xml.elements["ssl_txn_id"].text
51
+ @transaction_time = xml.elements["ssl_txn_time"].text
52
+ end
24
53
  end
25
54
  end
@@ -1,7 +1,7 @@
1
1
  module VirtualMerchant
2
2
  require "rexml/document"
3
- require 'net/http'
4
3
  require 'virtual_merchant/amount'
4
+ require 'virtual_merchant/communication'
5
5
  require 'virtual_merchant/credentials'
6
6
  require 'virtual_merchant/credit_card'
7
7
  require 'virtual_merchant/response'
@@ -10,77 +10,34 @@ module VirtualMerchant
10
10
 
11
11
  def self.charge(card, amount, creds)
12
12
  xml = VirtualMerchant::XMLGenerator.generate(card, amount, creds, "ccsale")
13
- vm_response = self.sendXMLtoVirtualMerchant(xml, creds)
14
- response = self.generateResponse(vm_response)
15
- VirtualMerchant::Logger.new(response)
16
- response
13
+ self.process(xml, creds, amount)
17
14
  end
18
15
 
19
16
  def self.refund(card, amount, creds)
20
17
  xml = VirtualMerchant::XMLGenerator.generate(card, amount, creds, 'cccredit')
21
- vm_response = self.sendXMLtoVirtualMerchant(xml, creds)
22
- response = self.generateResponse(vm_response)
23
- VirtualMerchant::Logger.new(response)
24
- response
18
+ self.process(xml, creds, amount)
25
19
  end
26
20
 
27
21
  def self.void(transaction_id, creds)
28
22
  xml = VirtualMerchant::XMLGenerator.generateVoid(transaction_id, creds)
29
- vm_response = self.sendXMLtoVirtualMerchant(xml, creds)
30
- response = self.generateResponse(vm_response)
31
- VirtualMerchant::Logger.new(response)
32
- response
23
+ self.process(xml, creds)
33
24
  end
34
25
 
35
26
  private
36
- def self.sendXMLtoVirtualMerchant(xml, creds)
37
- if creds.referer
38
- headers = {
39
- 'Referer' => creds.referer
40
- }
41
- end
42
- if creds.demo
43
- uri=URI.parse('https://demo.myvirtualmerchant.com/VirtualMerchantDemo/processxml.do')
44
- else
45
- uri=URI.parse('https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do')
46
- end
47
-
48
- http = Net::HTTP.new(uri.host, uri.port)
49
- http.use_ssl = true
50
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
51
- body = http.post(uri.request_uri, xml, headers).body
52
- return body
27
+ def self.process(xml, creds, amount=0)
28
+ communication = VirtualMerchant::Communication.new(
29
+ {xml: xml, url: self.url(creds.demo), referer: creds.referer})
30
+ vm_response = communication.send
31
+ response = VirtualMerchant::Response.new(vm_response)
32
+ VirtualMerchant::Logger.new(response)
33
+ response
53
34
  end
54
35
 
55
- def self.generateResponse(vm_response)
56
- #decode XML sent back by virtualMerchant
57
- response = {}
58
- doc = REXML::Document.new(vm_response)
59
- REXML::XPath.each(doc, "txn") do |xml|
60
- if xml.elements["errorCode"]
61
- #Something was wrong with the transaction so an
62
- #errorCode and errorMessage were sent back
63
- response = VirtualMerchant::Response.new(
64
- error: xml.elements["errorCode"].text,
65
- result_message: xml.elements["errorMessage"].text)
66
- elsif (xml.elements["ssl_result"] && xml.elements["ssl_result"].text != "0")
67
- #something closer to an approval, but still declined
68
- response = VirtualMerchant::Response.new(
69
- error: xml.elements["ssl_result_message"].text,
70
- result_message: xml.elements["ssl_result"].text)
71
- else
72
- #a clean transaction has taken place
73
- response = VirtualMerchant::Response.new(
74
- result_message: xml.elements["ssl_result_message"].text,
75
- result: xml.elements["ssl_result"].text,
76
- blurred_card_number: xml.elements["ssl_card_number"].text,
77
- exp_date: xml.elements["ssl_exp_date"].text,
78
- approval_code: xml.elements["ssl_approval_code"].text,
79
- cvv2_response: xml.elements["ssl_cvv2_response"].text,
80
- transaction_id: xml.elements["ssl_txn_id"].text,
81
- transaction_time: xml.elements["ssl_txn_time"].text)
82
- end
36
+ def self.url(demo)
37
+ if demo
38
+ 'https://demo.myvirtualmerchant.com/VirtualMerchantDemo/processxml.do'
39
+ else
40
+ 'https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do'
83
41
  end
84
- response
85
42
  end
86
43
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: virtual_merchant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -19,6 +19,7 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - lib/virtual_merchant.rb
21
21
  - lib/virtual_merchant/amount.rb
22
+ - lib/virtual_merchant/communication.rb
22
23
  - lib/virtual_merchant/credentials.rb
23
24
  - lib/virtual_merchant/credit_card.rb
24
25
  - lib/virtual_merchant/logger.rb
@@ -44,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
44
45
  version: '0'
45
46
  requirements: []
46
47
  rubyforge_project:
47
- rubygems_version: 1.8.24
48
+ rubygems_version: 1.8.25
48
49
  signing_key:
49
50
  specification_version: 3
50
51
  summary: Virtual Merchant API