netpayclient 0.1.0 → 0.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 +4 -4
- data/README.md +20 -7
- data/lib/netpayclient/version.rb +1 -1
- data/lib/netpayclient.rb +63 -49
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c108bf07606362dd67e5b4df2a5021bb66cf8ccc
|
4
|
+
data.tar.gz: fc735cf824e9574dafde7f4e9ab376b7405da478
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8ae55663f820204ee40cb1f134276e9dd15fc6973a0bcc0ec03dfa2a6487693f12324ad12fd439cced8122bc5432c78bea15d51fc2dc65de32cd80b2d89483b
|
7
|
+
data.tar.gz: d804094e48e532d0cfe8c4d343abeb0e599523223a87d7c970db33981beb40bf68a6336841ef7b080715cd9b03650f5aecd2242d835ea3b09de72fe390120b64
|
data/README.md
CHANGED
@@ -9,23 +9,36 @@
|
|
9
9
|
sudo apt-get install mcrypt libmcrypt-dev
|
10
10
|
```
|
11
11
|
|
12
|
-
## API
|
12
|
+
## 使用 & API
|
13
13
|
|
14
14
|
### Netpayclient.build_key(path: nil, hash: {})
|
15
15
|
```ruby
|
16
|
-
Netpayclient.build_key(path: 'path/to/MerPrK.key')
|
16
|
+
netpay = Netpayclient.build_key(path: 'path/to/MerPrK.key')
|
17
17
|
# or
|
18
|
-
Netpayclient.build_key(hash: {
|
18
|
+
netpay = Netpayclient.build_key(hash: {
|
19
19
|
MERID: '8435...4395',
|
20
20
|
prikeyS: '4234...423',
|
21
21
|
prikeyE: '472...48324',
|
22
22
|
})
|
23
23
|
```
|
24
24
|
|
25
|
-
###
|
25
|
+
### 签名 sign
|
26
|
+
```ruby
|
27
|
+
# netpay = Netpayclient.build_key(...)
|
28
|
+
netpay.sign('834...645')
|
29
|
+
```
|
26
30
|
|
27
|
-
###
|
31
|
+
### 订单签名 sign_order
|
32
|
+
```ruby
|
33
|
+
netpay.sign_order(merid, ordno, amount, curyid, transdate, transtype)
|
34
|
+
```
|
28
35
|
|
29
|
-
###
|
36
|
+
### 应答数据的签名验证 verify
|
37
|
+
```ruby
|
38
|
+
netpay.verify(plain, checkvalue)
|
39
|
+
```
|
30
40
|
|
31
|
-
###
|
41
|
+
### 应答数据的签名包装 verify_trans_response
|
42
|
+
```ruby
|
43
|
+
netpay.verify_trans_response(merid, ordno, amount, curyid, transdate, transtype, ordstatus, check)
|
44
|
+
```
|
data/lib/netpayclient/version.rb
CHANGED
data/lib/netpayclient.rb
CHANGED
@@ -1,15 +1,31 @@
|
|
1
1
|
require "netpayclient/version"
|
2
2
|
|
3
|
-
|
4
|
-
require 'digest/sha1'
|
5
|
-
require 'mcrypt'
|
6
|
-
require 'iniparse'
|
3
|
+
class Netpayclient
|
7
4
|
require 'openssl'
|
8
5
|
|
9
6
|
DES_KEY = 'SCUBEPGW'
|
10
7
|
HASH_PAD = '0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a05000414'
|
11
8
|
|
12
|
-
|
9
|
+
module Crypto
|
10
|
+
require 'mcrypt'
|
11
|
+
def self.crypto
|
12
|
+
if defined?(@@crypto).nil?
|
13
|
+
@@crypto = Mcrypt.new(:des, :cbc)
|
14
|
+
@@crypto.key = DES_KEY
|
15
|
+
@@crypto.iv = "\x00" * 8
|
16
|
+
@@crypto.padding = false
|
17
|
+
end
|
18
|
+
@@crypto
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.decrypt(str)
|
22
|
+
if str.blank?
|
23
|
+
"\xEE\xB3\x16\x86\xAB\x84G\x90"
|
24
|
+
else
|
25
|
+
self.crypto.decrypt(str)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
13
29
|
|
14
30
|
def self.hex2bin(hexdata)
|
15
31
|
[hexdata].pack "H*"
|
@@ -38,6 +54,7 @@ module Netpayclient
|
|
38
54
|
end
|
39
55
|
|
40
56
|
def self.sha1_128(string)
|
57
|
+
require 'digest/sha1'
|
41
58
|
hash = Digest::SHA1.hexdigest(string)
|
42
59
|
sha_bin = self.hex2bin(hash)
|
43
60
|
sha_pad = self.hex2bin(HASH_PAD)
|
@@ -75,18 +92,13 @@ module Netpayclient
|
|
75
92
|
ret.size == 256 ? ret : false
|
76
93
|
end
|
77
94
|
|
78
|
-
def self.
|
79
|
-
|
80
|
-
modulus = self.bin2int(@@private_key["modulus"])
|
81
|
-
exponent = self.bchexdec("010001")
|
82
|
-
result = self.mybcpowmod(check,exponent,modulus)
|
83
|
-
rb = self.bcdechex(result)
|
84
|
-
self.padstr(rb).upcase
|
95
|
+
def self.build_key(path: nil, hash: {})
|
96
|
+
self.new(path: path, hash: hash)
|
85
97
|
end
|
86
98
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
99
|
+
def initialize(path: nil, hash: {})
|
100
|
+
require 'iniparse'
|
101
|
+
@private_key = {}
|
90
102
|
if path
|
91
103
|
config_hash = IniParse.parse(File.read(path))['NetPayClient']
|
92
104
|
else
|
@@ -95,51 +107,53 @@ module Netpayclient
|
|
95
107
|
hex = ""
|
96
108
|
if not config_hash['MERID'].nil?
|
97
109
|
ret = config_hash['MERID']
|
98
|
-
|
110
|
+
@private_key[:MERID] = ret
|
99
111
|
hex = config_hash['prikeyS'][80...config_hash['prikeyS'].size]
|
100
112
|
elsif not config_hash['PGID'].nil?
|
101
113
|
ret = config_hash['PGID']
|
102
|
-
|
114
|
+
@private_key[:PGID] = ret
|
103
115
|
hex = config_hash['pubkeyS'][48...config_hash['pubkeyS'].size]
|
104
116
|
else
|
105
|
-
|
117
|
+
raise 'config error'
|
106
118
|
end
|
107
|
-
bin = self.hex2bin(hex)
|
108
|
-
|
109
|
-
|
110
|
-
iv = "\x00" * 8
|
111
|
-
crypto = Mcrypt.new(:des, :cbc)
|
112
|
-
crypto.key = DES_KEY
|
113
|
-
crypto.iv = iv
|
114
|
-
crypto.padding = false
|
119
|
+
bin = self.class.hex2bin(hex)
|
120
|
+
@private_key[:modulus] = bin[0,128]
|
115
121
|
|
116
122
|
prime1 = bin[384,64]
|
117
|
-
enc =
|
118
|
-
|
123
|
+
enc = Crypto.decrypt(prime1)
|
124
|
+
@private_key[:prime1] = enc
|
119
125
|
prime2 = bin[448,64]
|
120
|
-
enc =
|
121
|
-
|
126
|
+
enc = Crypto.decrypt(prime2)
|
127
|
+
@private_key[:prime2] = enc
|
122
128
|
prime_exponent1 = bin[512,64]
|
123
|
-
enc =
|
124
|
-
|
129
|
+
enc = Crypto.decrypt(prime_exponent1)
|
130
|
+
@private_key[:prime_exponent1] = enc
|
125
131
|
prime_exponent2 = bin[576,64]
|
126
|
-
enc =
|
127
|
-
|
132
|
+
enc = Crypto.decrypt(prime_exponent2)
|
133
|
+
@private_key[:prime_exponent2] = enc
|
128
134
|
coefficient = bin[640,64]
|
129
|
-
enc =
|
130
|
-
|
131
|
-
|
135
|
+
enc = Crypto.decrypt(coefficient)
|
136
|
+
@private_key[:coefficient] = enc
|
137
|
+
end
|
138
|
+
|
139
|
+
def rsa_decrypt(input)
|
140
|
+
check = self.class.bchexdec(input)
|
141
|
+
modulus = self.class.bin2int(@private_key[:modulus])
|
142
|
+
exponent = self.class.bchexdec("010001")
|
143
|
+
result = self.class.mybcpowmod(check, exponent, modulus)
|
144
|
+
rb = self.class.bcdechex(result)
|
145
|
+
self.class.padstr(rb).upcase
|
132
146
|
end
|
133
147
|
|
134
|
-
def
|
135
|
-
if not
|
148
|
+
def sign(msg)
|
149
|
+
if not @private_key.key?(:MERID)
|
136
150
|
return false
|
137
151
|
end
|
138
|
-
hb = self.sha1_128(msg)
|
139
|
-
return self.rsa_encrypt(
|
152
|
+
hb = self.class.sha1_128(msg)
|
153
|
+
return self.class.rsa_encrypt(@private_key, hb)
|
140
154
|
end
|
141
155
|
|
142
|
-
def
|
156
|
+
def sign_order(merid, ordno, amount, curyid, transdate, transtype)
|
143
157
|
return false if (merid.size!=15)
|
144
158
|
return false if (ordno.size!=16)
|
145
159
|
return false if (amount.size!=12)
|
@@ -147,19 +161,19 @@ module Netpayclient
|
|
147
161
|
return false if (transdate.size!=8)
|
148
162
|
return false if (transtype.size!=4)
|
149
163
|
plain = merid + ordno + amount + curyid + transdate + transtype
|
150
|
-
return
|
164
|
+
return sign(plain)
|
151
165
|
end
|
152
166
|
|
153
|
-
def
|
154
|
-
return false if not
|
167
|
+
def verify(plain, check)
|
168
|
+
return false if not @private_key.key?(:PGID)
|
155
169
|
return false if check.size != 256
|
156
|
-
hb = self.sha1_128(plain)
|
170
|
+
hb = self.class.sha1_128(plain)
|
157
171
|
hbhex = hb.unpack('H*')[0].upcase
|
158
|
-
rbhex =
|
172
|
+
rbhex = rsa_decrypt(check)
|
159
173
|
return hbhex == rbhex ? true : false
|
160
174
|
end
|
161
175
|
|
162
|
-
def
|
176
|
+
def verify_trans_response(merid, ordno, amount, curyid, transdate, transtype, ordstatus, check)
|
163
177
|
return false if (merid.size!=15)
|
164
178
|
return false if (ordno.size!=16)
|
165
179
|
return false if (amount.size!=12)
|
@@ -169,6 +183,6 @@ module Netpayclient
|
|
169
183
|
return false if (ordstatus.size!=4)
|
170
184
|
return false if (check.size!=256)
|
171
185
|
plain = merid + ordno + amount + curyid + transdate + transtype + ordstatus
|
172
|
-
return
|
186
|
+
return verify(plain, check)
|
173
187
|
end
|
174
188
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netpayclient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weirong Xu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: iniparse
|