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.
@@ -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: []