datatrans 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.markdown +40 -0
- data/Rakefile +1 -0
- data/datatrans.gemspec +23 -0
- data/lib/datatrans.rb +47 -0
- data/lib/datatrans/notification.rb +81 -0
- data/lib/datatrans/transaction.rb +79 -0
- data/lib/datatrans/version.rb +3 -0
- metadata +86 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
Datatrans
|
2
|
+
=========
|
3
|
+
|
4
|
+
Ruby adapter for the Datatrans payment gateway (http://www.datatrans.ch).
|
5
|
+
|
6
|
+
Usage
|
7
|
+
=====
|
8
|
+
|
9
|
+
Configuration
|
10
|
+
-------------
|
11
|
+
|
12
|
+
Datatrans.configure do |config|
|
13
|
+
config.merchant_id = '1234567'
|
14
|
+
config.sign_key = '...'
|
15
|
+
config.environment = :production
|
16
|
+
end
|
17
|
+
|
18
|
+
Possible values for the environment: `:production`, `:development`
|
19
|
+
|
20
|
+
Controller
|
21
|
+
----------
|
22
|
+
|
23
|
+
TODO
|
24
|
+
|
25
|
+
View
|
26
|
+
----
|
27
|
+
|
28
|
+
TODO
|
29
|
+
|
30
|
+
Credits
|
31
|
+
=======
|
32
|
+
|
33
|
+
Datatrans is maintained by Simplificator GmbH (http://simplificator.com).
|
34
|
+
|
35
|
+
The initial development was sponsered by Evita AG and Limmex AG.
|
36
|
+
|
37
|
+
License
|
38
|
+
=======
|
39
|
+
|
40
|
+
Datatrans is released under the MIT license.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/datatrans.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "datatrans/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "datatrans"
|
7
|
+
s.version = Datatrans::VERSION
|
8
|
+
s.authors = ["Tobias Miesel", "Thomas Maurer"]
|
9
|
+
s.email = ["tobias.miesel@simplificator.com", "thomas.maurer@simplificator.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Datatrans Integration for Ruby on Rails}
|
12
|
+
s.description = %q{Datatrans Integration for Ruby on Rails}
|
13
|
+
|
14
|
+
s.rubyforge_project = "datatrans"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency 'httparty'
|
22
|
+
s.add_dependency 'activesupport', '>= 3.0.0'
|
23
|
+
end
|
data/lib/datatrans.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Datatrans
|
2
|
+
BASE_URL = 'https://payment.datatrans.biz'
|
3
|
+
WEB_AUTHORIZE_URL = "#{BASE_URL}/upp/jsp/upStart.jsp"
|
4
|
+
XML_AUTHORIZE_URL = "#{BASE_URL}/upp/jsp/XML_authorize.jsp"
|
5
|
+
XML_SETTLEMENT_URL = "#{BASE_URL}/upp/jsp/XML_processor.jsp"
|
6
|
+
|
7
|
+
TEST_BASE_URL = 'https://pilot.datatrans.biz'
|
8
|
+
TEST_WEB_AUTHORIZE_URL = "#{TEST_BASE_URL}/upp/jsp/upStart.jsp"
|
9
|
+
TEST_XML_AUTHORIZE_URL = "#{TEST_BASE_URL}/upp/jsp/XML_authorize.jsp"
|
10
|
+
TEST_XML_SETTLEMENT_URL = "#{TEST_BASE_URL}/upp/jsp/XML_processor.jsp"
|
11
|
+
|
12
|
+
mattr_accessor :merchant_id
|
13
|
+
mattr_accessor :sign_key
|
14
|
+
|
15
|
+
mattr_reader :base_url
|
16
|
+
mattr_reader :web_authorize_url
|
17
|
+
mattr_reader :xml_authorize_url
|
18
|
+
mattr_reader :xml_settlement_url
|
19
|
+
|
20
|
+
def self.configure
|
21
|
+
self.environment = :development # default
|
22
|
+
yield self
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.environment=(environment)
|
26
|
+
case environment
|
27
|
+
when :development
|
28
|
+
@@base_url = TEST_BASE_URL
|
29
|
+
@@web_authorize_url = TEST_WEB_AUTHORIZE_URL
|
30
|
+
@@xml_authorize_url = TEST_XML_AUTHORIZE_URL
|
31
|
+
@@xml_settlement_url = TEST_XML_SETTLEMENT_URL
|
32
|
+
when :production
|
33
|
+
@@base_url = BASE_URL
|
34
|
+
@@web_authorize_url = WEB_AUTHORIZE_URL
|
35
|
+
@@xml_authorize_url = XML_AUTHORIZE_URL
|
36
|
+
@@xml_settlement_url = XML_SETTLEMENT_URL
|
37
|
+
else
|
38
|
+
raise "Unknown environment '#{environment}'. Available: :development, :production."
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
require 'datatrans/version'
|
44
|
+
require 'datatrans/notification'
|
45
|
+
require 'datatrans/transaction'
|
46
|
+
|
47
|
+
ActionView::Base.send :include, Datatrans::Notification::ViewHelper if defined? ActionView
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Datatrans::Notification
|
2
|
+
class InvalidSignatureError < StandardError; end
|
3
|
+
|
4
|
+
class Base
|
5
|
+
attr_reader :params
|
6
|
+
|
7
|
+
def initialize(params)
|
8
|
+
raise 'Please define Datatrans.sign_key!' unless Datatrans.sign_key.present?
|
9
|
+
|
10
|
+
params = params.to_hash
|
11
|
+
params.symbolize_keys!
|
12
|
+
params.reverse_merge!({ :reqtype => 'NOA', :useAlias => 'Yes', :hiddenMode => 'Yes' })
|
13
|
+
@params = params
|
14
|
+
end
|
15
|
+
|
16
|
+
def reference_number
|
17
|
+
params[:refno]
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def sign(*fields)
|
23
|
+
key = Datatrans.sign_key.split(/([a-f0-9][a-f0-9])/).reject(&:empty?)
|
24
|
+
key = key.pack("H*" * key.size)
|
25
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::MD5.new, key, fields.join)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Request < Base
|
30
|
+
def signature
|
31
|
+
sign(Datatrans.merchant_id, params[:amount], params[:currency], params[:refno])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Response < Base
|
36
|
+
def valid_signature?
|
37
|
+
sign(Datatrans.merchant_id, params[:amount], params[:currency], params[:uppTransactionId]) == params[:sign2]
|
38
|
+
end
|
39
|
+
|
40
|
+
def transaction_id
|
41
|
+
params[:uppTransactionId]
|
42
|
+
end
|
43
|
+
|
44
|
+
def creditcard_alias
|
45
|
+
params[:aliasCC]
|
46
|
+
end
|
47
|
+
|
48
|
+
def payment_method
|
49
|
+
params[:pmethod]
|
50
|
+
end
|
51
|
+
|
52
|
+
def success?
|
53
|
+
params[:status] == 'success'
|
54
|
+
end
|
55
|
+
|
56
|
+
def cancel?
|
57
|
+
params[:status] == 'cancel'
|
58
|
+
end
|
59
|
+
|
60
|
+
def error?
|
61
|
+
params[:status] == 'error'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
module ViewHelper
|
66
|
+
def datatrans_notification_request_hidden_fields(request)
|
67
|
+
[
|
68
|
+
hidden_field_tag(:merchantId, Datatrans.merchant_id),
|
69
|
+
hidden_field_tag(:hiddenMode, request.params[:hiddenMode]),
|
70
|
+
hidden_field_tag(:reqtype, request.params[:reqtype]),
|
71
|
+
hidden_field_tag(:amount, request.params[:amount]),
|
72
|
+
hidden_field_tag(:currency, request.params[:currency]),
|
73
|
+
hidden_field_tag(:useAlias, request.params[:useAlias]),
|
74
|
+
hidden_field_tag(:sign, request.signature),
|
75
|
+
hidden_field_tag(:refno, request.params[:refno]),
|
76
|
+
hidden_field_tag(:uppCustomerName, request.params[:uppCustomerName]),
|
77
|
+
hidden_field_tag(:uppCustomerEmail, request.params[:uppCustomerEmail])
|
78
|
+
].join.html_safe
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
class Datatrans::Transaction
|
4
|
+
include HTTParty
|
5
|
+
|
6
|
+
attr_reader :params
|
7
|
+
|
8
|
+
def initialize(params)
|
9
|
+
@params = params.symbolize_keys
|
10
|
+
end
|
11
|
+
|
12
|
+
def authorize
|
13
|
+
@response = self.class.post(Datatrans.xml_authorize_url,
|
14
|
+
:headers => { 'Content-Type' => 'text/xml' },
|
15
|
+
:body => build_authorize_request.to_s).parsed_response
|
16
|
+
end
|
17
|
+
|
18
|
+
def capture
|
19
|
+
@response = self.class.post(Datatrans.xml_settlement_url,
|
20
|
+
:headers => { 'Content-Type' => 'text/xml' },
|
21
|
+
:body => build_capture_request.to_s).parsed_response
|
22
|
+
end
|
23
|
+
|
24
|
+
def void
|
25
|
+
@response = self.class.post(Datatrans.xml_settlement_url,
|
26
|
+
:headers => { 'Content-Type' => 'text/xml' },
|
27
|
+
:body => build_void_request.to_s).parsed_response
|
28
|
+
end
|
29
|
+
|
30
|
+
def success?
|
31
|
+
@response['paymentService']['body']['transaction']['response'].present? rescue false
|
32
|
+
end
|
33
|
+
|
34
|
+
def error?
|
35
|
+
@response['paymentService']['body']['transaction']['error'].present? rescue false
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def build_xml_request(service)
|
41
|
+
xml = Builder::XmlMarkup.new
|
42
|
+
xml.instruct!
|
43
|
+
xml.tag! "#{service}Service", :version => 1 do
|
44
|
+
xml.body :merchantId => Datatrans.merchant_id do |body|
|
45
|
+
xml.transaction :refno => params[:refno] do
|
46
|
+
xml.request do
|
47
|
+
yield body
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
xml.target!
|
53
|
+
end
|
54
|
+
|
55
|
+
def build_authorize_request
|
56
|
+
build_xml_request(:authorization) do |xml|
|
57
|
+
xml.amount params[:amount]
|
58
|
+
xml.currency params[:currency]
|
59
|
+
xml.aliasCC params[:aliasCC]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_capture_request
|
64
|
+
build_xml_request(:payment) do |xml|
|
65
|
+
xml.amount params[:amount]
|
66
|
+
xml.currency params[:currency]
|
67
|
+
xml.uppTransactionId params[:transaction_id]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def build_void_request
|
72
|
+
build_xml_request(:payment) do |xml|
|
73
|
+
xml.amount params[:amount]
|
74
|
+
xml.currency params[:currency]
|
75
|
+
xml.uppTransactionId params[:transaction_id]
|
76
|
+
xml.reqtype 'DOA'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: datatrans
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tobias Miesel
|
9
|
+
- Thomas Maurer
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
|
14
|
+
date: 2011-07-07 00:00:00 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: httparty
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 3.0.0
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
description: Datatrans Integration for Ruby on Rails
|
39
|
+
email:
|
40
|
+
- tobias.miesel@simplificator.com
|
41
|
+
- thomas.maurer@simplificator.com
|
42
|
+
executables: []
|
43
|
+
|
44
|
+
extensions: []
|
45
|
+
|
46
|
+
extra_rdoc_files: []
|
47
|
+
|
48
|
+
files:
|
49
|
+
- .gitignore
|
50
|
+
- Gemfile
|
51
|
+
- README.markdown
|
52
|
+
- Rakefile
|
53
|
+
- datatrans.gemspec
|
54
|
+
- lib/datatrans.rb
|
55
|
+
- lib/datatrans/notification.rb
|
56
|
+
- lib/datatrans/transaction.rb
|
57
|
+
- lib/datatrans/version.rb
|
58
|
+
homepage: ""
|
59
|
+
licenses: []
|
60
|
+
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0"
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "0"
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project: datatrans
|
81
|
+
rubygems_version: 1.7.2
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: Datatrans Integration for Ruby on Rails
|
85
|
+
test_files: []
|
86
|
+
|