yeepay 0.1.9
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/.gitignore +12 -0
- data/.travis.yml +3 -0
- data/Gemfile +6 -0
- data/README.md +135 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/yeepay.rb +18 -0
- data/lib/yeepay/service.rb +98 -0
- data/lib/yeepay/service/card.rb +39 -0
- data/lib/yeepay/version.rb +3 -0
- data/yeepay.gemspec +32 -0
- metadata +98 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 99ff51b58c0b04ef39766d8b5fa17cd7cbb38e7f
|
4
|
+
data.tar.gz: 670e56c778fa0ec615ea8419ed8df16591b9aa4f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 17c9ae559425fd8e3b419f3cd89eefc3483dd7dadf098b56afbf27372ac101b868ae7ba4ef4667735402dc7bdd64027ed53a5eb2fa8ff55255cb6d99bb4fb5bb
|
7
|
+
data.tar.gz: 38fd112c956e2af0441eef04dcae57af0c0b7b254afaae459151be704e41187fca5d60c187bd496e58a3316976ffc2b84d1210b511a7bbcc7adb927d7709b0b1
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
# Yeepay
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/yeepay`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'ruby-hmac'
|
13
|
+
gem 'yeepay', github: 'mumaoxi/yeepay'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install yeepay
|
23
|
+
|
24
|
+
## Configuration
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
Yeepay.p1_mer_id = 'YOUR_MER_ID' #商户编号
|
28
|
+
Yeepay.merchant_key = 'YOUR_MERCHANT_KEY' #商户密钥
|
29
|
+
|
30
|
+
#Yeepay.debug_mode = true # Enable parameter check. Default is true.
|
31
|
+
```
|
32
|
+
|
33
|
+
|
34
|
+
## Service
|
35
|
+
|
36
|
+
### 充值卡支付接口
|
37
|
+
|
38
|
+
#### Name
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
create_trade
|
42
|
+
```
|
43
|
+
|
44
|
+
#### Definition
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
Yeepay::Service::Card.create_trade({OPTIONS})
|
48
|
+
```
|
49
|
+
|
50
|
+
#### Example
|
51
|
+
```ruby
|
52
|
+
options = {
|
53
|
+
out_trade_no: DateTime.now.strftime('%Y%m%d%H%M%S')+Random.rand(1000).to_s,
|
54
|
+
total_fee: 150,
|
55
|
+
verify_fee: true,
|
56
|
+
notify_url: 'http://example.com/pays/yeepay_notify',
|
57
|
+
cards: [
|
58
|
+
{amt: 50,
|
59
|
+
no: '123456',
|
60
|
+
pwd: '654321'
|
61
|
+
},
|
62
|
+
{amt: 100,
|
63
|
+
no: '123',
|
64
|
+
pwd: '654'
|
65
|
+
}
|
66
|
+
],
|
67
|
+
frp_id: 'SZX'
|
68
|
+
|
69
|
+
}
|
70
|
+
Yeepay::Service::Card.create_trade(options)
|
71
|
+
# => '{:r0_Cmd=>"ChargeCardDirect", :r1_Code=>"1", :r6_Order=>"20150415150818837", :rq_ReturnMsg=>"提交成功!", :hmac=>"ba06a390eb8f487d84282da5fb90b862"}'
|
72
|
+
```
|
73
|
+
|
74
|
+
#### Options
|
75
|
+
|
76
|
+
| Key | Requirement | Description |
|
77
|
+
| --- | ----------- | ----------- |
|
78
|
+
| out_trade_no | required | Order id in your application. |
|
79
|
+
| total_fee | required | Order item's price. |
|
80
|
+
| verify_fee | required | whether check price between cards and order. |
|
81
|
+
| notify_url | required | Yeepay asyn notify url. |
|
82
|
+
| frp_id | required | Pay channel id |
|
83
|
+
|
84
|
+
This is not a complete list of arguments, please read official document: http://www.yeepay.com .
|
85
|
+
|
86
|
+
|
87
|
+
### 充值卡支付通知接口
|
88
|
+
|
89
|
+
#### Name
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
verify?
|
93
|
+
```
|
94
|
+
|
95
|
+
#### Definition
|
96
|
+
```ruby
|
97
|
+
Yeepay::Service::Card.verify?({OPTIONS})
|
98
|
+
```
|
99
|
+
|
100
|
+
### Example
|
101
|
+
```ruby
|
102
|
+
options = {
|
103
|
+
r0_Cmd: 'ChargeCardDirect',
|
104
|
+
r1_Code: '2',
|
105
|
+
p1_MerId: '10012367775',
|
106
|
+
p2_Order: '20150415123733472',
|
107
|
+
p3_Amt: '0.0',
|
108
|
+
p4_FrpId: 'SZX',
|
109
|
+
p5_CardNo: '123,123456',
|
110
|
+
p6_confirmAmount: '0.0,0.0',
|
111
|
+
p7_realAmount: '0.0,0.0',
|
112
|
+
p8_cardStatus: '7,7',
|
113
|
+
p9_MP: '',
|
114
|
+
pb_BalanceAmt: '',
|
115
|
+
pc_BalanceAct: '',
|
116
|
+
r2_TrxId: '',
|
117
|
+
hmac: '654b58ece9b4377eaad4c1ebb013a668'
|
118
|
+
}
|
119
|
+
Yeepay::Service::Card.verify?(options)
|
120
|
+
# => true
|
121
|
+
```
|
122
|
+
|
123
|
+
## Development
|
124
|
+
|
125
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
126
|
+
|
127
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
128
|
+
|
129
|
+
## Contributing
|
130
|
+
|
131
|
+
1. Fork it ( https://github.com/[my-github-username]/yeepay/fork )
|
132
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
133
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
134
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
135
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "yeepay"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/lib/yeepay.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'hmac-md5'
|
4
|
+
require 'yeepay/version'
|
5
|
+
require 'yeepay/service'
|
6
|
+
require 'yeepay/service/card'
|
7
|
+
|
8
|
+
module Yeepay
|
9
|
+
class << self
|
10
|
+
attr_accessor :p1_mer_id
|
11
|
+
attr_accessor :merchant_key
|
12
|
+
attr_writer :debug_mode
|
13
|
+
|
14
|
+
def debug_mode?
|
15
|
+
@debug_mode.nil? ? true : !!@debug_mode
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Yeepay
|
2
|
+
module Service
|
3
|
+
GATEWAY_URL = 'https://www.yeepay.com/app-merchant-proxy/command.action'
|
4
|
+
|
5
|
+
#参数签名
|
6
|
+
def self.hmac_md5_sign(options={})
|
7
|
+
warn("options #{options}")
|
8
|
+
HMAC::MD5.hexdigest(Yeepay.merchant_key, options.values.join(''))
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.string_key2_sym(options={})
|
12
|
+
options.inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo }
|
13
|
+
end
|
14
|
+
|
15
|
+
module Card
|
16
|
+
|
17
|
+
#提交支付返回的错误代码
|
18
|
+
SUBMIT_ERROR_CODES = {
|
19
|
+
-100 => '卡面额与订单金额不符',
|
20
|
+
-1 => '签名较验失败或未知错误',
|
21
|
+
1 => '提交成功!',
|
22
|
+
2 => '卡密成功处理过或者提交卡号过于频繁',
|
23
|
+
5 => '卡数量过多,目前最多支持10张卡',
|
24
|
+
7 => '支付卡密无效!',
|
25
|
+
11 => '订单号重复',
|
26
|
+
66 => '支付金额有误',
|
27
|
+
95 => '支付方式未开通',
|
28
|
+
112 => '业务状态不可用,未开通此类卡业务',
|
29
|
+
8001 => '卡面额组填写错误',
|
30
|
+
8002 => '卡号密码为空或者数量不相等',
|
31
|
+
2005 => '卡密已经成功处理过,不能重复使用'
|
32
|
+
}
|
33
|
+
|
34
|
+
#校验卡的支付金额
|
35
|
+
def self.card_fee_ok?(options={})
|
36
|
+
if options[:verify_fee]
|
37
|
+
card_total_fee = options[:cards].collect { |card| card[:amt] }.inject(:+)
|
38
|
+
warn("\ncard_total_fee:#{card_total_fee.to_f},order_total_fee:#{options[:total_fee].to_f}")
|
39
|
+
unless options[:total_fee].to_f == card_total_fee.to_f
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
true
|
44
|
+
end
|
45
|
+
|
46
|
+
#组合发起支付请求的必要参数
|
47
|
+
def self.gen_params(options={})
|
48
|
+
{
|
49
|
+
:p0_Cmd => 'ChargeCardDirect',
|
50
|
+
:p1_MerId => Yeepay.p1_mer_id,
|
51
|
+
:p2_Order => options[:out_trade_no],
|
52
|
+
:p3_Amt => options[:total_fee],
|
53
|
+
:p4_verifyAmt => options[:verify_fee],
|
54
|
+
:p8_Url => options[:notify_url],
|
55
|
+
:pa7_cardAmt => options[:cards].collect { |card| card[:amt] }.join(','),
|
56
|
+
:pa8_cardNo => options[:cards].collect { |card| card[:no] }.join(','),
|
57
|
+
:pa9_cardPwd => options[:cards].collect { |card| card[:pwd] }.join(','),
|
58
|
+
:pd_FrpId => options[:frp_id],
|
59
|
+
:pr_NeedResponse => '1',
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
#获取返回的需要验证的参数
|
64
|
+
def self.res_verifying_params(options={})
|
65
|
+
memo = {}
|
66
|
+
[:r0_Cmd,
|
67
|
+
:r1_Code,
|
68
|
+
:p1_MerId,
|
69
|
+
:p2_Order,
|
70
|
+
:p3_Amt,
|
71
|
+
:p4_FrpId,
|
72
|
+
:p5_CardNo,
|
73
|
+
:p6_confirmAmount,
|
74
|
+
:p7_realAmount,
|
75
|
+
:p8_cardStatus,
|
76
|
+
:p9_MP,
|
77
|
+
:pb_BalanceAmt,
|
78
|
+
:pc_BalanceAct
|
79
|
+
].map { |key| memo[key] = options[key] }
|
80
|
+
memo
|
81
|
+
end
|
82
|
+
|
83
|
+
#处理支付请求结果
|
84
|
+
def self.receive_response(options, res)
|
85
|
+
res_data = {}
|
86
|
+
res.to_s.split(/\n/).map { |item|
|
87
|
+
key_value = item.to_s.split(/=/)
|
88
|
+
res_data[key_value[0].to_s.to_sym] = key_value[1]
|
89
|
+
}
|
90
|
+
unless card_fee_ok?(options)
|
91
|
+
res_data[:r1_Code] = -100
|
92
|
+
end
|
93
|
+
res_data[:rq_ReturnMsg] = SUBMIT_ERROR_CODES[res_data[:r1_Code].to_s.to_i]
|
94
|
+
res_data
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Yeepay
|
2
|
+
module Service
|
3
|
+
module Card
|
4
|
+
#发起支付交易
|
5
|
+
def self.create_trade(options = {})
|
6
|
+
options = Yeepay::Service.string_key2_sym(options)
|
7
|
+
#组合支付请求参数
|
8
|
+
trade_data = gen_params(options)
|
9
|
+
trade_data[:hmac] = Yeepay::Service.hmac_md5_sign(trade_data)
|
10
|
+
warn("\ntrade_data #{trade_data}")
|
11
|
+
|
12
|
+
#发起支付请求
|
13
|
+
begin
|
14
|
+
res = open("#{GATEWAY_URL}?#{trade_data.collect { |key, value| "#{key}=#{value}" }.join('&')}").read
|
15
|
+
warn("\nres #{res}")
|
16
|
+
rescue => err
|
17
|
+
warn("\nSocketError #{err}\n\n")
|
18
|
+
return {}
|
19
|
+
end
|
20
|
+
|
21
|
+
#处理支付结果
|
22
|
+
res_data = receive_response(options, res)
|
23
|
+
warn("\nres_data #{res_data}")
|
24
|
+
res_data
|
25
|
+
end
|
26
|
+
|
27
|
+
#校验支付签名
|
28
|
+
def self.verify?(options={})
|
29
|
+
options = Yeepay::Service.string_key2_sym(options)
|
30
|
+
notify_params = res_verifying_params(options)
|
31
|
+
warn("\nnotfy_params #{notify_params}")
|
32
|
+
notify_hmac = Yeepay::Service.hmac_md5_sign(notify_params)
|
33
|
+
|
34
|
+
warn("\nnotify_sign #{options[:hmac]}, verify_sign: #{notify_hmac}")
|
35
|
+
notify_hmac == options[:hmac]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/yeepay.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'yeepay/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "yeepay"
|
8
|
+
spec.version = Yeepay::VERSION
|
9
|
+
spec.authors = ["mumaoxi"]
|
10
|
+
spec.email = ["15201280641@qq.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{易宝支付}
|
13
|
+
spec.description = %q{易宝支付}
|
14
|
+
spec.homepage = "https://github.com/mumaoxi/yeepay"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
|
+
# delete this section to allow pushing this gem to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
20
|
+
else
|
21
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
22
|
+
end
|
23
|
+
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.2"
|
30
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
31
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yeepay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.9
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- mumaoxi
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.9'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
description: 易宝支付
|
56
|
+
email:
|
57
|
+
- 15201280641@qq.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".travis.yml"
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- bin/console
|
68
|
+
- bin/setup
|
69
|
+
- lib/yeepay.rb
|
70
|
+
- lib/yeepay/service.rb
|
71
|
+
- lib/yeepay/service/card.rb
|
72
|
+
- lib/yeepay/version.rb
|
73
|
+
- yeepay.gemspec
|
74
|
+
homepage: https://github.com/mumaoxi/yeepay
|
75
|
+
licenses: []
|
76
|
+
metadata:
|
77
|
+
allowed_push_host: https://rubygems.org
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.4.6
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: 易宝支付
|
98
|
+
test_files: []
|