qtpay 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .idea
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+
20
+ .DS_Store
21
+ .ruby-gemset
22
+ .ruby-version
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in alipay.gemspec
4
+ gemspec
@@ -0,0 +1,106 @@
1
+ module Qtpay
2
+ module Service
3
+
4
+ # ==== params ====
5
+ # (required)
6
+ # out_user: customer uniq id
7
+ #
8
+ # (optional)
9
+ # mobile: customer mobile number
10
+ # weixin_openid: WeiXin open id
11
+ # mchnt_id: merchant id
12
+ # out_mchnt: developer defined merchant id
13
+ # expires: token expires time in seconds (default 86400)
14
+
15
+ def self.get_user_token(params, options = {})
16
+ make_request(:get, get_user_token_url(params, options))
17
+ end
18
+
19
+ # ==== params ====
20
+ # (required)
21
+ # total_amt: total payment amount in cents
22
+ # out_sn: order serial number, must be uniq in all requests
23
+ #
24
+ # (optional)
25
+ # mchnt_id: merchant id
26
+ # out_mchnt: developer defined merchant id
27
+ # token: auth token created in get_user_token
28
+ # qrcode:
29
+ # openid: openid when creating qrcode
30
+ # expire_time: order expires time, format YYYY-mm-dd HH:MM:SS
31
+
32
+ def self.create_pre_order(params, options = {})
33
+ make_request(:post, create_pre_order_url(params, options))
34
+ end
35
+
36
+ GET_USER_TOKEN_REQUIRED_PARAMS = %w( out_user )
37
+ def self.get_user_token_url(params, options = {})
38
+ params = Utils.stringify_keys(params)
39
+ check_required_params(params, GET_USER_TOKEN_REQUIRED_PARAMS)
40
+
41
+ params = {
42
+ 'caller' => 'server',
43
+ 'app_code' => options[:app_code] || Qtpay.app_code,
44
+ }.merge(params)
45
+
46
+ request_uri('/auth/v1/token', params, options)
47
+ end
48
+
49
+ CREATE_PRE_ORDER_REQUIRED_PARAMS = %w( total_amt out_sn )
50
+ def self.create_pre_order_url(params, options = {})
51
+ params = Utils.stringify_keys(params)
52
+ check_required_params(params, CREATE_PRE_ORDER_REQUIRED_PARAMS)
53
+
54
+ params = {
55
+ 'caller' => 'server',
56
+ 'app_code' => options[:app_code] || Qtpay.app_code,
57
+ }.merge(params)
58
+
59
+ request_uri('/order/v1/pre_create', params, options)
60
+ end
61
+
62
+ def self.request_uri(path, params, options = {})
63
+ uri = URI("#{Qtpay.gateway_url}#{path}")
64
+ uri.query = URI.encode_www_form(sign_params(params, options))
65
+ uri
66
+ end
67
+
68
+ def self.sign_params(params, options = {})
69
+ params.merge(
70
+ 'sign' => Qtpay::Sign.generate(params, options)
71
+ )
72
+ end
73
+
74
+ def self.check_required_params(params, names)
75
+ return if !Qtpay.debug_mode?
76
+
77
+ names.each do |name|
78
+ warn("Qtpay Warn: missing required option: #{name}") unless params.has_key?(name)
79
+ end
80
+ end
81
+
82
+ def self.make_request(request_type, url)
83
+ request_type = case request_type
84
+ when :get
85
+ :get_response
86
+ when :post
87
+ :post_form
88
+ else
89
+ request_type
90
+ end
91
+
92
+ if request_type == :get_response
93
+ res = Net::HTTP.send(request_type, url)
94
+ else
95
+ res = Net::HTTP.send(request_type, url, {})
96
+ end
97
+ if res.respond_to?(:body)
98
+ JSON.parse(res.body)
99
+ else # unknown error
100
+ res
101
+ end
102
+
103
+ end
104
+ end
105
+
106
+ end
data/lib/qtpay/sign.rb ADDED
@@ -0,0 +1,32 @@
1
+ module Qtpay
2
+ module Sign
3
+ def self.generate(params, options = {})
4
+ params = Utils.stringify_keys(params)
5
+ key = options[:server_key] || Qtpay.server_key
6
+ string = params_to_string(params)
7
+
8
+ sign(key, string)
9
+
10
+ end
11
+
12
+ def self.verify?(params, options = {})
13
+ params = Utils.stringify_keys(params)
14
+
15
+ sign_type = params.delete('sign_type')
16
+ sign = params.delete('sign')
17
+ string = params_to_string(params)
18
+
19
+ key = options[:server_key] || Qtpay.server_key
20
+
21
+ sign == sign(key, string)
22
+ end
23
+
24
+ def self.sign(key, string)
25
+ Digest::MD5.hexdigest("#{string}#{key}")
26
+ end
27
+
28
+ def self.params_to_string(params)
29
+ params.sort.map { |item| item.join('=') }.join('&')
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ module Qtpay
2
+ module Utils
3
+ def self.stringify_keys(hash)
4
+ new_hash = {}
5
+ hash.each do |key, value|
6
+ new_hash[(key.to_s rescue key) || key] = value
7
+ end
8
+ new_hash
9
+ end
10
+
11
+ def self.to_cents(dollars)
12
+ (dollars.to_d * 100).ceil
13
+
14
+ end
15
+
16
+ def self.to_dollars(cents)
17
+ cents.to_d / 100.0
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module Qtpay
2
+ VERSION = '0.0.1'
3
+ end
data/lib/qtpay.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'net/http'
2
+ require 'cgi'
3
+ require 'qtpay/version'
4
+ require 'qtpay/utils'
5
+ require 'qtpay/sign'
6
+ require 'qtpay/service'
7
+
8
+ module Qtpay
9
+ @debug_mode = true
10
+ @env = 'sandbox'
11
+
12
+ class << self
13
+ attr_accessor :app_code, :server_key, :env, :debug_mode
14
+
15
+ def debug_mode?
16
+ !!@debug_mode
17
+ end
18
+
19
+ def gateway_url
20
+ if @env == 'live'
21
+ 'https://qtapi.qfpay.com'
22
+ else
23
+ 'https://qtsandbox.qfpay.com'
24
+ end
25
+ end
26
+ end
27
+
28
+ end
data/qtpay.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'qtpay/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "qtpay"
8
+ spec.version = Qtpay::VERSION
9
+ spec.authors = ["April Tsang"]
10
+ spec.email = ["april@tofugear.com"]
11
+ spec.description = %q{An unofficial simple qtpay gem}
12
+ spec.summary = %q{An unofficial simple qtpay gem}
13
+ spec.homepage = "https://github.com/tofugear/qtpay"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "minitest"
24
+ spec.add_development_dependency "fakeweb"
25
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qtpay
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - April Tsang
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-12-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: fakeweb
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: An unofficial simple qtpay gem
79
+ email:
80
+ - april@tofugear.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - Gemfile
87
+ - lib/qtpay.rb
88
+ - lib/qtpay/service.rb
89
+ - lib/qtpay/sign.rb
90
+ - lib/qtpay/utils.rb
91
+ - lib/qtpay/version.rb
92
+ - qtpay.gemspec
93
+ homepage: https://github.com/tofugear/qtpay
94
+ licenses:
95
+ - MIT
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 1.8.23
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: An unofficial simple qtpay gem
118
+ test_files: []