paymax1 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|