mpi_client 0.0.3 → 0.0.4
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/{mpi_client → mpi}/option_translator.rb +1 -0
- data/lib/{mpi_client/mpi_response.rb → mpi/response.rb} +0 -0
- data/lib/mpi/verification/request.rb +48 -0
- data/lib/mpi/verification/response.rb +44 -0
- data/lib/mpi/verification.rb +6 -0
- data/lib/mpi.rb +6 -0
- data/lib/mpi_client.rb +8 -6
- metadata +19 -9
- data/remote_spec/mpi_client_spec.rb +0 -49
- data/spec/mpi_client_spec.rb +0 -66
- data/spec/mpi_response_spec.rb +0 -31
- data/spec/option_translator_spec.rb +0 -25
@@ -10,6 +10,7 @@ class OptionTranslator
|
|
10
10
|
:certificate => :PublicCertificate,
|
11
11
|
:private_key => :PrivateKey,
|
12
12
|
:directory_server_url => :DirectoryServerURL,
|
13
|
+
:country_code => :CountryCode,
|
13
14
|
:brand => :CardType,
|
14
15
|
:response_url => :ResponseURL,
|
15
16
|
:client_url => :ClientURL,
|
File without changes
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module MPI
|
2
|
+
module Verification
|
3
|
+
class Request
|
4
|
+
PARAMS_MAP = {
|
5
|
+
'AccountId' => :account_id,
|
6
|
+
'Amount' => :amount, #in cents
|
7
|
+
'CardNumber' => :card_number,
|
8
|
+
'Description' => :description,
|
9
|
+
'DisplayAmount' => :display_amount,
|
10
|
+
'CurrencyCode' => :currency,
|
11
|
+
'ExpY' => :exp_year,
|
12
|
+
'ExpM' => :exp_month,
|
13
|
+
'URL' => :termination_url,
|
14
|
+
}
|
15
|
+
|
16
|
+
REQUEST_TYPE = 'vereq'
|
17
|
+
|
18
|
+
attr_reader :options, :transaction_id
|
19
|
+
|
20
|
+
def initialize(options, transaction_id)
|
21
|
+
@options, @transaction_id = options, transaction_id
|
22
|
+
end
|
23
|
+
|
24
|
+
def process
|
25
|
+
Response.parse(post(build_xml))
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def post(xml_request)
|
30
|
+
Network.post(MPI.server_url, xml_request)
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_xml
|
34
|
+
xml = Nokogiri::XML::Builder.new(:encoding => 'UTF-8')
|
35
|
+
|
36
|
+
xml.REQUEST(:type => REQUEST_TYPE) do |xml|
|
37
|
+
xml.Transaction(:id => transaction_id) do |xml|
|
38
|
+
PARAMS_MAP.each_pair do |key, value|
|
39
|
+
xml.send(key, options[value])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
xml.to_xml
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module MPI
|
2
|
+
module Verification
|
3
|
+
class Response
|
4
|
+
attr_reader :xml, :error_code, :error_message, :status, :url
|
5
|
+
|
6
|
+
def initialize(xml)
|
7
|
+
@xml = xml
|
8
|
+
end
|
9
|
+
|
10
|
+
def successful?
|
11
|
+
!(error_message || error_code)
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse
|
15
|
+
doc = Nokogiri::XML(xml)
|
16
|
+
|
17
|
+
unless (doc.xpath("//Transaction")).empty?
|
18
|
+
@status = doc.xpath("//Transaction").attr('status')
|
19
|
+
@url = doc.xpath("//Transaction/URL").text
|
20
|
+
else
|
21
|
+
get_error(doc)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def self.parse(xml)
|
27
|
+
response = self.new(xml)
|
28
|
+
response.parse
|
29
|
+
response
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def get_error(doc)
|
34
|
+
unless (error = doc.xpath("//Error")).empty?
|
35
|
+
@error_message = error.text
|
36
|
+
@error_code = error.attr('code')
|
37
|
+
else
|
38
|
+
@error_message = 'Unknown response was received from MPI'
|
39
|
+
@error_code = ''
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/mpi.rb
ADDED
data/lib/mpi_client.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'network'
|
3
3
|
require 'nokogiri'
|
4
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
4
5
|
|
5
|
-
|
6
|
+
require 'mpi'
|
6
7
|
|
7
|
-
require '
|
8
|
-
require '
|
8
|
+
require 'mpi/option_translator'
|
9
|
+
require 'mpi/response'
|
9
10
|
|
10
11
|
class MPIClient
|
11
|
-
CLIENT_METHODS = %w(create_account get_account_info update_account delete_account
|
12
|
+
CLIENT_METHODS = %w(create_account get_account_info update_account delete_account verify)
|
12
13
|
|
13
14
|
def initialize(server_url)
|
14
15
|
@connection = Network::Connection.new(server_url)
|
@@ -28,11 +29,12 @@ class MPIClient
|
|
28
29
|
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
29
30
|
xml.REQUEST(:type => request_type) do |xml|
|
30
31
|
xml.Transaction(transaction_attrs) do |xml|
|
31
|
-
options.each
|
32
|
+
options.each do |k,v|
|
33
|
+
xml.send(OptionTranslator.to_server(k), v)
|
34
|
+
end
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
35
|
-
|
36
38
|
builder.to_xml
|
37
39
|
end
|
38
40
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mpi_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Plashchynski
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-10-
|
13
|
+
date: 2009-10-22 00:00:00 +03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -33,6 +33,16 @@ dependencies:
|
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 1.1.2
|
35
35
|
version:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activesupport
|
38
|
+
type: :runtime
|
39
|
+
version_requirement:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.3.2
|
45
|
+
version:
|
36
46
|
description:
|
37
47
|
email: plashchynski@gmail.com
|
38
48
|
executables: []
|
@@ -42,13 +52,13 @@ extensions: []
|
|
42
52
|
extra_rdoc_files: []
|
43
53
|
|
44
54
|
files:
|
45
|
-
- lib/
|
46
|
-
- lib/
|
55
|
+
- lib/mpi/option_translator.rb
|
56
|
+
- lib/mpi/response.rb
|
57
|
+
- lib/mpi/verification/request.rb
|
58
|
+
- lib/mpi/verification/response.rb
|
59
|
+
- lib/mpi/verification.rb
|
60
|
+
- lib/mpi.rb
|
47
61
|
- lib/mpi_client.rb
|
48
|
-
- remote_spec/mpi_client_spec.rb
|
49
|
-
- spec/mpi_client_spec.rb
|
50
|
-
- spec/mpi_response_spec.rb
|
51
|
-
- spec/option_translator_spec.rb
|
52
62
|
has_rdoc: true
|
53
63
|
homepage: http://github.com/plashchynski/mpi_client/
|
54
64
|
licenses: []
|
@@ -73,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
83
|
requirements: []
|
74
84
|
|
75
85
|
rubyforge_project:
|
76
|
-
rubygems_version: 1.3.
|
86
|
+
rubygems_version: 1.3.4
|
77
87
|
signing_key:
|
78
88
|
specification_version: 3
|
79
89
|
summary: MPI client library
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/mpi_client.rb'
|
2
|
-
|
3
|
-
MPI_SERVER_URL = 'http://192.168.65.11/xml'
|
4
|
-
|
5
|
-
describe "MPIClient requests" do
|
6
|
-
before(:each) do
|
7
|
-
@mpi_client = MPIClient.new(MPI_SERVER_URL)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should create account, update, get_info and delete" do
|
11
|
-
options = {
|
12
|
-
:id => 'some id',
|
13
|
-
:site_name => 'site name',
|
14
|
-
:url => 'http://siteurl/',
|
15
|
-
:cert_subject => '*',
|
16
|
-
:acquirer_bin => '3213',
|
17
|
-
:country_code => '432',
|
18
|
-
:password => 'qwerty',
|
19
|
-
:directory_server_url => 'http://www.visa.com/ds/',
|
20
|
-
:brand => '1',
|
21
|
-
:response_url => 'http://www.response.com/gk/',
|
22
|
-
:client_url => 'http://www.client.com/',
|
23
|
-
:term_url => 'http://www.term.com/',
|
24
|
-
}
|
25
|
-
|
26
|
-
account_id = @mpi_client.create_account(options).account_id
|
27
|
-
|
28
|
-
options.merge!({:account_id => account_id, :site_name => 'new_site_name'})
|
29
|
-
|
30
|
-
@mpi_client.update_account(options).account_id.should == account_id
|
31
|
-
@mpi_client.get_account_info({ :account_id => account_id }).site_name.should == options[:site_name]
|
32
|
-
@mpi_client.delete_account({ :account_id => account_id }).account_id.should == account_id
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "card enrollment check" do
|
36
|
-
it "should return Y if card is enrolled" do
|
37
|
-
enrollment_response('4012001037141112').status.should == 'Y'
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should return N if card isn't enrolled" do
|
41
|
-
enrollment_response('4012001038443335').status.should == 'N'
|
42
|
-
end
|
43
|
-
|
44
|
-
def enrollment_response(card_number)
|
45
|
-
@mpi_client.enrolled({:account_id=> '0'*32, :card_number=> card_number})
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
data/spec/mpi_client_spec.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/mpi_client.rb'
|
2
|
-
|
3
|
-
describe "MPIClient" do
|
4
|
-
before(:each) do
|
5
|
-
@client = MPIClient.new('http://127.0.0.1/3ds/')
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "requests" do
|
9
|
-
it "should call submit_request and return it's result" do
|
10
|
-
response = MPIResponse.new({:account_id => 'b1adc7af83a302be94891cf17014c98a'})
|
11
|
-
options = mock
|
12
|
-
@client.should_receive(:submit_request).with(:create_account, options).and_return(response)
|
13
|
-
@client.create_account(options).should == response
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should prepare request data from request_type and options" do
|
18
|
-
options = { :merchant_id => 'one', :account_id => 'account id' }
|
19
|
-
request_type = :some_type
|
20
|
-
result = @client.send(:prepare_request_data, request_type, options)
|
21
|
-
result.should match %r{<REQUEST type="#{request_type}">}
|
22
|
-
|
23
|
-
options.each do |k,v|
|
24
|
-
key = OptionTranslator.to_server(k)
|
25
|
-
result.should match %r{<#{key}>#{v}</#{key}>}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should prepare transaction attributes" do
|
30
|
-
id = 10
|
31
|
-
result = @client.send(:prepare_request_data, 'any', {}, {:id => id} )
|
32
|
-
result.should match %r{<Transaction id="#{id}".?>}
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should parse input XML to MPIResponse and convert keys to client format" do
|
36
|
-
response = <<-RESPONSE
|
37
|
-
<REQUEST type=\"update_account\">
|
38
|
-
<Transaction>
|
39
|
-
<AccountId>9933fab999fd3fd0651df2c73bd6f12e</AccountId>
|
40
|
-
<Id>231</Id>
|
41
|
-
</Transaction>
|
42
|
-
</REQUEST>
|
43
|
-
RESPONSE
|
44
|
-
|
45
|
-
result = @client.send(:parse_response, response)
|
46
|
-
|
47
|
-
result.data.should == {
|
48
|
-
:account_id => '9933fab999fd3fd0651df2c73bd6f12e',
|
49
|
-
:merchant_id => '231'
|
50
|
-
}
|
51
|
-
result.should be_success
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should return not success response, when response data contain Error field." do
|
55
|
-
response = <<-RESPONSE
|
56
|
-
<REQUEST type=\"update_account\">
|
57
|
-
<Error code="C2">Format XML-request is not valid</Error>
|
58
|
-
</REQUEST>
|
59
|
-
RESPONSE
|
60
|
-
|
61
|
-
result = @client.send(:parse_response, response)
|
62
|
-
result.should_not be_success
|
63
|
-
result.error_message.should == 'Format XML-request is not valid'
|
64
|
-
result.error_code.should == 'C2'
|
65
|
-
end
|
66
|
-
end
|
data/spec/mpi_response_spec.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/mpi_client.rb'
|
2
|
-
|
3
|
-
describe "MPIResponse" do
|
4
|
-
it "should contain data" do
|
5
|
-
response_data = {:a => 1, :b => 2}
|
6
|
-
MPIResponse.new(response_data).data.should == response_data
|
7
|
-
end
|
8
|
-
|
9
|
-
describe "automatic accessors" do
|
10
|
-
it "should return 'data' hash value" do
|
11
|
-
response = MPIResponse.new({:status => 'Y'})
|
12
|
-
response.status.should == response.data[:status]
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should return nil if there is no value in 'data' hash" do
|
16
|
-
response = MPIResponse.new()
|
17
|
-
response.status.should be_nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "success?" do
|
22
|
-
it "should be true if error code and error message is nil" do
|
23
|
-
MPIResponse.new.should be_success
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should be false if error code or error message not nil" do
|
27
|
-
response = MPIResponse.new(:error_code => "C3", :error_message => 'Somthing went wrong.')
|
28
|
-
response.should_not be_success
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/mpi_client.rb'
|
2
|
-
|
3
|
-
describe "OptionTranslator" do
|
4
|
-
it "should translate options" do
|
5
|
-
{ :merchant_id => :Id,
|
6
|
-
:site_name => :Name,
|
7
|
-
:site_url => :URL,
|
8
|
-
:certificate_subject => :IP,
|
9
|
-
:acquirer_bin => :AcquirerBIN,
|
10
|
-
:country_code => :CountryCode,
|
11
|
-
:password => :Password,
|
12
|
-
:certificate => :PublicCertificate,
|
13
|
-
:private_key => :PrivateKey,
|
14
|
-
:directory_server_url => :DirectoryServerURL,
|
15
|
-
:brand => :CardType,
|
16
|
-
:response_url => :ResponseURL,
|
17
|
-
:client_url => :ClientURL,
|
18
|
-
:term_url => :TermURL,
|
19
|
-
:account_id => :AccountId
|
20
|
-
}.each do |client_option, server_option|
|
21
|
-
OptionTranslator.to_client(server_option).should == client_option
|
22
|
-
OptionTranslator.to_server(client_option).should == server_option
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|