paymax1 1.0.0
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 +7 -0
- data/example/test_paymax.rb +60 -0
- data/lib/paymax1.rb +31 -0
- data/lib/paymax1/charge.rb +43 -0
- data/lib/paymax1/config.rb +45 -0
- data/lib/paymax1/exception.rb +34 -0
- data/lib/paymax1/face.rb +20 -0
- data/lib/paymax1/header.rb +31 -0
- data/lib/paymax1/http.rb +81 -0
- data/lib/paymax1/refund.rb +33 -0
- data/lib/paymax1/sign.rb +46 -0
- data/lib/paymax1/version.rb +3 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 478bb1016c15028e17dd700f2ef25707b9147a9c
|
4
|
+
data.tar.gz: d9f5d5f0774602f5679deccf6771e3da5a568faf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cdb977e5cfe0f52e218d998e4f7f471742defb01cc51e26d8625396e345208079186eb263ec18cdad4ed08a4cd55e4aac7e23d1c0991bc054c9957e545997d87
|
7
|
+
data.tar.gz: 4c17e6441f68695a608c8a50e44773aa38da1443a916763f56db0f462bd6d6d55d36b4ae98f48193032c91af2fbc480ff247b5da82adbe69a9c6078240d0401d
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
|
3
|
+
require 'paymax1'
|
4
|
+
|
5
|
+
def randomSerize( len )
|
6
|
+
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
|
7
|
+
newpass = ""
|
8
|
+
1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
|
9
|
+
return newpass
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
Paymax1.establish_connection! :rsa_private_key_path => 'rsa_private_key.pem',
|
14
|
+
:paymax_rsa_public_key_path => 'paymax_rsa_public_key.pem',
|
15
|
+
:secret_key => 'b3fc21858fa5424cafecd338252b155c'
|
16
|
+
#下单支付
|
17
|
+
=begin
|
18
|
+
result = Paymax1::Charge.createCharge(
|
19
|
+
{
|
20
|
+
:amount=>'0.01',
|
21
|
+
:subject=> 'test_subject_nodejs版本',
|
22
|
+
:body=> 'this is a body',
|
23
|
+
:order_no=> randomSerize(20),
|
24
|
+
:channel=> 'alipay_app',
|
25
|
+
:client_ip=> '127.0.0.1',
|
26
|
+
:app=> 'app_06m9Q26zL61ee55a',
|
27
|
+
:currency=> 'cny',
|
28
|
+
:extra=> {},
|
29
|
+
:description=> 'this is a description描述'
|
30
|
+
}
|
31
|
+
)
|
32
|
+
=end
|
33
|
+
#支付查询
|
34
|
+
result = Paymax1::Charge.queryCharge('ch_fbe2d2675043004b02303b6a')
|
35
|
+
|
36
|
+
#发起退款
|
37
|
+
=begin
|
38
|
+
result = Paymax1::Refund.createRefund(
|
39
|
+
'ch_a59123a1538074f3cfa6568b',
|
40
|
+
{
|
41
|
+
:amount => '0.01',
|
42
|
+
:description => 'this is a description',
|
43
|
+
:extra => {}
|
44
|
+
}
|
45
|
+
)
|
46
|
+
=end
|
47
|
+
#退款查询
|
48
|
+
=begin
|
49
|
+
result = Paymax1::Refund.queryRefund(
|
50
|
+
{
|
51
|
+
:chargeNo => 'ch_a59123a1538074f3cfa6568b',
|
52
|
+
:refundNo => 're_d6586ff6e077b95985344538'
|
53
|
+
}
|
54
|
+
)
|
55
|
+
=end
|
56
|
+
# 人脸识别:查询用户识别信息
|
57
|
+
#result = Paymax1::Face.queryFaceAuth('123')
|
58
|
+
|
59
|
+
#打印出返回的状态码和信息
|
60
|
+
puts "返回结果===="+result
|
data/lib/paymax1.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Paymax1
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'paymax1/version'
|
4
|
+
require 'paymax1/config'
|
5
|
+
require 'paymax1/charge'
|
6
|
+
require 'paymax1/refund'
|
7
|
+
require 'paymax1/face'
|
8
|
+
require 'paymax1/exception'
|
9
|
+
require 'paymax1/http'
|
10
|
+
require 'paymax1/sign'
|
11
|
+
require 'paymax1/header'
|
12
|
+
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
def establish_connection!(opts = {})
|
17
|
+
Config.initialize_connect(opts)
|
18
|
+
end
|
19
|
+
|
20
|
+
def createCharge (opts={})
|
21
|
+
return Charge.createCharge(opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
def queryCharge (orderNo)
|
25
|
+
return Charge.createCharge(orderNo)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Paymax1
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Charge
|
6
|
+
class << self
|
7
|
+
|
8
|
+
#
|
9
|
+
#下单接口
|
10
|
+
#opts={
|
11
|
+
# :amount=>'0.01',
|
12
|
+
# :subject=> 'test_subject_nodejs版本',
|
13
|
+
# :body=> 'this is a body',
|
14
|
+
# :order_no=> randomSerize(20),
|
15
|
+
# :channel=> 'alipay_app',
|
16
|
+
# :client_ip=> '127.0.0.1',
|
17
|
+
# :app=> 'app_06m9Q26zL61ee55a',
|
18
|
+
# :currency=> 'cny',
|
19
|
+
# :extra=> {},
|
20
|
+
# :description=> 'this is a description描述'
|
21
|
+
#}
|
22
|
+
#
|
23
|
+
def createCharge (opts={})
|
24
|
+
path='/v1/charges'
|
25
|
+
data=opts.to_json
|
26
|
+
url= Config.settings[:host]+path
|
27
|
+
header= Header.new().getHeader('post',path,'',data);
|
28
|
+
return Http.post(url,header,data);
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
#下单查询接口
|
33
|
+
#param orderNo
|
34
|
+
#
|
35
|
+
def queryCharge (orderNo)
|
36
|
+
path='/v1/charges/'+orderNo
|
37
|
+
url= Config.settings[:host]+path
|
38
|
+
header= Header.new().getHeader('get',path,'','');
|
39
|
+
return Http.get(url,header);
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Paymax1
|
2
|
+
module Config
|
3
|
+
class << self
|
4
|
+
|
5
|
+
DEFAULT_OPTIONS = {
|
6
|
+
:host => 'http://172.30.21.20:9001',
|
7
|
+
# :host => 'https://www.paymax.cc/merchant-api/v1/',
|
8
|
+
:rsa_private_key_path => '',
|
9
|
+
:secret_key => '',
|
10
|
+
:paymax_rsa_public_key_path => ''
|
11
|
+
}
|
12
|
+
UA={
|
13
|
+
:'lang' => 'ruby',
|
14
|
+
:'publisher' => 'Paymax',
|
15
|
+
:'sdk-version' => VERSION.to_s,
|
16
|
+
}
|
17
|
+
|
18
|
+
REQUIRED_OPTION_KEYS = [:rsa_private_key_path, :secret_key,:paymax_rsa_public_key_path]
|
19
|
+
|
20
|
+
attr_reader :settings,:user_agent
|
21
|
+
|
22
|
+
#初始化配置
|
23
|
+
def initialize_connect options = {}
|
24
|
+
@user_agent = UA
|
25
|
+
@user_agent.store('os.platform',os_family())
|
26
|
+
@settings = DEFAULT_OPTIONS.merge!(options)
|
27
|
+
REQUIRED_OPTION_KEYS.each do |opt|
|
28
|
+
raise MissingArgsException, [opt] unless settings.has_key?(opt)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def os_family
|
33
|
+
case RUBY_PLATFORM
|
34
|
+
when /ix/i, /ux/i, /gnu/i, /sysv/i, /solaris/i,/sunos/i, /bsd/i
|
35
|
+
"unix"
|
36
|
+
when /win/i, /ming/i
|
37
|
+
"windows"
|
38
|
+
else
|
39
|
+
"other"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Paymax1
|
2
|
+
|
3
|
+
class Exception < RuntimeError
|
4
|
+
attr_reader :message
|
5
|
+
|
6
|
+
def initialize(message)
|
7
|
+
@message = message
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class AuthorizationException < Exception
|
12
|
+
def initialize(message)
|
13
|
+
super(message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class InvalidRequestException < Exception
|
18
|
+
def initialize(message)
|
19
|
+
super(message)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class InvalidResponseException < Exception
|
24
|
+
def initialize(message)
|
25
|
+
super(message)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class MissingArgsException < Exception
|
30
|
+
def initialize(message)
|
31
|
+
super(message)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/paymax1/face.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Paymax1
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Face
|
6
|
+
class << self
|
7
|
+
|
8
|
+
#
|
9
|
+
#人脸识别接口--查询用户识别信息
|
10
|
+
#param userId
|
11
|
+
#
|
12
|
+
def queryFaceAuth (userId)
|
13
|
+
path='/v1/face/auth/'+userId
|
14
|
+
url= Config.settings[:host]+path
|
15
|
+
header= Header.new().getHeader('get',path,'','');
|
16
|
+
return Http.get(url,header);
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Paymax1
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
class Header
|
6
|
+
|
7
|
+
#
|
8
|
+
#拼装请求头header
|
9
|
+
#
|
10
|
+
def getHeader (method,path,query,request_data)
|
11
|
+
header= {
|
12
|
+
:Authorization => Config.settings[:secret_key],
|
13
|
+
:nonce=>randomSerize(32),
|
14
|
+
:timestamp=>(Time.new().to_f * 1000).to_i,
|
15
|
+
:UA=>Config.user_agent.to_json
|
16
|
+
}
|
17
|
+
header.store('sign',Sign.requestSign(method,header,path,query,request_data))
|
18
|
+
return header
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
#header-nonce生成器
|
23
|
+
#
|
24
|
+
def randomSerize( len )
|
25
|
+
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
|
26
|
+
randomStr = ""
|
27
|
+
1.upto(len) { |i| randomStr << chars[rand(chars.size-1)] }
|
28
|
+
return randomStr
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/paymax1/http.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
module Paymax1
|
2
|
+
require 'rest-client'
|
3
|
+
require 'time'
|
4
|
+
require 'json'
|
5
|
+
require 'uri'
|
6
|
+
require 'net/http'
|
7
|
+
|
8
|
+
module Http
|
9
|
+
class << self
|
10
|
+
|
11
|
+
#合法响应时间:2分钟内
|
12
|
+
@@VALID_RESPONSE_TTL=2*60*1000;
|
13
|
+
|
14
|
+
def get (url, header = {})
|
15
|
+
# 配置请求Header
|
16
|
+
req_headers = {
|
17
|
+
:'Content-Type' => 'application/json;charset=utf-8',
|
18
|
+
:'content-length' => 0,
|
19
|
+
:'Authorization' => header[:Authorization],
|
20
|
+
:'nonce' => header[:nonce],
|
21
|
+
:'timestamp' => header[:timestamp],
|
22
|
+
:'sign' => header['sign'],
|
23
|
+
:'X-Paymax-Client-User-Agent' => header[:UA]
|
24
|
+
}
|
25
|
+
|
26
|
+
# 发送请求
|
27
|
+
puts 'url::'+url
|
28
|
+
|
29
|
+
begin
|
30
|
+
response = RestClient.get(url, req_headers)
|
31
|
+
rescue => e #responseCode>400
|
32
|
+
return e.response
|
33
|
+
end
|
34
|
+
|
35
|
+
self.checkResponse response
|
36
|
+
return response
|
37
|
+
|
38
|
+
end # get
|
39
|
+
|
40
|
+
|
41
|
+
def post (url, header = {},req_body)
|
42
|
+
# 配置请求Header
|
43
|
+
req_headers = {
|
44
|
+
:'Content-Type' => 'application/json;charset=utf-8',
|
45
|
+
:'Authorization' => header[:Authorization],
|
46
|
+
:'nonce' => header[:nonce],
|
47
|
+
:'timestamp' => header[:timestamp],
|
48
|
+
:'sign' => header['sign'],
|
49
|
+
:'X-Paymax-Client-User-Agent' => header[:UA]
|
50
|
+
}
|
51
|
+
|
52
|
+
# 发送请求
|
53
|
+
begin
|
54
|
+
response = RestClient.post(url, req_body.to_s, req_headers)
|
55
|
+
self.checkResponse response
|
56
|
+
return response.body
|
57
|
+
rescue => e
|
58
|
+
return e.response
|
59
|
+
end
|
60
|
+
end # post
|
61
|
+
|
62
|
+
def checkResponse response
|
63
|
+
|
64
|
+
isVerify = Sign.responseSignVerify(response.headers,response.body);
|
65
|
+
if !isVerify then
|
66
|
+
raise AuthorizationException.new('Invalid Response.[Response Data And Sign Verify Failure.]')
|
67
|
+
end
|
68
|
+
|
69
|
+
if @@VALID_RESPONSE_TTL.to_i+response.headers[:timestamp].to_i<(Time.new().to_f * 1000).to_i then
|
70
|
+
raise InvalidResponseException('Invalid Response.[Response Time Is Invalid.]')
|
71
|
+
end
|
72
|
+
|
73
|
+
if !Config.settings[:secret_key].to_s == response.headers[:authorization].to_s then
|
74
|
+
raise InvalidResponseException('Invalid Response.[Secret Key Is Invalid.]')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Paymax1
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Refund
|
6
|
+
class << self
|
7
|
+
|
8
|
+
#
|
9
|
+
#退款接口
|
10
|
+
#param chargeNo
|
11
|
+
#param data
|
12
|
+
#
|
13
|
+
def createRefund (chargeNo,data)
|
14
|
+
path='/v1/charges/'+chargeNo.to_s+'/refunds'
|
15
|
+
data=data.to_json
|
16
|
+
url= Config.settings[:host]+path
|
17
|
+
header= Header.new().getHeader('post',path,'',data);
|
18
|
+
return Http.post(url,header,data);
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
#退款查询
|
23
|
+
#param data
|
24
|
+
#
|
25
|
+
def queryRefund (data={})
|
26
|
+
path='/v1/charges/'+data[:chargeNo].to_s+'/refunds/'+data[:refundNo].to_s
|
27
|
+
url= Config.settings[:host]+path
|
28
|
+
header= Header.new().getHeader('get',path,'','');
|
29
|
+
return Http.get(url,header);
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/paymax1/sign.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Paymax1
|
2
|
+
require 'openssl'
|
3
|
+
require 'base64'
|
4
|
+
module Sign
|
5
|
+
class << self
|
6
|
+
|
7
|
+
# 请求消息签名
|
8
|
+
def requestSign (method,header,path,query_string,request_data)
|
9
|
+
message = method+"\n" +path+ "\n" + query_string + "\n"+header[:nonce]+"\n"+header[:timestamp].to_s+"\n" + header[:Authorization]+"\n" + request_data.to_s
|
10
|
+
return rsa_sign(message)
|
11
|
+
end
|
12
|
+
|
13
|
+
#响应消息验签
|
14
|
+
def responseSignVerify (header,response_data)
|
15
|
+
message = header[:nonce].to_s+"\n"+header[:timestamp].to_s+"\n" + header[:authorization].to_s+"\n" + response_data.to_s
|
16
|
+
return verify(message,header[:sign])
|
17
|
+
end
|
18
|
+
|
19
|
+
#RSA签名
|
20
|
+
def rsa_sign (for_sign_string)
|
21
|
+
#读取私钥文件
|
22
|
+
rsa_private_key_file = File.read( Config.settings[:rsa_private_key_path])
|
23
|
+
#转换为openssl密钥
|
24
|
+
openssl_key = OpenSSL::PKey::RSA.new rsa_private_key_file
|
25
|
+
#使用openssl方法进行sha1签名digest(不能用sha256)
|
26
|
+
digest = OpenSSL::Digest::SHA1.new
|
27
|
+
signature = openssl_key.sign digest, for_sign_string.force_encoding("utf-8")
|
28
|
+
#base64编码
|
29
|
+
signature = Base64.strict_encode64(signature)
|
30
|
+
return signature
|
31
|
+
end
|
32
|
+
|
33
|
+
#验签
|
34
|
+
def verify (for_sign_string, signed_string)
|
35
|
+
#读取公钥文件
|
36
|
+
rsa_public_key_file = File.read( Config.settings[:paymax_rsa_public_key_path])
|
37
|
+
#转换为RSA对象
|
38
|
+
openssl_public = OpenSSL::PKey::RSA.new rsa_public_key_file
|
39
|
+
#生成SHA1密钥串
|
40
|
+
digest = OpenSSL::Digest::SHA1.new
|
41
|
+
#openssl验证签名
|
42
|
+
openssl_public.verify(digest, Base64.strict_decode64(signed_string), for_sign_string)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: paymax1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- liang.wang
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.8'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rest-client
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.8.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.8.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.10'
|
69
|
+
description: 'Paymax Server SDK for Ruby. See: https://github.com/paymax/paymax-doc'
|
70
|
+
email:
|
71
|
+
- liang.wang@zhulebei.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- example/test_paymax.rb
|
77
|
+
- lib/paymax1.rb
|
78
|
+
- lib/paymax1/charge.rb
|
79
|
+
- lib/paymax1/config.rb
|
80
|
+
- lib/paymax1/exception.rb
|
81
|
+
- lib/paymax1/face.rb
|
82
|
+
- lib/paymax1/header.rb
|
83
|
+
- lib/paymax1/http.rb
|
84
|
+
- lib/paymax1/refund.rb
|
85
|
+
- lib/paymax1/sign.rb
|
86
|
+
- lib/paymax1/version.rb
|
87
|
+
homepage: https://github.com/paymax/paymax-server-sdk-ruby
|
88
|
+
licenses:
|
89
|
+
- MIT
|
90
|
+
metadata: {}
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.4.5.1
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: Paymax Server SDK for Ruby
|
111
|
+
test_files: []
|