meowth 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/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +55 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config/meowth.yml +59 -0
- data/data/test/acp_test_enc.cer +25 -0
- data/data/test/acp_test_middle.cer +23 -0
- data/data/test/acp_test_root.cer +22 -0
- data/data/test/acp_test_sign.pfx +0 -0
- data/data/test/acp_test_verify_sign.cer +25 -0
- data/lib/generators/meowth/install_generator.rb +12 -0
- data/lib/generators/meowth/templates/config/meowth.yml +55 -0
- data/lib/meowth/config.rb +77 -0
- data/lib/meowth/constant.rb +233 -0
- data/lib/meowth/service.rb +193 -0
- data/lib/meowth/util.rb +54 -0
- data/lib/meowth/version.rb +3 -0
- data/meowth.gemspec +28 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d4bac154e511d7fd7194bb930df12b6cf56468b5
|
4
|
+
data.tar.gz: f50adfebd880b45bd652a6426b69881ea5e495a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4bcc0ae5172fd7798f07d6a3fddb0880ef2fa8505be03ee5e7f4232b3c088345e98475859f3b1a467c414524aa376e3761db30b39142849955fc9f0fea205c70
|
7
|
+
data.tar.gz: 610a8a8fbad2a329f9638279c35787d8d9be930acacfae635e0fd3cfe7f09ff3ac9f387a69fc9f127304b6a9e45a1f786441c5a2106dba39f9ae2922883ebfd6
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
2
|
+
|
3
|
+
## Our Pledge
|
4
|
+
|
5
|
+
In the interest of fostering an open and welcoming environment, we as
|
6
|
+
contributors and maintainers pledge to making participation in our project and
|
7
|
+
our community a harassment-free experience for everyone, regardless of age, body
|
8
|
+
size, disability, ethnicity, gender identity and expression, level of experience,
|
9
|
+
nationality, personal appearance, race, religion, or sexual identity and
|
10
|
+
orientation.
|
11
|
+
|
12
|
+
## Our Standards
|
13
|
+
|
14
|
+
Examples of behavior that contributes to creating a positive environment
|
15
|
+
include:
|
16
|
+
|
17
|
+
* Using welcoming and inclusive language
|
18
|
+
* Being respectful of differing viewpoints and experiences
|
19
|
+
* Gracefully accepting constructive criticism
|
20
|
+
* Focusing on what is best for the community
|
21
|
+
* Showing empathy towards other community members
|
22
|
+
|
23
|
+
Examples of unacceptable behavior by participants include:
|
24
|
+
|
25
|
+
* The use of sexualized language or imagery and unwelcome sexual attention or
|
26
|
+
advances
|
27
|
+
* Trolling, insulting/derogatory comments, and personal or political attacks
|
28
|
+
* Public or private harassment
|
29
|
+
* Publishing others' private information, such as a physical or electronic
|
30
|
+
address, without explicit permission
|
31
|
+
* Other conduct which could reasonably be considered inappropriate in a
|
32
|
+
professional setting
|
33
|
+
|
34
|
+
## Our Responsibilities
|
35
|
+
|
36
|
+
Project maintainers are responsible for clarifying the standards of acceptable
|
37
|
+
behavior and are expected to take appropriate and fair corrective action in
|
38
|
+
response to any instances of unacceptable behavior.
|
39
|
+
|
40
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
41
|
+
reject comments, commits, code, wiki edits, issues, and other contributions
|
42
|
+
that are not aligned to this Code of Conduct, or to ban temporarily or
|
43
|
+
permanently any contributor for other behaviors that they deem inappropriate,
|
44
|
+
threatening, offensive, or harmful.
|
45
|
+
|
46
|
+
## Scope
|
47
|
+
|
48
|
+
This Code of Conduct applies both within project spaces and in public spaces
|
49
|
+
when an individual is representing the project or its community. Examples of
|
50
|
+
representing a project or community include using an official project e-mail
|
51
|
+
address, posting via an official social media account, or acting as an appointed
|
52
|
+
representative at an online or offline event. Representation of a project may be
|
53
|
+
further defined and clarified by project maintainers.
|
54
|
+
|
55
|
+
## Enforcement
|
56
|
+
|
57
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
58
|
+
reported by contacting the project team at panjie@xdstar.net. All
|
59
|
+
complaints will be reviewed and investigated and will result in a response that
|
60
|
+
is deemed necessary and appropriate to the circumstances. The project team is
|
61
|
+
obligated to maintain confidentiality with regard to the reporter of an incident.
|
62
|
+
Further details of specific enforcement policies may be posted separately.
|
63
|
+
|
64
|
+
Project maintainers who do not follow or enforce the Code of Conduct in good
|
65
|
+
faith may face temporary or permanent repercussions as determined by other
|
66
|
+
members of the project's leadership.
|
67
|
+
|
68
|
+
## Attribution
|
69
|
+
|
70
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
71
|
+
available at [http://contributor-covenant.org/version/1/4][version]
|
72
|
+
|
73
|
+
[homepage]: http://contributor-covenant.org
|
74
|
+
[version]: http://contributor-covenant.org/version/1/4/
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 Jack Pan
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Meowth
|
2
|
+
|
3
|
+
## 安装
|
4
|
+
|
5
|
+
将以下内容添加到Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'meowth'
|
9
|
+
```
|
10
|
+
|
11
|
+
然后执行:
|
12
|
+
```bash
|
13
|
+
$ bundle install
|
14
|
+
```
|
15
|
+
|
16
|
+
生成配置文件:
|
17
|
+
```ruby
|
18
|
+
rails generate meowth:install
|
19
|
+
```
|
20
|
+
|
21
|
+
## 使用
|
22
|
+
|
23
|
+
### 配置
|
24
|
+
将自己的证书放到工程某个目录下,然后修改`meowth.yml`文件:
|
25
|
+
```yaml
|
26
|
+
default: &default
|
27
|
+
sign_cert_path: "path/to/acp_test_sign.pfx"
|
28
|
+
sign_cert_password: "000000"
|
29
|
+
verify_sign_cert_path: "path/to/acp_test_verify_sign.cer"
|
30
|
+
encrypt_cert_path: "path/to/acp_test_enc.cer"
|
31
|
+
|
32
|
+
development:
|
33
|
+
<<: *default
|
34
|
+
front_url: "" # 商户前台回调地址
|
35
|
+
back_url: "" # 商户后台通知地址
|
36
|
+
```
|
37
|
+
|
38
|
+
### 网关类产品
|
39
|
+
生成消费参数
|
40
|
+
```ruby
|
41
|
+
requrie 'meowth/service'
|
42
|
+
|
43
|
+
mer_id = '111111' # 商户id
|
44
|
+
order_id = '22222222' # 订单ID
|
45
|
+
txn_amt = 100 # 订单金额,单位是分
|
46
|
+
params = Magneton::Service.create_gate_consume_params(mer_id, order_id, txn_amt)
|
47
|
+
```
|
48
|
+
之后,在前台页面,将生成的参数`post`给`Meowth::Config.config['front_trans_url']`,之后就会跳转到银联支付页面。
|
49
|
+
|
50
|
+
其他产品使用方法类似,这里不再赘述。
|
51
|
+
|
52
|
+
## License
|
53
|
+
|
54
|
+
The gem is available as open source under the terms of the [MIT License](LICENSE.txt).
|
55
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "meowth"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/config/meowth.yml
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
default: &default
|
2
|
+
sign_cert_path: "data/test/acp_test_sign.pfx"
|
3
|
+
sign_cert_password: "000000"
|
4
|
+
sign_cert_type: "PKCS12"
|
5
|
+
verify_sign_cert_path: "data/test/acp_test_verify_sign.cer"
|
6
|
+
validate_cert_dir: ""
|
7
|
+
encrypt_cert_path: "data/test/acp_test_enc.cer"
|
8
|
+
single_mode: true
|
9
|
+
front_trans_url: "https://101.231.204.80:5000/gateway/api/frontTransReq.do"
|
10
|
+
back_trans_url: "https://101.231.204.80:5000/gateway/api/backTransReq.do"
|
11
|
+
single_query_url: "https://101.231.204.80:5000/gateway/api/queryTrans.do"
|
12
|
+
batch_trans_url: "https://101.231.204.80:5000/gateway/api/batchTrans.do"
|
13
|
+
file_trans_url: "https://101.231.204.80:9080/"
|
14
|
+
app_trans_url: "https://101.231.204.80:5000/gateway/api/appTransReq.do"
|
15
|
+
card_trans_url: "https://101.231.204.80:5000/gateway/api/cardTransReq.do"
|
16
|
+
jf_front_trans_url: "https://101.231.204.80:5000/jiaofei/api/frontTransReq.do"
|
17
|
+
jf_back_trans_url: "https://101.231.204.80:5000/jiaofei/api/backTransReq.do"
|
18
|
+
jf_single_query_url: "https://101.231.204.80:5000/jiaofei/api/queryTrans.do"
|
19
|
+
jf_card_trans_url: "https://101.231.204.80:5000/jiaofei/api/cardTransReq.do"
|
20
|
+
jf_app_trans_url: "https://101.231.204.80:5000/jiaofei/api/appTransReq.do"
|
21
|
+
merchant_id: "777290058136630"
|
22
|
+
front_url: "http://101.231.204.84:11006/ACPTest/FrontRcvResponse.do"
|
23
|
+
back_url: "http://101.231.204.84:11006/ACPTest/BackRcvResponse.do"
|
24
|
+
|
25
|
+
development:
|
26
|
+
<<: *default
|
27
|
+
merchant_id: "777290058136630"
|
28
|
+
front_url: "http://101.231.204.84:11006/ACPTest/FrontRcvResponse.do"
|
29
|
+
back_url: "http://101.231.204.84:11006/ACPTest/BackRcvResponse.do"
|
30
|
+
|
31
|
+
test:
|
32
|
+
<<: *default
|
33
|
+
merchant_id: "777290058136630"
|
34
|
+
front_url: "http://101.231.204.84:11006/ACPTest/FrontRcvResponse.do"
|
35
|
+
back_url: "http://101.231.204.84:11006/ACPTest/BackRcvResponse.do"
|
36
|
+
|
37
|
+
production:
|
38
|
+
sign_cert_path: "acp_test_sign.pfx"
|
39
|
+
sign_cert_password: "000000"
|
40
|
+
sign_cert_type: "PKCS12"
|
41
|
+
validate_cert_dir: ""
|
42
|
+
encrypt_cert_path: ""
|
43
|
+
single_mode: true
|
44
|
+
front_trans_url: "https://gateway.95516.com/gateway/api/frontTransReq.do"
|
45
|
+
back_trans_url: "https://gateway.95516.com/gateway/api/backTransReq.do"
|
46
|
+
single_query_url: "https://gateway.95516.com/gateway/api/queryTrans.do"
|
47
|
+
batch_trans_url: "https://gateway.95516.com/gateway/api/batchTrans.do"
|
48
|
+
file_trans_url: "https://101.231.204.80:9080/"
|
49
|
+
app_trans_url: "https://gateway.95516.com/gateway/api/appTransReq.do"
|
50
|
+
card_trans_url: "https://gateway.95516.com/gateway/api/cardTransReq.do"
|
51
|
+
|
52
|
+
jf_front_trans_url: "https://gateway.95516.com/jiaofei/api/frontTransReq.do"
|
53
|
+
jf_back_trans_url: "https://gateway.95516.com/jiaofei/api/backTransReq.do"
|
54
|
+
jf_single_query_url: "https://gateway.95516.com/jiaofei/api/queryTrans.do"
|
55
|
+
jf_card_trans_url: "https://gateway.95516.com/jiaofei/api/cardTransReq.do"
|
56
|
+
jf_app_trans_url: "https://gateway.95516.com/jiaofei/api/appTransReq.do"
|
57
|
+
|
58
|
+
front_url: ""
|
59
|
+
back_url: ""
|
@@ -0,0 +1,25 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEQzCCAyugAwIBAgIFEAJkkicwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UEBhMC
|
3
|
+
Q04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
4
|
+
cml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTEwHhcNMTUxMjE1MDkxMTM1WhcN
|
5
|
+
MTcxMjE1MDkxMTM1WjCBgTELMAkGA1UEBhMCY24xFzAVBgNVBAoTDkNGQ0EgVEVT
|
6
|
+
VCBPQ0ExMRIwEAYDVQQLEwlDRkNBIFRFU1QxFDASBgNVBAsTC0VudGVycHJpc2Vz
|
7
|
+
MS8wLQYDVQQDFCYwNDFAWjIwMTQtMTEtMTFAMDAwNDAwMDA6U0lHTkAwMDAwMDAw
|
8
|
+
NTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANHnoPx0JZKZmFjIURxN
|
9
|
+
AbLlWAw2jiFFWBnDF2MIGkya2r0fGiR0knq8zkKUnoIyC+tzEiOavniQaSu0ucuv
|
10
|
+
/V4ugz66PSRxw1gaPcR2dDVdgojF00TcewxlJEA65fK3eKhUYfC3NbRaVQOMMdwv
|
11
|
+
7nNEvzxvdExE47ceMya7FmsUPyLFu9X++chFQiYfr8nH+wdDeYo8w8vCX+Jd2vRu
|
12
|
+
qDOah29CQfkAmXsx3D68zg0q4AjlLI1t5gLKiU5YoG6yWrigPyreEHh716rV8HkT
|
13
|
+
jGWx3cxF/HsLZ/E4SgIr5yIZA6qw8RFqaSXuyw3iDrNf6aSJGO0GKlvxnvD20oGR
|
14
|
+
JokCAwEAAaOB6TCB5jAfBgNVHSMEGDAWgBTPcJ1h6518Lrj3ywJA9wmd/jN0gDBI
|
15
|
+
BgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cu
|
16
|
+
Y2ZjYS5jb20uY24vdXMvdXMtMTQuaHRtMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6
|
17
|
+
Ly91Y3JsLmNmY2EuY29tLmNuL1JTQS9jcmw0NTE3LmNybDALBgNVHQ8EBAMCA+gw
|
18
|
+
HQYDVR0OBBYEFGjriHHUE1MnYX7H6GrFi+8R2zmUMBMGA1UdJQQMMAoGCCsGAQUF
|
19
|
+
BwMCMA0GCSqGSIb3DQEBBQUAA4IBAQAjsN0fyDqcxS9YKMpY3CIdlarCjvnus+wS
|
20
|
+
ExjNnPv7n2urqhz2Jf3yJuhxVVPzdgKT51C2UiR+/i1OJPWFx0IUos/v8js/TM5j
|
21
|
+
mTdPkBsRSxSDieHHiuE1nPUwGXUEO7mlOVkkzmLI75bJ86foxNflbQCF0+VvpMe7
|
22
|
+
KwQoNOR8DxIBxHdlsjSxE2RKM/ftXLhptrK4GK3K4FAcSiqBMEn5PF/5V9mHp5N6
|
23
|
+
3LdkMYqBj4pRcy8vrclucq99b2glmMLw7CI6Kxu22WVoRnZESjcgXiMVLLe+qy55
|
24
|
+
0pWcZ2BChS7Ln19tj49LnS3vFp6xf4qNSqxEBaQuNLEx0ObjI6pz
|
25
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,23 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDzjCCAragAwIBAgIKGNDz/H99Hd/CxjANBgkqhkiG9w0BAQUFADBZMQswCQYD
|
3
|
+
VQQGEwJDTjEwMC4GA1UEChMnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24g
|
4
|
+
QXV0aG9yaXR5MRgwFgYDVQQDEw9DRkNBIFRFU1QgQ1MgQ0EwHhcNMTIwODMwMDMx
|
5
|
+
NDMzWhcNMzEwNTExMDMxNDMzWjBYMQswCQYDVQQGEwJDTjEwMC4GA1UEChMnQ2hp
|
6
|
+
bmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRcwFQYDVQQDEw5D
|
7
|
+
RkNBIFRFU1QgT0NBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALiL
|
8
|
+
J/BrdvHSbXNfLIMTwUg9tDtVjMRGXOl6aZnu9IpxjI5SMUJ4hVwgJnmbTokxs6GF
|
9
|
+
IXKsCLSm5H1jHLI22ysc/ltByEybLWj5jjJuC9+Uknbl3/Ls1RBG6MogUCqZckuo
|
10
|
+
hKrf5DmlV3C/jVLxGn3pUeanvmqVUi4TKpXxgm5QqKSPF8VtQY4qCpNcQwwZqbMr
|
11
|
+
D+IfJtfpGAeVrP+Kg6i1t65seeEnVSaLhqpRUDU0PTblOuUv3OhiKJWA3cYWxUrg
|
12
|
+
7U7SIHNJLSEUWmjy4mKty+g7Cnjzt29F9qXFb6oB2mR8yt4GHCilw1Rc5RBXY63H
|
13
|
+
eTuOwdtGE3M2p7Q++OECAwEAAaOBmDCBlTAfBgNVHSMEGDAWgBR03sWNCn0QGqpp
|
14
|
+
g1tNIc6Gm8xxODAMBgNVHRMEBTADAQH/MDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6
|
15
|
+
Ly8yMTAuNzQuNDIuMy90ZXN0cmNhL1JTQS9jcmwxLmNybDALBgNVHQ8EBAMCAQYw
|
16
|
+
HQYDVR0OBBYEFM9wnWHrnXwuuPfLAkD3CZ3+M3SAMA0GCSqGSIb3DQEBBQUAA4IB
|
17
|
+
AQC0JOazrbkk0XMxMMeBCc3lgBId1RjQLgWUZ7zaUISpPstGIrE5A9aB6Ppq0Sxl
|
18
|
+
pt2gkFhPEKUqgOFN1CzCDEbP3n4H0chqK1DOMrgTCD8ID5UW+ECTYNe35rZ+1JiF
|
19
|
+
lOPEhFL3pv6XSkiKTfDnjum8+wFwUBGlfoWK1Hcx0P2Hk1jcZZKwGTx1IAkesF83
|
20
|
+
pufhxHE2Ur7W4d4tfp+eC7XXcA91pdd+VUrAfkj9eKHcDEYZz66HvHzmt6rtJVBa
|
21
|
+
pwrtCi9pW3rcm8c/1jSnEETZIaokai0fD7260h/LkD/GrNCibSWxFj1CqyP9Y5Yv
|
22
|
+
cj6aA5LnUcJYeNkrQ3V4XvVc
|
23
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,22 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDkzCCAnugAwIBAgIKUhN+zB19hbc65jANBgkqhkiG9w0BAQUFADBZMQswCQYD
|
3
|
+
VQQGEwJDTjEwMC4GA1UEChMnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24g
|
4
|
+
QXV0aG9yaXR5MRgwFgYDVQQDEw9DRkNBIFRFU1QgQ1MgQ0EwHhcNMTIwODI5MDUw
|
5
|
+
MTI5WhcNMzIwODI5MDUwMTI5WjBZMQswCQYDVQQGEwJDTjEwMC4GA1UEChMnQ2hp
|
6
|
+
bmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRgwFgYDVQQDEw9D
|
7
|
+
RkNBIFRFU1QgQ1MgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
|
8
|
+
rMJGruH6rOBPFxUI7T1ybydSRRtOM1xvkVjQNX0qmYir8feE6Tb0ctgtKR7a20DI
|
9
|
+
YCj9kZ5ANBQqjRcj3Soq9XH3cirqhYHJ723OKyTpS0RPQ0N6vtVt3P5JQ+ztjWHd
|
10
|
+
qIbbTOQ6O024TGTiqi6uHgMuz9/OVur81X3a5YVkK7jFeZ9o8cTcvQxD853/1sgZ
|
11
|
+
QcmR9aUSw0RXH4XFLTrn7n4QSfWKiNotlD8Ag5gS1pH9ONUb6nGkMn3gh1xfJqjm
|
12
|
+
ONMSknPXTGiNpXtqvYi8oIvByVCbUDO59IwPP1r1SYyE3P8Nr7DdQRu0KQSdXLoG
|
13
|
+
iugSR3fn+toObVAQmplDAgMBAAGjXTBbMB8GA1UdIwQYMBaAFHTexY0KfRAaqmmD
|
14
|
+
W00hzoabzHE4MAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBR0
|
15
|
+
3sWNCn0QGqppg1tNIc6Gm8xxODANBgkqhkiG9w0BAQUFAAOCAQEAM0eTkM35D4hj
|
16
|
+
RlGC63wY0h++wVPUvOrObqAVBbzEEQ7ScBienmeY8Q6lWMUTXM9ALibZklpJPcJv
|
17
|
+
3ntht7LL6ztd4wdX7E9RzZCQnRvbL9A/BU3NxWdeSpCg/OyPod5oCKP+6Uc7kApi
|
18
|
+
F9OtYNWnt3l2Zp/NiedzEQD8H4qEWQLAq+0dFo5BkfVhb/jPcktndpfPOuH1IMhP
|
19
|
+
tVcvo6jpFHw4U/nP2Jv59osIE97KJz/SPt2JAYnZOlIDqWwp9/Afvt0/MDr8y0PK
|
20
|
+
Q9c6eqIzBx7a9LpUTUl5u1jS+xSDZ/KF2lXnjwaFp7jICLWEMlBstCoogi7KwH9A
|
21
|
+
LpJP7/dj9g==
|
22
|
+
-----END CERTIFICATE-----
|
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEOjCCAyKgAwIBAgIFEAJkAUkwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UEBhMC
|
3
|
+
Q04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
4
|
+
cml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTEwHhcNMTUxMjA0MDMyNTIxWhcN
|
5
|
+
MTcxMjA0MDMyNTIxWjB5MQswCQYDVQQGEwJjbjEXMBUGA1UEChMOQ0ZDQSBURVNU
|
6
|
+
IE9DQTExEjAQBgNVBAsTCUNGQ0EgVEVTVDEUMBIGA1UECxMLRW50ZXJwcmlzZXMx
|
7
|
+
JzAlBgNVBAMUHjA0MUBaMTJAMDAwNDAwMDA6U0lHTkAwMDAwMDA2MjCCASIwDQYJ
|
8
|
+
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUDYYCLYvv3c911zhRDrSWCedAYDJQe
|
9
|
+
fJUjZKI2avFtB2/bbSmKQd0NVvh+zXtehCYLxKOltO6DDTRHwH9xfhRY3CBMmcOv
|
10
|
+
d2xQQvMJcV9XwoqtCKqhzguoDxJfYeGuit7DpuRsDGI0+yKgc1RY28v1VtuXG845
|
11
|
+
fTP7PRtJrareQYlQXghMgHFAZ/vRdqlLpVoNma5C56cJk5bfr2ngDlXbUqPXLi1j
|
12
|
+
iXAFb/y4b8eGEIl1LmKp3aPMDPK7eshc7fLONEp1oQ5Jd1nE/GZj+lC345aNWmLs
|
13
|
+
l/09uAvo4Lu+pQsmGyfLbUGR51KbmHajF4Mrr6uSqiU21Ctr1uQGkccCAwEAAaOB
|
14
|
+
6TCB5jAfBgNVHSMEGDAWgBTPcJ1h6518Lrj3ywJA9wmd/jN0gDBIBgNVHSAEQTA/
|
15
|
+
MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20u
|
16
|
+
Y24vdXMvdXMtMTQuaHRtMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly91Y3JsLmNm
|
17
|
+
Y2EuY29tLmNuL1JTQS9jcmw0NDkxLmNybDALBgNVHQ8EBAMCA+gwHQYDVR0OBBYE
|
18
|
+
FAFmIOdt15XLqqz13uPbGQwtj4PAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqG
|
19
|
+
SIb3DQEBBQUAA4IBAQB8YuMQWDH/Ze+e+2pr/914cBt94FQpYqZOmrBIQ8kq7vVm
|
20
|
+
TTy94q9UL0pMMHDuFJV6Wxng4Me/cfVvWmjgLg/t7bdz0n6UNj4StJP17pkg68WG
|
21
|
+
zMlcjuI7/baxtDrD+O8dKpHoHezqhx7dfh1QWq8jnqd3DFzfkhEpuIt6QEaUqoWn
|
22
|
+
t5FxSUiykTfjnaNEEGcn3/n2LpwrQ+upes12/B778MQETOsVv4WX8oE1Qsv1XLRW
|
23
|
+
i0DQetTU2RXTrynv+l4kMy0h9b/Hdlbuh2s0QZqlUMXx2biy0GvpF2pR8f+OaLuT
|
24
|
+
AtaKdU4T2+jO44+vWNNN2VoAaw0xY6IZ3/A1GL0x
|
25
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,55 @@
|
|
1
|
+
default: &default
|
2
|
+
sign_cert_path: "acp_test_sign.pfx"
|
3
|
+
sign_cert_password: "000000"
|
4
|
+
sign_cert_type: "PKCS12"
|
5
|
+
verify_sign_cert_path: "acp_test_verify_sign.cer"
|
6
|
+
validate_cert_dir: ""
|
7
|
+
encrypt_cert_path: "acp_test_enc.cer"
|
8
|
+
single_mode: true
|
9
|
+
front_trans_url: "https://101.231.204.80:5000/gateway/api/frontTransReq.do"
|
10
|
+
back_trans_url: "https://101.231.204.80:5000/gateway/api/backTransReq.do"
|
11
|
+
single_query_url: "https://101.231.204.80:5000/gateway/api/queryTrans.do"
|
12
|
+
batch_trans_url: "https://101.231.204.80:5000/gateway/api/batchTrans.do"
|
13
|
+
file_trans_url: "https://101.231.204.80:9080/"
|
14
|
+
app_trans_url: "https://101.231.204.80:5000/gateway/api/appTransReq.do"
|
15
|
+
card_trans_url: "https://101.231.204.80:5000/gateway/api/cardTransReq.do"
|
16
|
+
jf_front_trans_url: "https://101.231.204.80:5000/jiaofei/api/frontTransReq.do"
|
17
|
+
jf_back_trans_url: "https://101.231.204.80:5000/jiaofei/api/backTransReq.do"
|
18
|
+
jf_single_query_url: "https://101.231.204.80:5000/jiaofei/api/queryTrans.do"
|
19
|
+
jf_card_trans_url: "https://101.231.204.80:5000/jiaofei/api/cardTransReq.do"
|
20
|
+
jf_app_trans_url: "https://101.231.204.80:5000/jiaofei/api/appTransReq.do"
|
21
|
+
|
22
|
+
development:
|
23
|
+
<<: *default
|
24
|
+
front_url: ""
|
25
|
+
back_url: ""
|
26
|
+
|
27
|
+
test:
|
28
|
+
<<: *default
|
29
|
+
merchant_id: "700000000000001"
|
30
|
+
front_url: "http://101.231.204.84:11006/ACPTest/FrontRcvResponse.do"
|
31
|
+
back_url: "http://101.231.204.84:11006/ACPTest/BackRcvResponse.do"
|
32
|
+
|
33
|
+
production:
|
34
|
+
sign_cert_path: "acp_test_sign.pfx"
|
35
|
+
sign_cert_password: "000000"
|
36
|
+
sign_cert_type: "PKCS12"
|
37
|
+
validate_cert_dir: ""
|
38
|
+
encrypt_cert_path: ""
|
39
|
+
single_mode: true
|
40
|
+
front_trans_url: "https://gateway.95516.com/gateway/api/frontTransReq.do"
|
41
|
+
back_trans_url: "https://gateway.95516.com/gateway/api/backTransReq.do"
|
42
|
+
single_query_url: "https://gateway.95516.com/gateway/api/queryTrans.do"
|
43
|
+
batch_trans_url: "https://gateway.95516.com/gateway/api/batchTrans.do"
|
44
|
+
file_trans_url: "https://101.231.204.80:9080/"
|
45
|
+
app_trans_url: "https://gateway.95516.com/gateway/api/appTransReq.do"
|
46
|
+
card_trans_url: "https://gateway.95516.com/gateway/api/cardTransReq.do"
|
47
|
+
|
48
|
+
jf_front_trans_url: "https://gateway.95516.com/jiaofei/api/frontTransReq.do"
|
49
|
+
jf_back_trans_url: "https://gateway.95516.com/jiaofei/api/backTransReq.do"
|
50
|
+
jf_single_query_url: "https://gateway.95516.com/jiaofei/api/queryTrans.do"
|
51
|
+
jf_card_trans_url: "https://gateway.95516.com/jiaofei/api/cardTransReq.do"
|
52
|
+
jf_app_trans_url: "https://gateway.95516.com/jiaofei/api/appTransReq.do"
|
53
|
+
|
54
|
+
front_url: ""
|
55
|
+
back_url: ""
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
|
4
|
+
module Meowth
|
5
|
+
module Config
|
6
|
+
def self.config
|
7
|
+
self.init unless @config
|
8
|
+
@config
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.sign_cert_id
|
12
|
+
self.init unless @sign_cert
|
13
|
+
@sign_cert.certificate.serial.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.sign_cert_private_key
|
17
|
+
self.init unless @sign_cert
|
18
|
+
@sign_cert.key
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.verify_sign_cert_id
|
22
|
+
self.init unless @verify_sign_cert
|
23
|
+
@verify_sign_cert.serial.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.verify_sign_cert_public_key
|
27
|
+
self.init unless @verify_sign_cert
|
28
|
+
@verify_sign_cert.public_key
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.encrypt_cert_public_key
|
32
|
+
self.init unless @encrypt_cert
|
33
|
+
@encrypt_cert.public_key
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.encrypt_cert_id
|
37
|
+
self.init unless @encrypt_cert
|
38
|
+
@encrypt_cert.serial.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.init
|
42
|
+
self.init_constant
|
43
|
+
self.init_sign_cert
|
44
|
+
self.init_verify_sign_cert
|
45
|
+
self.init_encrypt_cert
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.init_sign_cert
|
49
|
+
@sign_cert = OpenSSL::PKCS12.new(File.read(@config['sign_cert_path']), @config['sign_cert_password'])
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.init_verify_sign_cert
|
53
|
+
@verify_sign_cert = OpenSSL::X509::Certificate.new(File.read(@config['verify_sign_cert_path']))
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.init_encrypt_cert
|
57
|
+
@encrypt_cert = OpenSSL::X509::Certificate.new(File.read(@config['encrypt_cert_path']))
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.init_constant
|
61
|
+
if defined?(::Rails) and Rails.root
|
62
|
+
config_file = Rails.root.join('config/meowth.yml')
|
63
|
+
return YAML.load(ERB.new(File.read(config_file)).result)[Rails.env] if File.exist?(config_file)
|
64
|
+
else
|
65
|
+
require "yaml"
|
66
|
+
rails_config_file = File.join(Dir.getwd, 'config/meowth.yml')
|
67
|
+
if File.exist?(rails_config_file)
|
68
|
+
rails_env = ENV['RAILS_ENV'] || 'default'
|
69
|
+
config = YAML.load(ERB.new(File.read(rails_config_file)).result)[rails_env]
|
70
|
+
if config
|
71
|
+
@config = config
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,233 @@
|
|
1
|
+
module Meowth
|
2
|
+
module Constant
|
3
|
+
# 版本号.
|
4
|
+
VERSION = "version";
|
5
|
+
# 证书ID.
|
6
|
+
CERT_ID = "certId";
|
7
|
+
# 签名.
|
8
|
+
SIGNATURE = "signature";
|
9
|
+
# 编码方式.
|
10
|
+
ENCODING = "encoding";
|
11
|
+
# 交易类型.
|
12
|
+
TXN_TYPE = "txnType";
|
13
|
+
# 交易子类.
|
14
|
+
TXN_SUB_TYPE = "txnSubType";
|
15
|
+
# 业务类型.
|
16
|
+
BIZ_TYPE = "bizType";
|
17
|
+
# 前台通知地址 .
|
18
|
+
FRONT_URL = "frontUrl";
|
19
|
+
# 后台通知地址.
|
20
|
+
BACK_URL = "backUrl";
|
21
|
+
# 接入类型.
|
22
|
+
ACCESS_TYPE = "accessType";
|
23
|
+
# 收单机构代码.
|
24
|
+
ACQ_INS_CODE = "acqInsCode";
|
25
|
+
# 商户类别.
|
26
|
+
MER_CAT_CODE = "merCatCode";
|
27
|
+
# 商户类型.
|
28
|
+
MER_TYPE = "merType";
|
29
|
+
# 商户代码.
|
30
|
+
MER_ID = "merId";
|
31
|
+
# 商户名称.
|
32
|
+
MER_NAME = "merName";
|
33
|
+
# 商户简称.
|
34
|
+
MER_ABBR = "merAbbr";
|
35
|
+
# 二级商户代码.
|
36
|
+
SUB_MER_ID = "subMerId";
|
37
|
+
# 二级商户名称.
|
38
|
+
SUB_MER_NAME = "subMerName";
|
39
|
+
# 二级商户简称.
|
40
|
+
SUB_MER_ABBR = "subMerAbbr";
|
41
|
+
# Cupsecure 商户代码.
|
42
|
+
CS_MER_ID = "csMerId";
|
43
|
+
# 商户订单号.
|
44
|
+
ORDER_ID = "orderId";
|
45
|
+
# 交易时间.
|
46
|
+
TXN_TIME = "txnTime";
|
47
|
+
# 发送时间.
|
48
|
+
TXN_SEND_TIME = "txnSendTime";
|
49
|
+
# 订单超时时间间隔.
|
50
|
+
ORDER_TIMEOUT_INTERVAL = "orderTimeoutInterval";
|
51
|
+
# 支付超时时间.
|
52
|
+
PAY_TIMEOUT_TIME = "payTimeoutTime";
|
53
|
+
# 默认支付方式.
|
54
|
+
DEFAULT_PAY_TYPE = "defaultPayType";
|
55
|
+
# 支持支付方式.
|
56
|
+
SUP_PAY_TYPE = "supPayType";
|
57
|
+
# 支付方式.
|
58
|
+
PAY_TYPE = "payType";
|
59
|
+
# 自定义支付方式.
|
60
|
+
CUSTOM_PAY_TYPE = "customPayType";
|
61
|
+
# 物流标识.
|
62
|
+
SHIPPING_FLAG = "shippingFlag";
|
63
|
+
# 收货地址-国家.
|
64
|
+
SHIPPING_COUNTRY_CODE = "shippingCountryCode";
|
65
|
+
# 收货地址-省.
|
66
|
+
SHIPPING_PROVINCE_CODE = "shippingProvinceCode";
|
67
|
+
# 收货地址-市.
|
68
|
+
SHIPPING_CITY_CODE = "shippingCityCode";
|
69
|
+
# 收货地址-地区.
|
70
|
+
SHIPPING_DISTRICT_CODE = "shippingDistrictCode";
|
71
|
+
# 收货地址-详细.
|
72
|
+
SHIPPING_STREET = "shippingStreet";
|
73
|
+
# 商品总类.
|
74
|
+
COMMODITY_CATEGORY = "commodityCategory";
|
75
|
+
# 商品名称.
|
76
|
+
COMMODITY_NAME = "commodityName";
|
77
|
+
# 商品URL.
|
78
|
+
COMMODITY_URL = "commodityUrl";
|
79
|
+
# 商品单价.
|
80
|
+
COMMODITY_UNIT_PRICE = "commodityUnitPrice";
|
81
|
+
# 商品数量.
|
82
|
+
COMMODITY_QTY = "commodityQty";
|
83
|
+
# 是否预授权.
|
84
|
+
IS_PRE_AUTH = "isPreAuth";
|
85
|
+
# 币种.
|
86
|
+
CURRENCY_CODE = "currencyCode";
|
87
|
+
# 账户类型.
|
88
|
+
ACC_TYPE = "accType";
|
89
|
+
# 账号.
|
90
|
+
ACC_NO = "accNo";
|
91
|
+
# 支付卡类型.
|
92
|
+
PAY_CARD_TYPE = "payCardType";
|
93
|
+
# 发卡机构代码.
|
94
|
+
ISS_INS_CODE = "issInsCode";
|
95
|
+
# 持卡人信息.
|
96
|
+
CUSTOMER_INFO = "customerInfo";
|
97
|
+
# 手机号.
|
98
|
+
PHONE_NO = "phoneNo";
|
99
|
+
# CVN2
|
100
|
+
CVN2 = "cvn2";
|
101
|
+
# 有效期
|
102
|
+
EXPIRED = "expired";
|
103
|
+
# 加密信息域
|
104
|
+
ENCRYPTED_INFO = "encryptedInfo";
|
105
|
+
# 交易金额.
|
106
|
+
TXN_AMT = "txnAmt";
|
107
|
+
# 余额.
|
108
|
+
BALANCE = "balance";
|
109
|
+
# 地区代码.
|
110
|
+
DISTRICT_CODE = "districtCode";
|
111
|
+
# 附加地区代码.
|
112
|
+
ADDITIONAL_DISTRICT_CODE = "additionalDistrictCode";
|
113
|
+
# 账单类型.
|
114
|
+
BILL_TYPE = "billType";
|
115
|
+
# 账单号码.
|
116
|
+
BILL_NO = "billNo";
|
117
|
+
# 账单月份.
|
118
|
+
BILL_MONTH = "billMonth";
|
119
|
+
# 账单查询要素.
|
120
|
+
BILL_QUERY_INFO = "billQueryInfo";
|
121
|
+
# 账单详情.
|
122
|
+
BILL_DETAIL_INFO = "billDetailInfo";
|
123
|
+
# 账单金额.
|
124
|
+
BILL_AMT = "billAmt";
|
125
|
+
# 账单金额符号.
|
126
|
+
BILL_AMT_SIGN = "billAmtSign";
|
127
|
+
# 绑定标识号.
|
128
|
+
BIND_ID = "bindId";
|
129
|
+
# 风险级别.
|
130
|
+
RISK_LEVEL = "riskLevel";
|
131
|
+
# 绑定信息条数.
|
132
|
+
BIND_INFO_QTY = "bindInfoQty";
|
133
|
+
# 绑定信息集.
|
134
|
+
BIND_INFO_LIST = "bindInfoList";
|
135
|
+
# 批次号.
|
136
|
+
BATCH_NO = "batchNo";
|
137
|
+
# 总笔数.
|
138
|
+
TOTAL_QTY = "totalQty";
|
139
|
+
# 总金额.
|
140
|
+
TOTAL_AMT = "totalAmt";
|
141
|
+
# 文件类型.
|
142
|
+
FILE_TYPE = "fileType";
|
143
|
+
# 文件名称.
|
144
|
+
FILE_NAME = "fileName";
|
145
|
+
# 批量文件内容.
|
146
|
+
FILE_CONTENT = "fileContent";
|
147
|
+
# 商户摘要.
|
148
|
+
MER_NOTE = "merNote";
|
149
|
+
# 商户自定义域.
|
150
|
+
# merReserved = "merReserved";#接口变更删除
|
151
|
+
# 请求方保留域.
|
152
|
+
REQ_RESERVED = "reqReserved";# 新增接口
|
153
|
+
# 保留域.
|
154
|
+
RESERVED = "reserved";
|
155
|
+
# 终端号.
|
156
|
+
TERM_ID = "termId";
|
157
|
+
# 终端类型.
|
158
|
+
TERM_TYPE = "termType";
|
159
|
+
# 交互模式.
|
160
|
+
INTERACT_MODE = "interactMode";
|
161
|
+
# 发卡机构识别模式.
|
162
|
+
# recognitionMode = "recognitionMode";
|
163
|
+
ISSUER_IDENTIFY_MODE = "issuerIdentifyMode";# 接口名称变更
|
164
|
+
# 商户端用户号.
|
165
|
+
MER_USER_ID = "merUserId";
|
166
|
+
# 持卡人IP.
|
167
|
+
CUSTOMER_IP = "customerIp";
|
168
|
+
# 查询流水号.
|
169
|
+
QUERY_ID = "queryId";
|
170
|
+
# 原交易查询流水号.
|
171
|
+
ORIG_QRY_ID = "origQryId";
|
172
|
+
# 系统跟踪号.
|
173
|
+
TRACE_NO = "traceNo";
|
174
|
+
# 交易传输时间.
|
175
|
+
TRACE_TIME = "traceTime";
|
176
|
+
# 清算日期.
|
177
|
+
SETTLE_DATE = "settleDate";
|
178
|
+
# 清算币种.
|
179
|
+
SETTLE_CURRENCY_CODE = "settleCurrencyCode";
|
180
|
+
# 清算金额.
|
181
|
+
SETTLE_AMT = "settleAmt";
|
182
|
+
# 清算汇率.
|
183
|
+
EXCHANGE_RATE = "exchangeRate";
|
184
|
+
# 兑换日期.
|
185
|
+
EXCHANGE_DATE = "exchangeDate";
|
186
|
+
# 响应时间.
|
187
|
+
RESP_TIME = "respTime";
|
188
|
+
# 原交易应答码.
|
189
|
+
ORIG_RESP_CODE = "origRespCode";
|
190
|
+
# 原交易应答信息.
|
191
|
+
ORIG_RESP_MSG = "origRespMsg";
|
192
|
+
# 应答码.
|
193
|
+
RESP_CODE = "respCode";
|
194
|
+
# 应答码信息.
|
195
|
+
RESP_MSG = "respMsg";
|
196
|
+
# 新增四个报文字段merUserRegDt merUserEmail checkFlag activateStatus
|
197
|
+
# 商户端用户注册时间.
|
198
|
+
MER_USER_REG_DT = "merUserRegDt";
|
199
|
+
# 商户端用户注册邮箱.
|
200
|
+
MER_USER_EMAIL = "merUserEmail";
|
201
|
+
# 验证标识.
|
202
|
+
CHECK_FLAG = "checkFlag";
|
203
|
+
# 开通状态.
|
204
|
+
ACTIVATE_STATUS = "activateStatus";
|
205
|
+
# 加密证书ID.
|
206
|
+
ENCRYPT_CERT_ID = "encryptCertId";
|
207
|
+
# 用户MAC、IMEI串号、SSID.
|
208
|
+
USER_MAC = "userMac";
|
209
|
+
# 关联交易.
|
210
|
+
# relationTxnType = "relationTxnType";
|
211
|
+
# 短信类型
|
212
|
+
SMS_TYPE = "smsType";
|
213
|
+
# 风控信息域
|
214
|
+
RISK_CTRL_INFO = "riskCtrlInfo";
|
215
|
+
# IC卡交易信息域
|
216
|
+
IC_TRANS_DATA = "ICTransData";
|
217
|
+
# VPC交易信息域
|
218
|
+
VPC_TRANS_DATA = "VPCTransData";
|
219
|
+
# 安全类型
|
220
|
+
SECURITY_TYPE = "securityType";
|
221
|
+
# 银联订单号
|
222
|
+
TN = "tn";
|
223
|
+
# 分期付款手续费率
|
224
|
+
INSTAL_RATE = "instalRate";
|
225
|
+
# 分期付款手续费率
|
226
|
+
MCHNT_FEE_SUBSIDY = "mchntFeeSubsidy";
|
227
|
+
# 签名方法
|
228
|
+
SIGN_METHOD = "signMethod"
|
229
|
+
# 渠道类型
|
230
|
+
CHANNEL_TYPE = "channelType"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require 'meowth/config'
|
2
|
+
require 'meowth/constant'
|
3
|
+
require 'meowth/util'
|
4
|
+
require 'base64'
|
5
|
+
|
6
|
+
|
7
|
+
module Meowth
|
8
|
+
module Service
|
9
|
+
# 网关产品 消费类交易 参数
|
10
|
+
def self.create_gate_consume_params(mer_id, order_id, txn_amt)
|
11
|
+
params = {}
|
12
|
+
# 基本信息
|
13
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
14
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
15
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
16
|
+
params[Meowth::Constant::TXN_TYPE] = "01"
|
17
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "01"
|
18
|
+
params[Meowth::Constant::BIZ_TYPE] = "000201"
|
19
|
+
params[Meowth::Constant::CHANNEL_TYPE] = "07"
|
20
|
+
# 商户信息
|
21
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
22
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
23
|
+
params[Meowth::Constant::FRONT_URL] = Meowth::Config.config['front_url']
|
24
|
+
params[Meowth::Constant::BACK_URL] = Meowth::Config.config['back_url']
|
25
|
+
# 订单信息
|
26
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
27
|
+
params[Meowth::Constant::CURRENCY_CODE] = "156"
|
28
|
+
params[Meowth::Constant::TXN_AMT] = txn_amt
|
29
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
30
|
+
Meowth::Util.sign(params)
|
31
|
+
end
|
32
|
+
|
33
|
+
# 网关产品 消费撤销类交易 参数
|
34
|
+
def self.create_gate_unconsume_params(mer_id, order_id, txn_amt, orig_query_id)
|
35
|
+
params = {}
|
36
|
+
# 基本信息
|
37
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
38
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
39
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
40
|
+
params[Meowth::Constant::TXN_TYPE] = "31"
|
41
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "00"
|
42
|
+
params[Meowth::Constant::BIZ_TYPE] = "000201"
|
43
|
+
params[Meowth::Constant::CHANNEL_TYPE] = "07"
|
44
|
+
# 商户信息
|
45
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
46
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
47
|
+
params[Meowth::Constant::BACK_URL] = Meowth::Config.config['back_url']
|
48
|
+
# 订单信息
|
49
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
50
|
+
params[Meowth::Constant::TXN_AMT] = txn_amt
|
51
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
52
|
+
# 通知信息
|
53
|
+
params[Meowth::Constant::ORIG_QRY_ID] = orig_query_id
|
54
|
+
Meowth::Util.sign(params)
|
55
|
+
end
|
56
|
+
|
57
|
+
# 网关产品 退货类交易 参数
|
58
|
+
def self.create_gate_return_params(mer_id, order_id, txn_amt, orig_query_id)
|
59
|
+
params = {}
|
60
|
+
# 基本信息
|
61
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
62
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
63
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
64
|
+
params[Meowth::Constant::TXN_TYPE] = "04"
|
65
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "00"
|
66
|
+
params[Meowth::Constant::BIZ_TYPE] = "000201"
|
67
|
+
params[Meowth::Constant::CHANNEL_TYPE] = "07"
|
68
|
+
# 商户信息
|
69
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
70
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
71
|
+
params[Meowth::Constant::BACK_URL] = Meowth::Config.config['back_url']
|
72
|
+
# 订单信息
|
73
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
74
|
+
params[Meowth::Constant::TXN_AMT] = txn_amt
|
75
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
76
|
+
# 通知信息
|
77
|
+
params[Meowth::Constant::ORIG_QRY_ID] = orig_query_id
|
78
|
+
Meowth::Util.sign(params)
|
79
|
+
end
|
80
|
+
|
81
|
+
# 网关产品 交易状态查询交易 参数
|
82
|
+
def self.create_gate_query_params(mer_id, order_id, query_id)
|
83
|
+
params = {}
|
84
|
+
# 基本信息
|
85
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
86
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
87
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
88
|
+
params[Meowth::Constant::TXN_TYPE] = "00"
|
89
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "00"
|
90
|
+
params[Meowth::Constant::BIZ_TYPE] = "000201"
|
91
|
+
# 商户信息
|
92
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
93
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
94
|
+
# 订单信息
|
95
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
96
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
97
|
+
# 通知信息
|
98
|
+
params[Meowth::Constant::QUERY_ID] = query_id
|
99
|
+
Meowth::Util.sign(params)
|
100
|
+
end
|
101
|
+
|
102
|
+
# 网关产品 文件传输类交易 参数
|
103
|
+
def self.create_gate_file_params(mer_id, order_id, txn_amt, query_id)
|
104
|
+
params = {}
|
105
|
+
# 基本信息
|
106
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
107
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
108
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
109
|
+
params[Meowth::Constant::TXN_TYPE] = "76"
|
110
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "01"
|
111
|
+
params[Meowth::Constant::BIZ_TYPE] = "000000"
|
112
|
+
# 商户信息
|
113
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
114
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
115
|
+
# 订单信息
|
116
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
117
|
+
params[Meowth::Constant::FILE_TYPE] = "00"
|
118
|
+
# 通知信息
|
119
|
+
# TODO 生成环境,23点之前,是今天,23点之后为明天;测试环境,13:30之前为昨天,之后为今天
|
120
|
+
params[Meowth::Constant::SETTLE_DATE] = Time.now.strftime('%m%d')
|
121
|
+
Meowth::Util.sign(params)
|
122
|
+
end
|
123
|
+
|
124
|
+
# B2B产品 消费类交易 参数
|
125
|
+
def self.create_b2b_params(mer_id, order_id, txn_amt)
|
126
|
+
params = {}
|
127
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
128
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
129
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
130
|
+
params[Meowth::Constant::TXN_TYPE] = "01"
|
131
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "01"
|
132
|
+
params[Meowth::Constant::BIZ_TYPE] = "000202"
|
133
|
+
params[Meowth::Constant::CHANNEL_TYPE] = "07"
|
134
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
135
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
136
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
137
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
138
|
+
params[Meowth::Constant::CURRENCY_CODE] = "156"
|
139
|
+
params[Meowth::Constant::TXN_AMT] = txn_amt
|
140
|
+
params[Meowth::Constant::FRONT_URL] = Meowth::Config.config['front_url']
|
141
|
+
params[Meowth::Constant::BACK_URL] = Meowth::Config.config['back_url']
|
142
|
+
Meowth::Util.sign(params)
|
143
|
+
end
|
144
|
+
|
145
|
+
# 代付产品 实名认证 参数
|
146
|
+
def self.create_pay_params(mer_id, order_id, txn_amt, acc_no, certif_id, customer_nm, phone_no)
|
147
|
+
params = {}
|
148
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
149
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
150
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
151
|
+
params[Meowth::Constant::TXN_TYPE] = "12"
|
152
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "00"
|
153
|
+
params[Meowth::Constant::BIZ_TYPE] = "000401"
|
154
|
+
params[Meowth::Constant::CHANNEL_TYPE] = "07"
|
155
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
156
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
157
|
+
params[Meowth::Constant::BACK_URL] = Meowth::Config.config['back_url']
|
158
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
159
|
+
params[Meowth::Constant::CURRENCY_CODE] = "156"
|
160
|
+
params[Meowth::Constant::TXN_AMT] = txn_amt
|
161
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
162
|
+
params[Meowth::Constant::ACC_TYPE] = "01"
|
163
|
+
params[Meowth::Constant::ACC_NO] = Meowth::Util.encrypt(acc_no)
|
164
|
+
encrypted_info = Meowth::Util.encrypt("phoneNo=#{phone_no}")
|
165
|
+
params[Meowth::Constant::CUSTOMER_INFO] = Base64.strict_encode64("{certifId=#{certif_id}&certifTp=01&customerNm=#{customer_nm}&encryptedInfo=#{encrypted_info}}")
|
166
|
+
params[Meowth::Constant::ENCRYPT_CERT_ID] = Meowth::Config.encrypt_cert_id
|
167
|
+
Meowth::Util.sign(params)
|
168
|
+
end
|
169
|
+
|
170
|
+
# 代付产品 实名认证 参数
|
171
|
+
def self.create_real_name_params(mer_id, order_id, acc_no, certif_id, customer_nm, phone_no)
|
172
|
+
params = {}
|
173
|
+
params[Meowth::Constant::VERSION] = "5.0.0"
|
174
|
+
params[Meowth::Constant::ENCODING] = "UTF-8"
|
175
|
+
params[Meowth::Constant::SIGN_METHOD] = "01"
|
176
|
+
params[Meowth::Constant::TXN_TYPE] = "72"
|
177
|
+
params[Meowth::Constant::TXN_SUB_TYPE] = "01"
|
178
|
+
params[Meowth::Constant::BIZ_TYPE] = "000401"
|
179
|
+
params[Meowth::Constant::CHANNEL_TYPE] = "07"
|
180
|
+
params[Meowth::Constant::ACCESS_TYPE] = "0"
|
181
|
+
params[Meowth::Constant::MER_ID] = mer_id
|
182
|
+
params[Meowth::Constant::BACK_URL] = Meowth::Config.config['back_url']
|
183
|
+
params[Meowth::Constant::ORDER_ID] = order_id
|
184
|
+
params[Meowth::Constant::TXN_TIME] = Time.now.strftime('%Y%m%d%H%M%S')
|
185
|
+
params[Meowth::Constant::ACC_TYPE] = "01"
|
186
|
+
params[Meowth::Constant::ACC_NO] = Meowth::Util.encrypt(acc_no)
|
187
|
+
encrypted_info = Meowth::Util.encrypt("phoneNo=#{phone_no}")
|
188
|
+
params[Meowth::Constant::CUSTOMER_INFO] = Base64.strict_encode64("{certifId=#{certif_id}&certifTp=01&customerNm=#{customer_nm}&encryptedInfo=#{encrypted_info}}")
|
189
|
+
params[Meowth::Constant::ENCRYPT_CERT_ID] = Meowth::Config.encrypt_cert_id
|
190
|
+
Meowth::Util.sign(params)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
data/lib/meowth/util.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'base64'
|
3
|
+
require 'meowth/config'
|
4
|
+
require 'meowth/constant'
|
5
|
+
|
6
|
+
|
7
|
+
module Meowth
|
8
|
+
module Util
|
9
|
+
# 请求报文签名(sha1摘要算法)
|
10
|
+
# 插入certId字段,计算签名,再插入签名,最后返回整个请求报文
|
11
|
+
def self.sign(params)
|
12
|
+
params[Meowth::Constant::CERT_ID] = Meowth::Config.sign_cert_id
|
13
|
+
data = params.sort.map{ |k, v| "#{k}=#{v}" }.join('&')
|
14
|
+
digest = Digest::SHA1.hexdigest(data)
|
15
|
+
key = Meowth::Config.sign_cert_private_key
|
16
|
+
sign = Base64.strict_encode64(key.sign('sha1', digest))
|
17
|
+
params[Meowth::Constant::SIGNATURE] = sign
|
18
|
+
params
|
19
|
+
end
|
20
|
+
|
21
|
+
# 对响应报文签名验证(sha1摘要算法)
|
22
|
+
def self.verify(params)
|
23
|
+
sign = params[Meowth::Constant::SIGNATURE]
|
24
|
+
params.delete(Meowth::Constant::SIGNATURE)
|
25
|
+
data = params.sort.map{ |k, v| "#{k}=#{v}" }.join('&')
|
26
|
+
digest = Digest::SHA1.hexdigest(data)
|
27
|
+
key = Meowth::Config.verify_sign_cert_public_key
|
28
|
+
key.verify('sha1', Base64.strict_decode64(sign), digest)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def self.encrypt_pin(pin, card)
|
33
|
+
len = "%02d" % pin.length
|
34
|
+
tmp = len + pin + "F" * (14 - pin.length)
|
35
|
+
pin_byte = [tmp].pack("H*")
|
36
|
+
card_no = "0" * (13 - card.length) + card
|
37
|
+
tmp = "0000" + card_no[0..11]
|
38
|
+
card_byte = [tmp].pack("H*")
|
39
|
+
c = pin_byte.bytes.zip(card_byte.bytes).map{ |a, b| a ^ b }.pack('c*')
|
40
|
+
public_key = Meowth::Config.encrypt_cert_public_key
|
41
|
+
Base64.strict_encode64(public_key.public_encrypt(c))
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.encrypt(plain_text)
|
45
|
+
public_key = Meowth::Config.encrypt_cert_public_key
|
46
|
+
Base64.strict_encode64(public_key.public_encrypt(plain_text))
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.decrypt(ciper_text)
|
50
|
+
private_key = Meowth::Config.sign_cert_private_key
|
51
|
+
private_key.private_decrypt(Base64.strict_decode64(ciper_text))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/meowth.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'meowth/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "meowth"
|
8
|
+
spec.version = Meowth::VERSION
|
9
|
+
spec.authors = ["Jack Pan"]
|
10
|
+
spec.email = ["i@jackpan.me"]
|
11
|
+
|
12
|
+
spec.summary = %q{Ruby port of Union Pay SDK.}
|
13
|
+
spec.description = %q{Ruby port of Union Pay SDK. Because Union Pay only offers Java, PHP and .NET SDK. I write Ruby port based on Java SDK.}
|
14
|
+
spec.homepage = "https://github.com/junzhepan/meowth"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
+
spec.add_development_dependency "rest-client"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: meowth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jack Pan
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.14'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rest-client
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Ruby port of Union Pay SDK. Because Union Pay only offers Java, PHP and
|
70
|
+
.NET SDK. I write Ruby port based on Java SDK.
|
71
|
+
email:
|
72
|
+
- i@jackpan.me
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- ".rspec"
|
79
|
+
- ".travis.yml"
|
80
|
+
- CODE_OF_CONDUCT.md
|
81
|
+
- Gemfile
|
82
|
+
- LICENSE.txt
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- bin/console
|
86
|
+
- bin/setup
|
87
|
+
- config/meowth.yml
|
88
|
+
- data/test/acp_test_enc.cer
|
89
|
+
- data/test/acp_test_middle.cer
|
90
|
+
- data/test/acp_test_root.cer
|
91
|
+
- data/test/acp_test_sign.pfx
|
92
|
+
- data/test/acp_test_verify_sign.cer
|
93
|
+
- lib/generators/meowth/install_generator.rb
|
94
|
+
- lib/generators/meowth/templates/config/meowth.yml
|
95
|
+
- lib/meowth/config.rb
|
96
|
+
- lib/meowth/constant.rb
|
97
|
+
- lib/meowth/service.rb
|
98
|
+
- lib/meowth/util.rb
|
99
|
+
- lib/meowth/version.rb
|
100
|
+
- meowth.gemspec
|
101
|
+
homepage: https://github.com/junzhepan/meowth
|
102
|
+
licenses:
|
103
|
+
- MIT
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 2.5.1
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: Ruby port of Union Pay SDK.
|
125
|
+
test_files: []
|