virtual_merchant 0.1.2 → 0.1.3

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.
@@ -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