rock_fintech 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rock_fintech/client.rb +2 -2
- data/lib/rock_fintech/http/request.rb +7 -39
- data/lib/rock_fintech/http/response.rb +2 -2
- data/lib/rock_fintech/sign/md5.rb +0 -4
- data/lib/rock_fintech/sign/sign.rb +38 -0
- data/lib/rock_fintech/version.rb +1 -1
- data/lib/rock_fintech.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11ee283007f8bb9cec689fc9d8a03d9546a0261f
|
4
|
+
data.tar.gz: 85572febaf942ac11241c62348db66cdc59d3e4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6535386a0ac3b7f9f9bfc305df13f4aa99d7488569e5a800077c7ca6f992d14443206a90cfd4e90fb8b5b6c3a8ec21cfc51f220911edb508137cebe2c2f41ea
|
7
|
+
data.tar.gz: 682dce780f210eec25838e1608b486fab1e1fe346f942150480ea1357892291c98535b6035103f3ee34cba390ecba55cceece6311832f1fc0c62e98419d72cab
|
data/lib/rock_fintech/client.rb
CHANGED
@@ -25,8 +25,8 @@ module RockFintech
|
|
25
25
|
recursive_include_api('RockFintech::Form')
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
|
28
|
+
def verify_data?(data)
|
29
|
+
Sign.verify(data, @config)
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
@@ -29,7 +29,7 @@ module RockFintech
|
|
29
29
|
encode: ENCODE,
|
30
30
|
version: @version,
|
31
31
|
}.merge(@params)
|
32
|
-
sign_str = sign(sign_body)
|
32
|
+
sign_str = Sign.sign(sign_body, @config)
|
33
33
|
|
34
34
|
# 3. merge sign
|
35
35
|
post_body = sign_body.merge({sign: sign_str})
|
@@ -47,57 +47,25 @@ module RockFintech
|
|
47
47
|
http_response = RestClient.post(@uri, request_data, header)
|
48
48
|
RockFintech.logger.info "#{identifier} 返回的报文为:\n#{http_response.body.force_encoding('utf-8')}\n"
|
49
49
|
|
50
|
-
|
50
|
+
# 6. decode http response
|
51
|
+
result_str = Encrypt::RSA.decrypt(http_response.body, @config[:private_key])
|
52
|
+
res = Utils.symbolize_keys(JSON.parse(result_str))
|
53
|
+
|
51
54
|
RockFintech.logger.info "#{identifier} 返回的数据为:\n#{res}\n"
|
52
55
|
|
56
|
+
# 7. create response
|
53
57
|
@response = RockFintech::Http::Response.new(service: @service,
|
54
58
|
flow_id: @params[:out_serial_no],
|
55
59
|
http_response: http_response,
|
56
60
|
raw_body: http_response.body,
|
57
61
|
data: res,
|
58
|
-
data_valid:
|
62
|
+
data_valid: Sign.verify(res, @config))
|
59
63
|
end
|
60
64
|
|
61
65
|
def identifier
|
62
66
|
"[#{@service} - #{@params[:out_serial_no]}] "
|
63
67
|
end
|
64
68
|
|
65
|
-
private
|
66
|
-
|
67
|
-
def sign(data)
|
68
|
-
serialize_str = serialize(data)
|
69
|
-
Sign::MD5.sign(serialize_str, Sign::MD5.sign(@config[:rft_key], @config[:rft_secret]))
|
70
|
-
end
|
71
|
-
|
72
|
-
def serialize(data)
|
73
|
-
data = Hash[data.sort] # key 按照 alphabet 排序
|
74
|
-
|
75
|
-
data.each{ |k, v|
|
76
|
-
if v.kind_of?(Hash)
|
77
|
-
data[k] = serialize(v)
|
78
|
-
elsif v.kind_of?(Array)
|
79
|
-
if v[0].kind_of?(Hash)
|
80
|
-
v.each_with_index{ |ele, index|
|
81
|
-
v[index] = sign(ele)
|
82
|
-
}
|
83
|
-
else
|
84
|
-
data[k] = v.join('&')
|
85
|
-
end
|
86
|
-
end
|
87
|
-
}
|
88
|
-
|
89
|
-
data.map{|k,v| "#{k}=#{v}"}.join('&')
|
90
|
-
end
|
91
|
-
|
92
|
-
def decode_body(body)
|
93
|
-
result_str = Encrypt::RSA.decrypt(body, @config[:private_key])
|
94
|
-
Utils.symbolize_keys(JSON.parse(result_str))
|
95
|
-
end
|
96
|
-
|
97
|
-
def verify_sign(body)
|
98
|
-
sign_str = body.delete(:sign)
|
99
|
-
sign(body) == sign_str
|
100
|
-
end
|
101
69
|
end # end of class
|
102
70
|
end
|
103
71
|
end
|
@@ -17,8 +17,8 @@ module RockFintech
|
|
17
17
|
self.data = {} if self.data.nil? # 默认一定要有
|
18
18
|
|
19
19
|
unless self.data_valid
|
20
|
-
self.data[:
|
21
|
-
self.data[:
|
20
|
+
self.data[:code] = 'sign_valid_fail'
|
21
|
+
self.data[:msg] = '数据签名错误'
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module RockFintech
|
3
|
+
module Sign
|
4
|
+
|
5
|
+
def self.sign(data, config)
|
6
|
+
serialize_str = serialize(data)
|
7
|
+
Sign::MD5.sign(serialize_str, Sign::MD5.sign(config[:rft_key], config[:rft_secret]))
|
8
|
+
end # sign
|
9
|
+
|
10
|
+
def self.verify(data, config)
|
11
|
+
sign_str = data.delete(:sign)
|
12
|
+
self.sign(data, config) == sign_str
|
13
|
+
end # verify
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def self.serialize(data)
|
18
|
+
data = Hash[data.sort] # key 按照 alphabet 排序
|
19
|
+
|
20
|
+
data.each{ |k, v|
|
21
|
+
if v.kind_of?(Hash) # 如果是 hash 接着 serialize
|
22
|
+
data[k] = serialize(v)
|
23
|
+
elsif v.kind_of?(Array)
|
24
|
+
if v[0].kind_of?(Hash) # 如果是 hash 数组对元素接着 serialize
|
25
|
+
v.each_with_index{ |ele, index|
|
26
|
+
v[index] = ele.to_json #serialize(ele)
|
27
|
+
}
|
28
|
+
else # 如果是普通元素数组
|
29
|
+
data[k] = v.join('&')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
}
|
33
|
+
|
34
|
+
data.map{|k,v| "#{k}=#{v}"}.join('&')
|
35
|
+
end # serialize
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/rock_fintech/version.rb
CHANGED
data/lib/rock_fintech.rb
CHANGED
@@ -15,6 +15,7 @@ require "rock_fintech/version"
|
|
15
15
|
require "rock_fintech/utils"
|
16
16
|
require "rock_fintech/extensions"
|
17
17
|
require "rock_fintech/sign/md5"
|
18
|
+
require "rock_fintech/sign/sign"
|
18
19
|
require "rock_fintech/encrypt/rsa"
|
19
20
|
require "rock_fintech/http/request"
|
20
21
|
require "rock_fintech/http/response"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rock_fintech
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- chenpengyu
|
@@ -229,6 +229,7 @@ files:
|
|
229
229
|
- lib/rock_fintech/http/response.rb
|
230
230
|
- lib/rock_fintech/railtie.rb
|
231
231
|
- lib/rock_fintech/sign/md5.rb
|
232
|
+
- lib/rock_fintech/sign/sign.rb
|
232
233
|
- lib/rock_fintech/utils.rb
|
233
234
|
- lib/rock_fintech/version.rb
|
234
235
|
- rock_fintech.gemspec
|