esun 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/esun.gemspec +26 -0
- data/lib/esun.rb +7 -0
- data/lib/esun/atm.rb +61 -0
- data/lib/esun/callback_helper.rb +65 -0
- data/lib/esun/result.rb +14 -0
- data/lib/esun/version.rb +3 -0
- data/spec/atm_spec.rb +28 -0
- data/spec/callback_helper_spec.rb +24 -0
- data/spec/spec_helper.rb +4 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d1d7d912521e19bab033cb7d5d640ed0ae89d008
|
4
|
+
data.tar.gz: 5347eb745032281e3d7a473fd6961c65d942544d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e5d259e7a83bef81f1aa756c461f26ab4465c90d4543402c4eee5e348fd05f061d6e6adcb5a1ece038c361d3e2e298585624affc1382fa7a09304e2f70486505
|
7
|
+
data.tar.gz: 8d92656ac6f7652112ac97d62a925302417be19382c917cc5caf1196f492219d17ef0ef7c7795ef67e0b0a4b36ff93a5f502286bd25de136807ca88566a9637c
|
data/Gemfile
ADDED
data/esun.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/esun/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "esun"
|
6
|
+
s.version = Esun::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.summary = "taiwan esun bank vitural account service."
|
9
|
+
s.description = "virtual account generator, and payment callback parser"
|
10
|
+
|
11
|
+
s.required_ruby_version = ">= 1.8.7"
|
12
|
+
s.required_rubygems_version = ">= 1.3.6"
|
13
|
+
|
14
|
+
s.authors = ["Eddie"]
|
15
|
+
s.email = ["eddie@visionbundles.com"]
|
16
|
+
s.homepage = "https://github.com/afunction/esun"
|
17
|
+
|
18
|
+
s.files = %w{Gemfile esun.gemspec} + Dir['**/*.{rb,yml}']
|
19
|
+
s.test_files = s.files.grep(%r{^(test|spec|locales)/})
|
20
|
+
s.require_paths = %w{lib}
|
21
|
+
|
22
|
+
s.license = 'MIT'
|
23
|
+
|
24
|
+
s.add_dependency "rails"
|
25
|
+
s.add_development_dependency "rspec"
|
26
|
+
end
|
data/lib/esun.rb
ADDED
data/lib/esun/atm.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
module Esun
|
2
|
+
class ATM
|
3
|
+
# Setup the compnay_code when init your rails app
|
4
|
+
# config/initializers/esun.rb
|
5
|
+
# Esun::ATM.company_code = Settings.esun.company_code
|
6
|
+
cattr_accessor :company_code
|
7
|
+
@@company_code = ''
|
8
|
+
|
9
|
+
WEIGHTING_TABLE = '654321987654321'
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# 局號
|
13
|
+
def bank_code
|
14
|
+
'808'
|
15
|
+
end
|
16
|
+
|
17
|
+
# 取得虛擬帳號
|
18
|
+
def build_vaccount(oid, amount, expire_date)
|
19
|
+
unless expire_date.is_a?(Date)
|
20
|
+
raise "expire_date must be is Date"
|
21
|
+
end
|
22
|
+
# 訂單編號 000001
|
23
|
+
oid = get_oid_format(oid)
|
24
|
+
# 限制日期 10/10
|
25
|
+
expire_date = expire_date.strftime('%m%d')
|
26
|
+
# 虛擬帳號
|
27
|
+
vaccount = "#{company_code}#{expire_date}#{oid}"
|
28
|
+
# 檢查碼
|
29
|
+
check_numbers = check_numbers_generator(amount, vaccount)
|
30
|
+
|
31
|
+
vaccount = "#{vaccount}#{check_numbers}"
|
32
|
+
unless vaccount.length == 16
|
33
|
+
raise "vaccount generate error (not = 16 length) output: '#{vaccount}'"
|
34
|
+
end
|
35
|
+
return vaccount
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
# OID 6 碼 (000001)
|
40
|
+
def get_oid_format(oid)
|
41
|
+
oid = oid.to_i.to_s.rjust(6, '0')
|
42
|
+
unless oid.length == 6
|
43
|
+
raise "OID over 6 chars output: #{oid.to_s}"
|
44
|
+
end
|
45
|
+
return oid
|
46
|
+
end
|
47
|
+
|
48
|
+
# 檢查碼檢查
|
49
|
+
def check_numbers_generator(amount, vaccount)
|
50
|
+
return ((get_weight_code(amount) + get_weight_code(vaccount)) % 10).to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
# 取得 numbers weight
|
54
|
+
def get_weight_code(numbers)
|
55
|
+
numbers = numbers.to_s
|
56
|
+
weight = WEIGHTING_TABLE.reverse[0, numbers.length].reverse
|
57
|
+
return numbers.split('').map.with_index { |number, index| (number.to_i * weight[index].to_i) }.sum.to_i
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Esun
|
2
|
+
module CallbackHelper
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
# 玉山銀行 Callback IP
|
5
|
+
WHIT_LIST_IPS = %w(203.67.45.142 61.220.45.142 127.0.0.1 192.241.217.93)
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
protected
|
9
|
+
# 增加 white list IP
|
10
|
+
# Example:
|
11
|
+
# add_allow_ip '127.0.0.1'
|
12
|
+
# add_allow_ip '127.0.0.1', '123.212.346.45'
|
13
|
+
def add_allow_ip(ips)
|
14
|
+
if ips.is_a? Array
|
15
|
+
WHIT_LIST_IPS.contcat(ips)
|
16
|
+
else
|
17
|
+
WHIT_LIST_IPS.push(ips.to_s)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# 1. 跳過 Rails 4 預設 authenticity_token 驗證
|
22
|
+
# 2. 設定 IP Whit List before_action
|
23
|
+
def set_esun_callback_action(action)
|
24
|
+
action = action.to_sym
|
25
|
+
skip_before_filter :verify_authenticity_token, only: action
|
26
|
+
before_action :esun_callback_ip_check, only: action
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
# 檢查 IP Before Action
|
32
|
+
def esun_callback_ip_check
|
33
|
+
unless WHIT_LIST_IPS.include?(remote_ip)
|
34
|
+
raise ActionController::RoutingError.new('IP not allow')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def render_esun_ok
|
39
|
+
render text: 'OK'
|
40
|
+
end
|
41
|
+
|
42
|
+
def remote_ip
|
43
|
+
(request.headers['HTTP_X_REAL_IP'] || request.remote_ip) if request.present?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Parse 玉山 Callback
|
47
|
+
def payment_params
|
48
|
+
@payment_params ||= parse_payment_params(params[:Data])
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse_payment_params(data)
|
52
|
+
payment_parameters = data.gsub('0D 0A', '').split(',')
|
53
|
+
oid = payment_parameters[3][9, 6]
|
54
|
+
return ::Esun::Result.new(
|
55
|
+
handle_date: Date.parse(payment_parameters[0]),
|
56
|
+
channel: payment_parameters[1],
|
57
|
+
serial_number: payment_parameters[2],
|
58
|
+
vaccount: payment_parameters[3],
|
59
|
+
oid: oid.to_i,
|
60
|
+
amount: payment_parameters[4].to_i,
|
61
|
+
pay_time: Time.parse(payment_parameters[5]),
|
62
|
+
data: data)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/esun/result.rb
ADDED
data/lib/esun/version.rb
ADDED
data/spec/atm_spec.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
Esun::ATM.company_code = '92424'
|
4
|
+
|
5
|
+
describe Esun::ATM do
|
6
|
+
subject { ::Esun::ATM }
|
7
|
+
|
8
|
+
it "company code should exists" do
|
9
|
+
subject.company_code.should == '92424'
|
10
|
+
end
|
11
|
+
|
12
|
+
its(:bank_code) { should == '808' }
|
13
|
+
|
14
|
+
context "when create a virtual account" do
|
15
|
+
subject { ::Esun::ATM.build_vaccount(1, 1000, Date.parse('2014/03/18') ) }
|
16
|
+
|
17
|
+
its(:length) { should == 16}
|
18
|
+
|
19
|
+
it "should match compnay_code == 92424" do
|
20
|
+
subject[0..4].should == '92424'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "order_id should auto fill 0 => 000001" do
|
24
|
+
subject[9..14].should == '000001'
|
25
|
+
subject[9..14].to_i.should == 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class PaymentController < ActionController::Base
|
4
|
+
include ::Esun::CallbackHelper
|
5
|
+
add_allow_ip '192.168.3.10'
|
6
|
+
set_esun_callback_action :esun
|
7
|
+
|
8
|
+
def esun; end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
describe PaymentController do
|
13
|
+
it "192.168.3.10 should in white list CONST" do
|
14
|
+
::Esun::CallbackHelper::WHIT_LIST_IPS.should include('192.168.3.10')
|
15
|
+
end
|
16
|
+
|
17
|
+
it "#payment_params" do
|
18
|
+
payment_params = subject.send(:parse_payment_params, "20140311,銀行,1,965730312000988,10000,20140311133132")
|
19
|
+
payment_params.should be_a(::Esun::Result)
|
20
|
+
payment_params.oid.should == 988
|
21
|
+
payment_params.vaccount.length.should == 15
|
22
|
+
payment_params.amount.should == 10000
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: esun
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eddie
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: virtual account generator, and payment callback parser
|
42
|
+
email:
|
43
|
+
- eddie@visionbundles.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- Gemfile
|
49
|
+
- esun.gemspec
|
50
|
+
- lib/esun.rb
|
51
|
+
- lib/esun/atm.rb
|
52
|
+
- lib/esun/callback_helper.rb
|
53
|
+
- lib/esun/result.rb
|
54
|
+
- lib/esun/version.rb
|
55
|
+
- spec/atm_spec.rb
|
56
|
+
- spec/callback_helper_spec.rb
|
57
|
+
- spec/spec_helper.rb
|
58
|
+
homepage: https://github.com/afunction/esun
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
metadata: {}
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.8.7
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.6
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.2.2
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: taiwan esun bank vitural account service.
|
82
|
+
test_files:
|
83
|
+
- spec/atm_spec.rb
|
84
|
+
- spec/callback_helper_spec.rb
|
85
|
+
- spec/spec_helper.rb
|