paymax1 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Paymax1
2
+ VERSION = "1.0.0"
3
+ 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: []