bank_audi 1.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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.swp
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in bank_audi.gemspec
4
+ gemspec
5
+
6
+ gem 'rspec'
7
+ gem 'active_support'
@@ -0,0 +1,27 @@
1
+ BANK AUDI
2
+ =========
3
+
4
+ Bank Audi is the largest bank of Lebanon. This gem help to integrate with bank system
5
+ (Audi Virtual Payment Client. It is similiar to PayPal)
6
+
7
+ MAIN STEPS
8
+ ----------
9
+
10
+ 1. Merchant Form Submission
11
+ 2. Pre-Payment Process
12
+ 3. Payment Process
13
+ 4. Merchant Response Code
14
+
15
+
16
+ BASIC MOMENTS
17
+ -------------
18
+
19
+ 1. Request create `BankAudi::Request.new(attributes)`.
20
+ 2. Attributes as secret_code, access_code, merchant, url (where you create request) you
21
+ should set in config/bank_audi.yml
22
+ 3. You should set :merchant_txn_ref, order_info, amount & return_url
23
+ 4. You can update update request `request.attributes = {}; request.amount = 100;`
24
+ 5. Get request url (with params) `request.full_url`
25
+ 6. Response create `BankAudi::Response.new(attributes)`
26
+ 7. Check valid of response `response.valid?` (The invalid reason are bad secure hash & bad response code)
27
+ 8. You can get messafe of errors if your object (request or response) is invalid? `object.errors`
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "bank_audi/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "bank_audi"
7
+ s.version = BankAudi::VERSION
8
+ s.authors = ["m.yermolovich"]
9
+ s.email = ["m.yermolovich@dev1team.net"]
10
+ s.homepage = ""
11
+ s.summary = %q{BANK AUDI (operations with money)}
12
+ s.description = %q{
13
+ Bank Audi is Lebanon's largest bank.
14
+ And this gem created to help some
15
+ make money transactions & integration
16
+ with its system.
17
+ }
18
+
19
+ s.rubyforge_project = "bank_audi"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
24
+ s.require_paths = ["lib"]
25
+
26
+ # specify any dependencies here; for example:
27
+ # s.add_development_dependency "rspec"
28
+ # s.add_runtime_dependency "rest-client"
29
+ end
@@ -0,0 +1,4 @@
1
+ secret_code: XXXXXX
2
+ access_code: XXXXXX
3
+ merchant: XXXXXX
4
+ url: 'https://gw1.audicards.com/TPGWeb/payment/prepayment.action'
@@ -0,0 +1,137 @@
1
+ require "bank_audi/version"
2
+ require 'active_support/all'
3
+ require 'yaml'
4
+ require 'cgi'
5
+
6
+ module BankAudi
7
+ OPTIONS = YAML.load_file('config/bank_audi.yml')
8
+
9
+ class Request
10
+ attr_reader :secret_code, :access_code, :merchant, :url, :errors
11
+ attr_accessor :merchant_txn_ref, :order_info, :amount, :return_url
12
+ alias :merchant_id :merchant
13
+
14
+ def initialize(options = {})
15
+ @secret_code, @access_code, @merchant, @url =
16
+ OPTIONS['secret_code'], OPTIONS['access_code'], OPTIONS['merchant'], OPTIONS['url']
17
+ @merchant_txn_ref, @order_info, @amount, @return_url =
18
+ options[:merchant_txn_ref], options[:order_info], options[:amount], options[:return_url]
19
+ end
20
+
21
+ def valid?
22
+ @errors = {}
23
+ attributes_names.each do |attribute|
24
+ if self.send(attribute).blank?
25
+ @errors[attribute] = "can't be blank"
26
+ return false
27
+ end
28
+ end
29
+ end
30
+
31
+ def invalid?
32
+ !valid?
33
+ end
34
+
35
+ def full_url
36
+ return nil if invalid?
37
+ params = String.new
38
+ { 'accessCode' => @access_code, 'merchTxnRef' => @merchant_txn_ref, 'merchant' => @merchant,
39
+ 'orderInfo' => @order_info, 'amount' => @amount, 'returnURL' => @return_url }.each do |name, value|
40
+ params << '&' if params.present?
41
+ params << (CGI::escape(name) + '=' + CGI::escape(value.to_s))
42
+ end
43
+ params << '&vpc_SecureHash=' + vpc_secure_hash.to_s
44
+ @url + '?' + params
45
+ end
46
+
47
+ def attributes
48
+ value = {}
49
+ attributes_names.each do |attribute|
50
+ value[attribute.to_sym] = self.send(attribute)
51
+ end
52
+ value
53
+ end
54
+
55
+ def attributes=(value = {})
56
+ value.each do |name, attr_value|
57
+ self.send("#{name}=", attr_value)
58
+ end
59
+ end
60
+
61
+ private
62
+ def attributes_names
63
+ %w(secret_code access_code merchant url merchant_txn_ref order_info amount return_url)
64
+ end
65
+
66
+ def vpc_secure_hash
67
+ Digest::MD5.hexdigest(@secret_code.to_s + @access_code.to_s + @amount.to_s + @merchant_txn_ref.to_s +
68
+ @merchant.to_s + @order_info.to_s + @return_url.to_s).upcase
69
+ end
70
+ end
71
+
72
+ class Response
73
+ attr_reader :secret_code, :errors
74
+ attr_accessor :attributes
75
+
76
+ def initialize(options = {})
77
+ @secret_code, @attributes = OPTIONS['secret_code'], HashWithIndifferentAccess.new(options)
78
+ end
79
+
80
+ def attributes=(options = {})
81
+ @attributes = HashWithIndifferentAccess.new(options)
82
+ end
83
+
84
+ def valid?
85
+ @errors = {}
86
+ valid_vpc_txn_response_code? && valid_vpc_secure_hash?
87
+ end
88
+
89
+ def vpc_secure_hash
90
+ (@attributes[:vpc_secure_hash] || @attributes[:vpc_SecureHash]).upcase
91
+ end
92
+
93
+ def vpc_txn_response_code
94
+ @attributes[:vpc_txn_response_code] || @attributes[:vpc_TxnResponseCode]
95
+ end
96
+
97
+ private
98
+ def valid_vpc_secure_hash?
99
+ params = @attributes.select { |k,v| !%w(vpc_secure_hash vpc_SecureHash).include?(k.to_s) }
100
+ vpc_secure_hash_params = @secret_code
101
+ sort_keys(params.keys).each do |key|
102
+ vpc_secure_hash_params += @attributes[key].to_s
103
+ end
104
+ if Digest::MD5.hexdigest(vpc_secure_hash_params).upcase == vpc_secure_hash
105
+ true
106
+ else
107
+ @errors[:vpc_secure_hash] = 'invalid'
108
+ false
109
+ end
110
+ end
111
+
112
+ def valid_vpc_txn_response_code?
113
+ if vpc_txn_response_code == '0'
114
+ true
115
+ else
116
+ @errors[:vpc_txn_response_code] = "bad code = #{vpc_txn_response_code}"
117
+ false
118
+ end
119
+ end
120
+
121
+ def sort_keys(keys)
122
+ keys.sort do |a,b|
123
+ size = [a.length, b.length].min
124
+ compare = 0
125
+ size.times do |i|
126
+ compare = (a[i] <=> b[i])
127
+ break if compare != 0
128
+ end
129
+ if compare != 0
130
+ compare
131
+ else
132
+ (a.length < b.length) ? 1 : -1
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,3 @@
1
+ module BankAudi
2
+ VERSION = "1.0.4"
3
+ end
@@ -0,0 +1,142 @@
1
+ require 'spec_helper'
2
+
3
+ describe BankAudi do
4
+ describe 'Request' do
5
+
6
+ before :each do
7
+ @request = BankAudi::Request.new
8
+ end
9
+
10
+ def valid(request)
11
+ request.merchant_txn_ref, request.order_info, request.amount, request.return_url =
12
+ 'merchant-txn-ref', 'order-info', 100, 'http://www.google.com'
13
+ request
14
+ end
15
+
16
+ it 'should initialize with default attributes' do
17
+ [:secret_code, :access_code, :merchant, :url].each do |attribute|
18
+ @request.send(attribute).should_not be_blank
19
+ end
20
+ end
21
+
22
+ it 'should initialize with options' do
23
+ request = BankAudi::Request.new :merchant_txn_ref => 'merchant-txn-ref', :order_info => 'order-info',
24
+ :amount => 100, :return_url => 'http://www.google.com'
25
+ [:merchant_txn_ref, :order_info, :amount, :return_url].each do |attribute|
26
+ request.send(attribute).should_not be_blank
27
+ end
28
+ request.should be_valid
29
+ end
30
+
31
+ it 'merchant_id is synonym of merchant' do
32
+ @request.merchant_id.should eq(@request.merchant)
33
+ end
34
+
35
+ it 'should valid' do
36
+ valid(@request).should be_valid
37
+ end
38
+
39
+ it 'should invalid' do
40
+ @request.should_not be_valid
41
+ [:merchant_txn_ref, :order_info, :amount, :return_url].each do |attribute|
42
+ request = valid(@request)
43
+ request.send("#{attribute}=", nil)
44
+ request.should_not be_valid
45
+ end
46
+ end
47
+
48
+ it 'should return errors (method errors)' do
49
+ request = valid(@request)
50
+ request.amount = nil
51
+ request.should_not be_valid
52
+ request.errors.first.should_not be_blank
53
+ end
54
+
55
+ it 'should return full url' do
56
+ url = valid(@request).full_url
57
+ params = CGI::parse(url)
58
+ params['vpc_SecureHash'].first.should eq('A37A981709D939C0E04B640E26677471')
59
+ end
60
+
61
+ it 'should return attributes (method attributes)' do
62
+ default_attributes = {
63
+ :secret_code => 'XXXXXX', :access_code => 'XXXXXX', :merchant => 'XXXXXX',
64
+ :url => 'https://gw1.audicards.com/TPGWeb/payment/prepayment.action'
65
+ }
66
+
67
+ @request.attributes.should eq(
68
+ default_attributes.merge(:merchant_txn_ref => nil, :order_info => nil, :amount => nil,
69
+ :return_url => nil)
70
+ )
71
+
72
+ valid(@request).attributes.should eq(
73
+ default_attributes.merge(:merchant_txn_ref => 'merchant-txn-ref', :order_info => 'order-info',
74
+ :amount => 100, :return_url => 'http://www.google.com')
75
+ )
76
+ end
77
+
78
+ it 'should set attirubtes (method attributes=)' do
79
+ @request.attributes = { :merchant_txn_ref => 'merchant-txn-ref', :order_info => 'order-info',
80
+ :amount => 100, :return_url => 'http://www.google.com' }
81
+ @request.attributes.should eq(
82
+ valid(@request).attributes
83
+ )
84
+ end
85
+ end
86
+
87
+ describe 'Responce' do
88
+
89
+ before :each do
90
+ @response = BankAudi::Response.new
91
+ end
92
+
93
+ def valid(response)
94
+ response.attributes = { :access_code => 'XXXXXX', :amount => 100, :merchant_txn_ref => 'merchant-txn-ref',
95
+ :merchant => 'XXXXXX', :order_info => 'order-info', :return_url => 'http://www.google.com',
96
+ :vpc_secure_hash => 'B2384E5659611034CFFC95842C66A4BA', :vpc_txn_response_code => '0' }
97
+ response
98
+ end
99
+
100
+ it 'should initialize with default attributes' do
101
+ [:secret_code].each do |attribute|
102
+ @response.send(attribute).should_not be_blank
103
+ end
104
+ end
105
+
106
+ it 'should initialize with options' do
107
+ response = BankAudi::Response.new :some_attribute => 'some-attribute'
108
+ response.attributes.should_not be_blank
109
+ response.attributes.should eq({ 'some_attribute' => 'some-attribute' })
110
+ end
111
+
112
+ it 'should be valid' do
113
+ valid(@response).should be_valid
114
+ end
115
+
116
+ it 'should be invalid' do
117
+ @response.should_not be_valid
118
+
119
+ response = valid(@response)
120
+ response.attributes[:vpc_txn_response_code] = 'M'
121
+ response.should_not be_valid
122
+
123
+ response = valid(@response)
124
+ response.attributes[:amount] = 200
125
+ response.should_not be_valid
126
+ end
127
+
128
+ it 'should return errors (method errors)' do
129
+ response = valid(@response)
130
+ response.attributes[:vpc_txn_response_code] = 'Y'
131
+ response.should_not be_valid
132
+ response.errors.first.should_not be_blank
133
+ end
134
+
135
+ it 'should return value by different key type (string or symbol)' do
136
+ response = valid(@response)
137
+ response.attributes['vpc_txn_response_code'].should_not be_blank
138
+ response.attributes[:vpc_txn_response_code].should_not be_blank
139
+ end
140
+ end
141
+
142
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'rspec'
3
+ require 'bank_audi'
4
+
5
+ RSpec.configure do
6
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bank_audi
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - m.yermolovich
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-24 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! "\n Bank Audi is Lebanon's largest bank.\n And
15
+ this gem created to help some\n make money transactions & integration\n
16
+ \ with its system.\n "
17
+ email:
18
+ - m.yermolovich@dev1team.net
19
+ executables: []
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .gitignore
24
+ - Gemfile
25
+ - README.markdown
26
+ - Rakefile
27
+ - bank_audi.gemspec
28
+ - config/bank_audi.yml
29
+ - lib/bank_audi.rb
30
+ - lib/bank_audi/version.rb
31
+ - spec/bank_audi_spec.rb
32
+ - spec/spec_helper.rb
33
+ homepage: ''
34
+ licenses: []
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubyforge_project: bank_audi
53
+ rubygems_version: 1.8.24
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: BANK AUDI (operations with money)
57
+ test_files: []