sermepa_web_tpv 0.0.2 → 0.1.0
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.
- checksums.yaml +7 -0
- data/README.md +3 -2
- data/lib/sermepa_web_tpv.rb +4 -0
- data/lib/sermepa_web_tpv/request.rb +36 -30
- data/lib/sermepa_web_tpv/response.rb +26 -15
- data/lib/sermepa_web_tpv/signature.rb +46 -0
- data/lib/sermepa_web_tpv/version.rb +1 -1
- metadata +36 -33
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cea5def5710b4a30eaf4e4132c73897b4cb717aa
|
4
|
+
data.tar.gz: 0980e6c6776408beac945ba5e9b147869fef9fbf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b8ce025ec8bfa7e0bc1720323f4a5b98da8584ea1fb6a505acc1eea731cbded29805680fa59ca8becc6a5bfe40a58f47cb4ff034e4b4906cab131ae65700e49b
|
7
|
+
data.tar.gz: 29be593d02f6ef515ee2e396171e4359b2f9fdde8f66e9d496d034e73dc8a5c7a09cd48ecb94e9b653cd90e8316a54e64ccb8d285e7bc80e8664461818840723
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Sermepa web TPV
|
2
2
|
|
3
|
-
Add simple web payment tpv to your rails application
|
3
|
+
Add simple web payment tpv to your rails application. This version is compliance with new hmac 256 signature. For older sha1 signature use version 0.0.2.
|
4
4
|
|
5
5
|
Example app source at: https://github.com/ritxi/sermepa_web_tpv_sample_app
|
6
6
|
|
@@ -24,7 +24,7 @@ Steps to use it:
|
|
24
24
|
module MyApp
|
25
25
|
class Application < Rails::Application
|
26
26
|
config.web_tpv.bank_url = 'https://sis-t.sermepa.es:25443/sis/realizarPago'
|
27
|
-
config.web_tpv.response_host = 'my_application_host.com'
|
27
|
+
config.web_tpv.response_host = 'https://my_application_host.com'
|
28
28
|
config.web_tpv.merchant_code = '000000000'
|
29
29
|
config.web_tpv.terminal = 1
|
30
30
|
config.web_tpv.callback_response_path = '/payments/validate'
|
@@ -36,6 +36,7 @@ module MyApp
|
|
36
36
|
config.web_tpv.transaction_type = 0
|
37
37
|
config.web_tpv.language = '003' #Catala
|
38
38
|
config.web_tpv.merchant_name = 'MY MERCHANT NAME'
|
39
|
+
config.web_tpv.pay_methods = 'C' # Only credit card
|
39
40
|
end
|
40
41
|
end
|
41
42
|
```
|
data/lib/sermepa_web_tpv.rb
CHANGED
@@ -42,8 +42,12 @@ module SermepaWebTpv
|
|
42
42
|
mattr_accessor :redirect_failure_path
|
43
43
|
@@redirect_failure_path = nil #"/payments/failure"
|
44
44
|
|
45
|
+
mattr_accessor :pay_methods
|
46
|
+
@@pay_methods = '' # 'C' for credit card only (see official doc)
|
47
|
+
|
45
48
|
autoload :Request, 'sermepa_web_tpv/request'
|
46
49
|
autoload :Response, 'sermepa_web_tpv/response'
|
50
|
+
autoload :Signature, 'sermepa_web_tpv/signature'
|
47
51
|
|
48
52
|
end
|
49
53
|
require 'sermepa_web_tpv/persistence/active_record'
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'uri'
|
2
|
-
require 'digest/sha1'
|
3
2
|
|
4
3
|
module SermepaWebTpv
|
5
4
|
class Request < Struct.new(:transaction, :description)
|
@@ -9,38 +8,45 @@ module SermepaWebTpv
|
|
9
8
|
SermepaWebTpv.bank_url
|
10
9
|
end
|
11
10
|
|
12
|
-
def options
|
13
|
-
optional_options.merge(must_options)
|
14
|
-
end
|
15
|
-
|
16
11
|
def transact(&block)
|
17
12
|
generate_transaction_number!
|
18
13
|
yield(transaction)
|
19
|
-
|
14
|
+
transaction
|
20
15
|
end
|
21
16
|
|
22
|
-
|
17
|
+
def options
|
18
|
+
optional_options.merge(must_options)
|
19
|
+
end
|
23
20
|
|
24
|
-
def
|
25
|
-
|
21
|
+
def merchant_parameters_json
|
22
|
+
options.to_json
|
26
23
|
end
|
27
24
|
|
28
|
-
def
|
29
|
-
|
25
|
+
def merchant_parameters
|
26
|
+
Base64.urlsafe_encode64(
|
27
|
+
merchant_parameters_json).split("\n").join('')
|
30
28
|
end
|
31
29
|
|
32
|
-
def
|
33
|
-
|
30
|
+
def params
|
31
|
+
{
|
32
|
+
'Ds_SignatureVersion' => 'HMAC_SHA256_V1',
|
33
|
+
'Ds_MerchantParameters' => merchant_parameters,
|
34
|
+
'Ds_Signature' => signature
|
35
|
+
}
|
36
|
+
end
|
37
|
+
private
|
38
|
+
|
39
|
+
def signature
|
40
|
+
@signature ||= Signature.new(self).signature
|
34
41
|
end
|
35
42
|
|
36
43
|
def must_options
|
37
44
|
{
|
38
45
|
'Ds_Merchant_Amount' => amount,
|
39
|
-
'Ds_Merchant_Currency' => SermepaWebTpv.currency, #EURO
|
40
46
|
'Ds_Merchant_Order' => transaction_number,
|
41
47
|
'Ds_Merchant_ProductDescription' => description,
|
48
|
+
'Ds_Merchant_Currency' => SermepaWebTpv.currency,
|
42
49
|
'Ds_Merchant_MerchantCode' => SermepaWebTpv.merchant_code,
|
43
|
-
'Ds_Merchant_MerchantSignature' => signature,
|
44
50
|
'Ds_Merchant_Terminal' => SermepaWebTpv.terminal,
|
45
51
|
'Ds_Merchant_TransactionType' => SermepaWebTpv.transaction_type,
|
46
52
|
'Ds_Merchant_ConsumerLanguage' => SermepaWebTpv.language,
|
@@ -48,16 +54,6 @@ module SermepaWebTpv
|
|
48
54
|
}
|
49
55
|
end
|
50
56
|
|
51
|
-
def signature
|
52
|
-
#Ds_Merchant_Amount + Ds_Merchant_Order +Ds_Merchant_MerchantCode + Ds_Merchant_Currency +Ds_Merchant_TransactionType + Ds_Merchant_MerchantURL + CLAVE SECRETA
|
53
|
-
merchant_code = SermepaWebTpv.merchant_code
|
54
|
-
currency = SermepaWebTpv.currency
|
55
|
-
transaction_type = SermepaWebTpv.transaction_type
|
56
|
-
callback_url = url_for(:callback_response_path)
|
57
|
-
merchant_secret_key = SermepaWebTpv.merchant_secret_key
|
58
|
-
Digest::SHA1.hexdigest("#{amount}#{transaction_number}#{merchant_code}#{currency}#{transaction_type}#{callback_url}#{merchant_secret_key}").upcase
|
59
|
-
end
|
60
|
-
|
61
57
|
# Available options
|
62
58
|
# redirect_success_path
|
63
59
|
# redirect_failure_path
|
@@ -66,19 +62,29 @@ module SermepaWebTpv
|
|
66
62
|
host = SermepaWebTpv.response_host
|
67
63
|
path = SermepaWebTpv.send(option)
|
68
64
|
|
69
|
-
if host.present?
|
70
|
-
|
71
|
-
end
|
65
|
+
return if !host.present? || !path.present?
|
66
|
+
URI.join(host, path).to_s
|
72
67
|
end
|
73
68
|
|
74
69
|
def optional_options
|
75
70
|
{
|
76
71
|
'Ds_Merchant_Titular' => SermepaWebTpv.merchant_name,
|
77
72
|
'Ds_Merchant_UrlKO' => url_for(:redirect_failure_path),
|
78
|
-
'Ds_Merchant_UrlOK' => url_for(:redirect_success_path)
|
79
|
-
|
73
|
+
'Ds_Merchant_UrlOK' => url_for(:redirect_success_path),
|
74
|
+
'Ds_Merchant_PayMethods' => SermepaWebTpv.pay_methods
|
75
|
+
}.delete_if { |_key, value| value.blank? }
|
76
|
+
end
|
77
|
+
|
78
|
+
def transaction_number_attribute
|
79
|
+
SermepaWebTpv.transaction_model_transaction_number_attribute
|
80
80
|
end
|
81
81
|
|
82
|
+
def transaction_model_amount_attribute
|
83
|
+
SermepaWebTpv.transaction_model_amount_attribute
|
84
|
+
end
|
82
85
|
|
86
|
+
def amount
|
87
|
+
(transaction_amount * 100).to_i.to_s
|
88
|
+
end
|
83
89
|
end
|
84
90
|
end
|
@@ -1,26 +1,37 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
|
3
3
|
module SermepaWebTpv
|
4
|
-
|
4
|
+
BASE = Struct.new(:params) unless defined?(BASE)
|
5
|
+
class Response < BASE
|
6
|
+
def transaction_number
|
7
|
+
merchant_parameters_hash['Ds_Order']
|
8
|
+
end
|
9
|
+
|
10
|
+
|
5
11
|
def valid?
|
6
|
-
params[
|
12
|
+
params['Ds_Signature'] == signature
|
7
13
|
end
|
8
14
|
|
9
15
|
def success?
|
10
|
-
|
16
|
+
merchant_parameters_hash['Ds_Response'].to_i == 0
|
11
17
|
end
|
12
18
|
|
13
|
-
private
|
14
19
|
def signature
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
Signature.new(self).signature
|
21
|
+
end
|
22
|
+
|
23
|
+
def merchant_parameters
|
24
|
+
params['Ds_MerchantParameters']
|
25
|
+
end
|
26
|
+
|
27
|
+
def merchant_paramters_json
|
28
|
+
@merchant_paramters_json ||=
|
29
|
+
Base64.urlsafe_decode64(merchant_parameters)
|
30
|
+
end
|
31
|
+
|
32
|
+
def merchant_parameters_hash
|
33
|
+
@merchant_parameters_hash ||=
|
34
|
+
JSON.parse(merchant_paramters_json)
|
24
35
|
end
|
25
36
|
end
|
26
|
-
end
|
37
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'openssl'
|
3
|
+
require 'mcrypt'
|
4
|
+
|
5
|
+
module SermepaWebTpv
|
6
|
+
class Signature
|
7
|
+
include SermepaWebTpv::Persistence::ActiveRecord
|
8
|
+
|
9
|
+
attr_reader :action
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def iv
|
13
|
+
# "\x00\x00\x00\x00\x00\x00\x00\x00"
|
14
|
+
0.chr * 8
|
15
|
+
end
|
16
|
+
|
17
|
+
def merchant_key
|
18
|
+
Base64.decode64(SermepaWebTpv.merchant_secret_key)
|
19
|
+
end
|
20
|
+
|
21
|
+
def cipher
|
22
|
+
@cipher ||= Mcrypt.new(:tripledes, :cbc, merchant_key,
|
23
|
+
iv, :zeros)
|
24
|
+
end
|
25
|
+
|
26
|
+
def digestor
|
27
|
+
@digestor ||= OpenSSL::Digest.new('sha256')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(action)
|
32
|
+
@action = action
|
33
|
+
end
|
34
|
+
|
35
|
+
def signature
|
36
|
+
Base64.encode64(
|
37
|
+
OpenSSL::HMAC.digest(self.class.digestor, key,
|
38
|
+
action.merchant_parameters))
|
39
|
+
.strip
|
40
|
+
end
|
41
|
+
|
42
|
+
def key
|
43
|
+
self.class.cipher.encrypt(action.transaction_number)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,94 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sermepa_web_tpv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ricard Forniol Agustí
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-11-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rails
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ruby-mcrypt
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
28
39
|
- !ruby/object:Gem::Version
|
29
40
|
version: '0'
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: sqlite3
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - ">="
|
36
46
|
- !ruby/object:Gem::Version
|
37
47
|
version: '0'
|
38
48
|
type: :development
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - ">="
|
44
53
|
- !ruby/object:Gem::Version
|
45
54
|
version: '0'
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
56
|
name: rspec-rails
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
|
-
- -
|
59
|
+
- - ">="
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - ">="
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: fuubar
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- -
|
73
|
+
- - ">="
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: '0'
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- -
|
80
|
+
- - ">="
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '0'
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: nyan-cat-formatter
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - ">="
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
description: Simple rails engine to add payments to your web application using sermepa
|
@@ -99,38 +102,38 @@ executables: []
|
|
99
102
|
extensions: []
|
100
103
|
extra_rdoc_files: []
|
101
104
|
files:
|
105
|
+
- MIT-LICENSE
|
106
|
+
- README.md
|
107
|
+
- Rakefile
|
108
|
+
- lib/sermepa_web_tpv.rb
|
102
109
|
- lib/sermepa_web_tpv/persistence/active_record.rb
|
103
110
|
- lib/sermepa_web_tpv/railtie.rb
|
104
111
|
- lib/sermepa_web_tpv/request.rb
|
105
112
|
- lib/sermepa_web_tpv/response.rb
|
113
|
+
- lib/sermepa_web_tpv/signature.rb
|
106
114
|
- lib/sermepa_web_tpv/version.rb
|
107
|
-
- lib/sermepa_web_tpv.rb
|
108
115
|
- lib/tasks/sermepa_web_tpv.rake
|
109
|
-
- MIT-LICENSE
|
110
|
-
- Rakefile
|
111
|
-
- README.md
|
112
116
|
homepage: http://github.com/ritxi/sermepa_web_tpv
|
113
117
|
licenses: []
|
118
|
+
metadata: {}
|
114
119
|
post_install_message:
|
115
120
|
rdoc_options: []
|
116
121
|
require_paths:
|
117
122
|
- lib
|
118
123
|
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
124
|
requirements:
|
121
|
-
- -
|
125
|
+
- - ">="
|
122
126
|
- !ruby/object:Gem::Version
|
123
127
|
version: '0'
|
124
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
129
|
requirements:
|
127
|
-
- -
|
130
|
+
- - ">="
|
128
131
|
- !ruby/object:Gem::Version
|
129
132
|
version: '0'
|
130
133
|
requirements: []
|
131
134
|
rubyforge_project:
|
132
|
-
rubygems_version:
|
135
|
+
rubygems_version: 2.4.5
|
133
136
|
signing_key:
|
134
|
-
specification_version:
|
137
|
+
specification_version: 4
|
135
138
|
summary: Add simple web tpv from sermepa to your rails application
|
136
139
|
test_files: []
|