banklink_lv 1.0.2 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f8ffa82dc6e5fb3d28a30670349fb52b6877c56a
4
- data.tar.gz: ff9dc27db51a21c0f8682e978feec47c2116dcb1
3
+ metadata.gz: 79927e13a0531a2f8a925c02f2293aaff508f521
4
+ data.tar.gz: 854372fbf7785d800510ece6905cd7db228fff0a
5
5
  SHA512:
6
- metadata.gz: fe37fe090c02338e868fc8b354414e67b322930f284495dd58527996584bafd8b6afc9c47c7d56a29c34d2bcb557159ebaefd555c75a10a5978d1860f4f792ba
7
- data.tar.gz: 7f4715437ccb1435c9de41e4d890079bbe4eaee68885c0b6f4c6b42b51141ab7cc000668d595eb7bb7ed9002e6a58e08a3101454f3e4cb15934db77388cb410b
6
+ metadata.gz: ba74084eae12f265fe8d78f1df15ccfdbcfb2d646f9572f3093d49404737464e9e804e3472fd87fab1f4dd94e74a01aef98583be440078ab5d25e57283596c04
7
+ data.tar.gz: 6405873656f0fe8261996335441a806c7685062b118cb137551e29adc06825e528db7613bf94eacb03f1157804c578f483a46c5f0475458031b3ff706d968384
data/.DS_Store CHANGED
Binary file
@@ -0,0 +1,19 @@
1
+ # Logfile created on 2014-12-10 20:23:24 +0200 by logger.rb/44203
2
+ I, [2014-12-10T20:23:24.263820 #22785] INFO -- : 0: rake (10.1.1) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/rake-10.1.1.gemspec
3
+ I, [2014-12-10T20:23:24.264734 #22785] INFO -- : 0: i18n (0.6.11) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/i18n-0.6.11.gemspec
4
+ I, [2014-12-10T20:23:24.265245 #22785] INFO -- : 0: minitest (4.7.5) from /Users/arturs/.rvm/rubies/ruby-2.1.0/lib/ruby/gems/2.1.0/specifications/default/minitest-4.7.5.gemspec
5
+ I, [2014-12-10T20:23:26.173103 #22785] INFO -- : 0: multi_json (1.10.1) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/multi_json-1.10.1.gemspec
6
+ I, [2014-12-10T20:23:26.173767 #22785] INFO -- : 0: thread_safe (0.3.4) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/thread_safe-0.3.4.gemspec
7
+ I, [2014-12-10T20:23:28.192576 #22785] INFO -- : 0: tzinfo (0.3.42) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/tzinfo-0.3.42.gemspec
8
+ I, [2014-12-10T20:23:30.218916 #22785] INFO -- : 0: activesupport (4.0.12) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/activesupport-4.0.12.gemspec
9
+ I, [2014-12-10T20:23:30.308160 #22785] INFO -- : 0: banklink_lv (1.1.1) from /Users/arturs/Workspace/banklink/banklink_lv.gemspec
10
+ I, [2014-12-10T20:23:30.308943 #22785] INFO -- : 0: bundler (1.5.1) from /Users/arturs/.rvm/gems/ruby-2.1.0@global/specifications/bundler-1.5.1.gemspec
11
+ I, [2014-12-10T20:28:40.066649 #22992] INFO -- : 0: rake (10.1.1) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/rake-10.1.1.gemspec
12
+ I, [2014-12-10T20:28:40.067241 #22992] INFO -- : 0: i18n (0.6.11) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/i18n-0.6.11.gemspec
13
+ I, [2014-12-10T20:28:40.067763 #22992] INFO -- : 0: minitest (4.7.5) from /Users/arturs/.rvm/rubies/ruby-2.1.0/lib/ruby/gems/2.1.0/specifications/default/minitest-4.7.5.gemspec
14
+ I, [2014-12-10T20:28:40.068278 #22992] INFO -- : 0: multi_json (1.10.1) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/multi_json-1.10.1.gemspec
15
+ I, [2014-12-10T20:28:40.068824 #22992] INFO -- : 0: thread_safe (0.3.4) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/thread_safe-0.3.4.gemspec
16
+ I, [2014-12-10T20:28:40.069371 #22992] INFO -- : 0: tzinfo (0.3.42) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/tzinfo-0.3.42.gemspec
17
+ I, [2014-12-10T20:28:40.069871 #22992] INFO -- : 0: activesupport (4.0.12) from /Users/arturs/.rvm/gems/ruby-2.1.0/specifications/activesupport-4.0.12.gemspec
18
+ I, [2014-12-10T20:28:40.143917 #22992] INFO -- : 0: banklink_lv (1.1.1) from /Users/arturs/Workspace/banklink/banklink_lv.gemspec
19
+ I, [2014-12-10T20:28:40.144331 #22992] INFO -- : 0: bundler (1.5.1) from /Users/arturs/.rvm/gems/ruby-2.1.0@global/specifications/bundler-1.5.1.gemspec
data/CHANGLOG.md ADDED
@@ -0,0 +1,12 @@
1
+ ## 1.1.1
2
+
3
+ ### Bug Fixes
4
+
5
+ * Rename <tt>reciever_name</tt> to <tt>receiver_name</tt>
6
+ * Rename <tt>reciever_bank_account</tt> to <tt>receiver_name</tt>
7
+
8
+ Also left old methods as alias. Will be removed in 1.2.0
9
+
10
+ ### Contributors
11
+
12
+ * Arturs Braucs
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
1
3
  # Specify your gem's dependencies in banklink.gemspec
2
4
  gemspec
data/Gemfile.lock CHANGED
@@ -1,29 +1,29 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- banklink_lv (1.0.2)
4
+ banklink_lv (1.1.1)
5
5
  activesupport
6
6
 
7
7
  GEM
8
+ remote: https://rubygems.org/
8
9
  specs:
9
- activesupport (4.0.2)
10
- i18n (~> 0.6, >= 0.6.4)
10
+ activesupport (4.0.12)
11
+ i18n (~> 0.6, >= 0.6.9)
11
12
  minitest (~> 4.2)
12
13
  multi_json (~> 1.3)
13
14
  thread_safe (~> 0.1)
14
15
  tzinfo (~> 0.3.37)
15
- atomic (1.1.14)
16
- i18n (0.6.9)
16
+ i18n (0.6.11)
17
17
  minitest (4.7.5)
18
- multi_json (1.8.4)
18
+ multi_json (1.10.1)
19
19
  rake (10.1.1)
20
- thread_safe (0.1.3)
21
- atomic
22
- tzinfo (0.3.38)
20
+ thread_safe (0.3.4)
21
+ tzinfo (0.3.42)
23
22
 
24
23
  PLATFORMS
25
24
  ruby
26
25
 
27
26
  DEPENDENCIES
28
27
  banklink_lv!
28
+ minitest
29
29
  rake
data/README.rdoc CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Payment system integration for Latvian banks what uses banklink API.
4
4
 
5
+ == Changes in 1.1.0
6
+
7
+ * Move Swedbank under Banklink::Swedbank (Please run tests and refacture)
8
+ * Add SEB banklink support
9
+
5
10
  == Changes in 1.0.0
6
11
 
7
12
  * No test keys and certificates options.
@@ -30,9 +35,17 @@ Insert this into your Gemfile
30
35
 
31
36
  Insert this in your config file:
32
37
 
33
- Swedbank.private_key = File.read("#{Rails.root}/path/to/your_private_key")
34
- Swedbank.bank_certificate = File.read("#{Rails.root}/path/to/bank_public_key")
35
- Swedbank.production_url = "https://ib.swedbank.lv/banklink"
38
+ ==== Swedbank
39
+
40
+ Banklink::Swedbank.private_key = File.read("#{Rails.root}/path/to/your_private_key")
41
+ Banklink::Swedbank.bank_certificate = File.read("#{Rails.root}/path/to/bank_public_key")
42
+ Banklink::Swedbank.production_url = "https://ib.swedbank.lv/banklink"
43
+
44
+ ==== SEB
45
+
46
+ Banklink::Seb.private_key = File.read("#{Rails.root}/path/to/your_private_key")
47
+ Banklink::Seb.bank_certificate = File.read("#{Rails.root}/path/to/bank_public_key")
48
+ Banklink::Seb.production_url = "https://ib.swedbank.lv/banklink"
36
49
 
37
50
  Helper for view:
38
51
 
@@ -42,11 +55,11 @@ Helper for view:
42
55
  options[:return] = 'http://yourapp.com/'
43
56
  options[:reference] = '454'
44
57
  options[:message] = 'Testing banklink'
45
- @helper = Banklink::Helper.new(TRANS_ID, YOUR_SENDER_ID, options)
58
+ @helper = Banklink::Swedbank.helper(TRANS_ID, YOUR_SENDER_ID, options) # OR Banklink::Seb.helper(TRANS_ID, YOUR_SENDER_ID, options)
46
59
 
47
60
  Then create Notification controller for notify. Then you can notify:
48
61
 
49
- notify = Banklink::Notification.new(request.raw_post)
62
+ notify = Banklink::Swedbank.notification(request.raw_post) # OR Banklink::Seb.notification(request.raw_post)
50
63
  @text
51
64
  if notify.acknowledge
52
65
  if notify.complete?
data/banklink_lv.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.rubyforge_project = "banklink_lv"
22
22
 
23
23
  s.add_development_dependency 'rake'
24
+ s.add_development_dependency 'minitest'
24
25
 
25
- s.add_dependency "activesupport"
26
+ s.add_dependency 'activesupport'
26
27
  end
data/lib/banklink.rb CHANGED
@@ -2,6 +2,7 @@ require 'banklink/version'
2
2
 
3
3
  require "base64"
4
4
  require "active_support/dependencies"
5
+ require "active_support/concern"
5
6
 
6
7
  require 'net/http'
7
8
  require 'net/https'
@@ -15,6 +16,5 @@ require 'cgi'
15
16
 
16
17
  require 'banklink/banklink'
17
18
  require 'banklink/base'
18
- require 'banklink/helper'
19
19
  require 'banklink/swedbank'
20
- require 'banklink/notification'
20
+ require 'banklink/seb'
Binary file
@@ -1,92 +1,5 @@
1
1
  module Banklink
2
2
 
3
- # Detect bank module from params
4
- #def self.get_class(params)
5
- # case params['VK_SND_ID']
6
- # when 'EYP' then SebEst
7
- # when 'SAMPOPANK' then SampoEst
8
- # when 'HP' then SwedbankEst
9
-
10
- # Swedbank uses same sender id for different countries, currently can't detect Lithuanian
11
- # use:
12
- # notify = Swedbank::Notification.new(params)
13
- #when 'HP' then Swedbank
14
-
15
- #when '70440' then SebLtu
16
- #when 'SMPOLT22' then DanskeLtu
17
- #when 'SNORLT22' then SnorasLtu
18
- #when '112029720' then DnbnordLtu
19
- #when '70100' then UbLtu
20
-
21
- # else raise(ArgumentError, "unknown sender id: #{params['VK_SND_ID']}")
22
- # end
23
- #end
24
-
25
- # Define required fields for each service message.
26
- # We need to know this in order to calculate VK_MAC
27
- # from a given hash of parameters.
28
- # Order of the parameters is important.
29
- mattr_accessor :required_service_params
30
- self.required_service_params = {
31
- 1001 => [
32
- 'VK_SERVICE',
33
- 'VK_VERSION',
34
- 'VK_SND_ID',
35
- 'VK_STAMP',
36
- 'VK_AMOUNT',
37
- 'VK_CURR',
38
- 'VK_ACC',
39
- 'VK_NAME',
40
- 'VK_REF',
41
- 'VK_MSG'],
42
- 1002 => [
43
- 'VK_SERVICE',
44
- 'VK_VERSION',
45
- 'VK_SND_ID',
46
- 'VK_STAMP',
47
- 'VK_AMOUNT',
48
- 'VK_CURR',
49
- 'VK_REF',
50
- 'VK_MSG' ],
51
- 1101 => [
52
- 'VK_SERVICE',
53
- 'VK_VERSION',
54
- 'VK_SND_ID',
55
- 'VK_REC_ID',
56
- 'VK_STAMP',
57
- 'VK_T_NO',
58
- 'VK_AMOUNT',
59
- 'VK_CURR',
60
- 'VK_REC_ACC',
61
- 'VK_REC_NAME',
62
- 'VK_SND_ACC',
63
- 'VK_SND_NAME',
64
- 'VK_REF',
65
- 'VK_MSG',
66
- 'VK_T_DATE'],
67
- 1201 => [
68
- 'VK_SERVICE',
69
- 'VK_VERSION',
70
- 'VK_SND_ID',
71
- 'VK_REC_ID',
72
- 'VK_STAMP',
73
- 'VK_AMOUNT',
74
- 'VK_CURR',
75
- 'VK_REC_ACC',
76
- 'VK_REC_NAME',
77
- 'VK_SND_ACC',
78
- 'VK_SND_NAME',
79
- 'VK_REF',
80
- 'VK_MSG'],
81
- 1901 => [
82
- 'VK_SERVICE',
83
- 'VK_VERSION',
84
- 'VK_SND_ID',
85
- 'VK_REC_ID',
86
- 'VK_STAMP',
87
- 'VK_REF',
88
- 'VK_MSG']
89
- }
90
3
 
91
4
  # Calculation using method VK_VERSION=008:
92
5
  # VK_MAC is RSA signature of the request fields coded into BASE64.
@@ -102,6 +15,7 @@ module Banklink
102
15
  # d is RSA secret exponent
103
16
  # n is RSA modulus
104
17
  module Common
18
+ extend ActiveSupport::Concern
105
19
  # p(x) is length of the field x represented by three digits
106
20
  def func_p(val)
107
21
  sprintf("%03i", val.length)
@@ -113,23 +27,37 @@ module Banklink
113
27
  # p(x) is length of the field x represented by three digits
114
28
  # Parameters val1, val2, value3 would be turned into:
115
29
  # '003val1003val2006value3'
116
- def generate_data_string(service_msg_number, sigparams)
30
+ def generate_data_string(service_msg_number, sigparams, required_service_params)
117
31
  str = ''
118
- Banklink.required_service_params[Integer(service_msg_number)].each do |param|
32
+ required_params = required_service_params[Integer(service_msg_number)] || required_service_params[service_msg_number]
33
+ required_params.each do |param|
119
34
  val = sigparams[param].to_s # nil goes to ''
120
35
  str << func_p(val) << val
121
36
  end
122
37
  str
123
38
  end
124
39
 
125
- def generate_signature(service_msg_number, sigparams)
126
- # privkey = self.class.parent.get_private_key
127
- privkey = Swedbank.get_private_key
128
- privkey.sign(OpenSSL::Digest::SHA1.new, generate_data_string(service_msg_number, sigparams))
40
+ def generate_signature(service_msg_number, sigparams, required_service_params)
41
+ privkey = self.class.parent.get_private_key
42
+ privkey.sign(OpenSSL::Digest::SHA1.new, generate_data_string(service_msg_number, sigparams, required_service_params))
43
+ end
44
+
45
+ def generate_mac(service_msg_number, sigparams, required_service_params)
46
+ Base64.encode64(generate_signature(service_msg_number, sigparams, required_service_params)).gsub(/\n/,'')
129
47
  end
130
48
 
131
- def generate_mac(service_msg_number, sigparams)
132
- Base64.encode64(generate_signature(service_msg_number, sigparams)).gsub(/\n/,'')
49
+ def encode_to_utf8 string
50
+ string.encode('UTF-8', :invalid => :replace, :replace => '').encode('UTF-8')
133
51
  end
52
+
53
+ # Take the posted data and move the relevant data into a hash
54
+ def parse(post)
55
+ @raw = post.to_s
56
+ for line in @raw.split('&')
57
+ key, value = *line.scan( %r{^([A-Za-z0-9_.]+)\=(.*)$} ).flatten
58
+ params[key] = CGI.unescape(value)
59
+ end
60
+ end
61
+
134
62
  end
135
63
  end
data/lib/banklink/base.rb CHANGED
@@ -5,5 +5,4 @@ class Hash
5
5
  end
6
6
 
7
7
  module Banklink
8
-
9
8
  end
@@ -0,0 +1,78 @@
1
+ require 'banklink/seb/helper'
2
+ require 'banklink/seb/notification'
3
+
4
+ module Banklink
5
+ module Seb
6
+
7
+ # Raw X509 certificate of the bank, string format.
8
+ mattr_accessor :bank_certificate
9
+ # RSA public key of the bank, taken from the X509 certificate of the bank. OpenSSL container.
10
+ def self.get_bank_public_key
11
+ cert = self.bank_certificate
12
+ # OpenSSL::X509::Certificate.new(cert.gsub(/ /, '')).public_key
13
+ OpenSSL::X509::Certificate.new(cert).public_key
14
+ end
15
+
16
+ mattr_accessor :private_key
17
+ # Our RSA private key. OpenSSL container.
18
+ def self.get_private_key
19
+ private_key = self.private_key
20
+ OpenSSL::PKey::RSA.new(private_key.gsub(/ /, ''))
21
+ end
22
+
23
+ mattr_accessor :service_url
24
+
25
+ def self.notification(post)
26
+ Notification.new(post)
27
+ end
28
+
29
+ def self.helper(order, account, options = {})
30
+ Helper.new(order, account, options)
31
+ end
32
+
33
+ # Define required fields for each service message.
34
+ # We need to know this in order to calculate VK_MAC
35
+ # from a given hash of parameters.
36
+ # Order of the parameters is important.
37
+ mattr_accessor :required_service_params
38
+ self.required_service_params = {
39
+ '0002' => [
40
+ 'IB_SND_ID',
41
+ 'IB_SERVICE',
42
+ 'IB_VERSION',
43
+ 'IB_AMOUNT',
44
+ 'IB_CURR',
45
+ 'IB_NAME',
46
+ 'IB_PAYMENT_ID',
47
+ 'IB_PAYMENT_DESC'
48
+ ],
49
+ '0003' => [
50
+ 'IB_SND_ID',
51
+ 'IB_SERVICE',
52
+ 'IB_VERSION',
53
+ 'IB_PAYMENT_ID',
54
+ 'IB_AMOUNT',
55
+ 'IB_CURR',
56
+ 'IB_REC_ID',
57
+ 'IB_REC_ACC',
58
+ 'IB_REC_NAME',
59
+ 'IB_PAYER_ACC',
60
+ 'IB_PAYER_NAME',
61
+ 'IB_PAYMENT_DESC',
62
+ 'IB_PAYMENT_DATE',
63
+ 'IB_PAYMENT_TIME'
64
+ ],
65
+ '0004' => [
66
+ 'IB_SND_ID',
67
+ 'IB_SERVICE',
68
+ 'IB_VERSION',
69
+ 'IB_REC_ID',
70
+ 'IB_PAYMENT_ID',
71
+ 'IB_PAYMENT_DESC',
72
+ 'IB_FROM_SERVER',
73
+ 'IB_STATUS'
74
+ ]
75
+ }
76
+
77
+ end
78
+ end
@@ -0,0 +1,102 @@
1
+ module Banklink #:nodoc:
2
+ module Seb
3
+ class Helper
4
+ attr_reader :fields
5
+ include Banklink::Common
6
+
7
+ def initialize(transaction, account, options = {})
8
+
9
+ @options = options
10
+ @fields = {}
11
+
12
+ @options['IB_SND_ID'] = account
13
+ @options['IB_PAYMENT_ID'] = transaction
14
+ @options['IB_AMOUNT'] = options[:amount]
15
+ @options['IB_CURR'] = options[:currency] || "EUR"
16
+ @options['IB_FEEDBACK'] = options[:return]
17
+ @options['IB_NAME'] = options[:name] || "Company"
18
+ @options['IB_PAYMENT_DESC'] = options[:message]
19
+ @options['IB_LANG'] = options[:lang] if options[:lang]
20
+
21
+ if options[:service_msg_number]
22
+ @service_msg_number = options.delete(:service_msg_number)
23
+ else
24
+ @service_msg_number = default_service_msg_number
25
+ end
26
+
27
+ add_required_params
28
+ add_ib_crc
29
+
30
+ add_lang_field
31
+ add_return_url_field
32
+ end
33
+
34
+
35
+ def form_fields
36
+ @fields
37
+ end
38
+
39
+ def self.mapping(attribute, options = {})
40
+ self.mappings ||= {}
41
+ self.mappings[attribute] = options
42
+ end
43
+
44
+ def add_field(name, value)
45
+ return if name.blank? || value.blank?
46
+ @fields[name.to_s] = value.to_s
47
+ end
48
+
49
+ def add_ib_crc
50
+ # Signature used to validate previous parameters
51
+ add_field('IB_CRC', generate_mac(@service_msg_number, form_fields, Seb.required_service_params))
52
+ end
53
+
54
+ def add_return_url_field
55
+ add_field('IB_FEEDBACK', @options['IB_FEEDBACK'])
56
+ end
57
+
58
+ def add_lang_field
59
+ if @options['IB_LANG']
60
+ add_field(ib_lang_param, @options['IB_LANG'])
61
+ else
62
+ add_field ib_lang_param, ib_lang
63
+ end
64
+ end
65
+
66
+ def add_required_params
67
+ required_params = Seb.required_service_params[@service_msg_number]
68
+ required_params.each do |param|
69
+ param_value = (@options.delete(param) || send(param.to_s.downcase)).to_s
70
+ add_field param, encode_to_utf8(param_value)
71
+ end
72
+ end
73
+
74
+ def ib_lang
75
+ 'LAT'
76
+ end
77
+
78
+ def ib_lang_param
79
+ 'IB_LANG'
80
+ end
81
+
82
+ def ib_service
83
+ @service_msg_number
84
+ end
85
+
86
+ def ib_version
87
+ '001'
88
+ end
89
+
90
+ def redirect_url
91
+ Seb.service_url
92
+ end
93
+
94
+ # Default service message number.
95
+ # Use '0002' because it requires the least amount of parameters.
96
+ def default_service_msg_number
97
+ "0002"
98
+ end
99
+
100
+ end
101
+ end
102
+ end