unionpay 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -3
- data/lib/unionpay/conf.rb +3 -16
- data/lib/unionpay/service.rb +38 -19
- data/lib/unionpay/version.rb +1 -1
- data/lib/unionpay.rb +24 -3
- data/test.rb +7 -5
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4c823129d1f1dd841f122f5ea2ee1c013e14468
|
4
|
+
data.tar.gz: f3a0f27c3fdcff06e5f590e776ffea7c02705d26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2023fee365fb05787f8d48c2aaea2016570c73f6acfe86dd53ba523bb8f93d05f29cae983a93b0d51932f3c0ee683645a7db1604fb81189c2a38e6a9b400a236
|
7
|
+
data.tar.gz: 1919939feccece40af863833464f58d0f7474bc2c485dd1a5c14246c6e736d19632050f0f6e726bdd5e43095b2d16efaa58735669bd5e4dda89858889f741c33
|
data/README.md
CHANGED
@@ -5,11 +5,16 @@ unionpay
|
|
5
5
|
|
6
6
|
## Usage
|
7
7
|
|
8
|
+
### Install
|
9
|
+
|
10
|
+
```gem install unionpay```
|
11
|
+
|
8
12
|
### Config
|
9
13
|
|
10
14
|
```ruby
|
11
|
-
UnionPay.
|
12
|
-
UnionPay.
|
15
|
+
UnionPay.environment = :development ## 测试环境, :pre_production #预上线环境, 默认 # 线上环境
|
16
|
+
UnionPay.mer_id = '105550149170027'
|
17
|
+
UnionPay.mer_abbr = '商户名称'
|
13
18
|
UnionPay.security_key = '88888888'
|
14
19
|
```
|
15
20
|
|
@@ -32,5 +37,23 @@ param['backEndUrl'] = "http://www.example.com/sdk/utf8/back_notify.php" #
|
|
32
37
|
|
33
38
|
# 其余可填空的参数可以不填写
|
34
39
|
|
35
|
-
|
40
|
+
UnionPay::Service.front_pay(param).form(target: '_blank', id: 'form'){"<input type='submit' />"}
|
41
|
+
```
|
42
|
+
|
43
|
+
### Verify notify
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
# example in rails
|
47
|
+
# The notify url MUST be set when generate payment url
|
48
|
+
def unionpay_notify
|
49
|
+
# except :controller_name, :action_name, :host, etc.
|
50
|
+
notify_params = params.except(*request.path_parameters.keys)
|
51
|
+
args = UnionPay::Service.responce(notify_params)
|
52
|
+
if args['respCode'] == UnionPay::RESP_SUCCESS
|
53
|
+
# valid notify, code your business logic.
|
54
|
+
render :text => 'success'
|
55
|
+
else
|
56
|
+
render :text => 'error'
|
57
|
+
end
|
58
|
+
end
|
36
59
|
```
|
data/lib/unionpay/conf.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
#encoding:utf-8
|
2
2
|
module UnionPay
|
3
|
-
|
3
|
+
class << self
|
4
|
+
attr_accessor :front_pay_url, :back_pay_url, :query_url
|
5
|
+
end
|
4
6
|
VERIFY_HTTPS_CERT = false
|
5
7
|
|
6
8
|
Timezone = "Asia/Shanghai" #时区
|
@@ -18,20 +20,6 @@ module UnionPay
|
|
18
20
|
'merAbbr' => '商户名称'
|
19
21
|
}
|
20
22
|
|
21
|
-
# 测试环境
|
22
|
-
Front_pay_url = "http://58.246.226.99/UpopWeb/api/Pay.action"
|
23
|
-
Back_pay_url = "http://58.246.226.99/UpopWeb/api/BSPay.action"
|
24
|
-
Query_url = "http://58.246.226.99/UpopWeb/api/Query.action"
|
25
|
-
|
26
|
-
## 预上线环境
|
27
|
-
#$front_pay_url = "https://www.epay.lxdns.com/UpopWeb/api/Pay.action"
|
28
|
-
#$back_pay_url = "https://www.epay.lxdns.com/UpopWeb/api/BSPay.action"
|
29
|
-
#$query_url = "https://www.epay.lxdns.com/UpopWeb/api/Query.action"
|
30
|
-
#
|
31
|
-
## 线上环境
|
32
|
-
#$front_pay_url = "https://unionpaysecure.com/api/Pay.action"
|
33
|
-
#$back_pay_url = "https://besvr.unionpaysecure.com/api/BSPay.action"
|
34
|
-
#$query_url = "https://query.unionpaysecure.com/api/Query.action"
|
35
23
|
|
36
24
|
FRONT_PAY = 1
|
37
25
|
BACK_PAY = 2
|
@@ -155,5 +143,4 @@ module UnionPay
|
|
155
143
|
Sign_ignore_params = [
|
156
144
|
"bank",
|
157
145
|
]
|
158
|
-
end
|
159
146
|
end
|
data/lib/unionpay/service.rb
CHANGED
@@ -2,33 +2,51 @@
|
|
2
2
|
require 'open-uri'
|
3
3
|
require 'digest'
|
4
4
|
module UnionPay
|
5
|
+
RESP_SUCCESS = "00" #返回成功
|
6
|
+
QUERY_SUCCESS = "0" #查询成功
|
7
|
+
QUERY_FAIL = "1"
|
8
|
+
QUERY_WAIT = "2"
|
9
|
+
QUERY_INVALID = "3"
|
5
10
|
module Service
|
6
|
-
RESP_SUCCESS = "00" #返回成功
|
7
|
-
QUERY_SUCCESS = "0" #查询成功
|
8
|
-
QUERY_FAIL = "1"
|
9
|
-
QUERY_WAIT = "2"
|
10
|
-
QUERY_INVALID = "3"
|
11
11
|
|
12
12
|
def self.front_pay(args)
|
13
|
-
|
14
|
-
args['
|
15
|
-
args['orderCurrency'] ||= UnionPay::Conf::CURRENCY_CNY #交易币种,CURRENCY_CNY=>人民币
|
16
|
-
|
13
|
+
args['orderTime'] ||= Time.now.strftime('%Y%m%d%H%M%S') #交易时间, YYYYmmhhddHHMMSS
|
14
|
+
args['orderCurrency'] ||= UnionPay::CURRENCY_CNY #交易币种,CURRENCY_CNY=>人民币
|
17
15
|
trans_type = args['transType']
|
18
|
-
if [UnionPay::
|
19
|
-
@@api_url = UnionPay
|
20
|
-
args.merge!(UnionPay::
|
21
|
-
param_check = UnionPay::
|
16
|
+
if [UnionPay::CONSUME, UnionPay::PRE_AUTH].include? trans_type
|
17
|
+
@@api_url = UnionPay.front_pay_url
|
18
|
+
args.merge!(UnionPay::Pay_params_empty).merge!(UnionPay::Pay_params)
|
19
|
+
@@param_check = UnionPay::Pay_params_check
|
22
20
|
else
|
23
21
|
# 前台交易仅支持 消费 和 预授权
|
24
22
|
raise("Bad trans_type for front_pay. Use back_pay instead")
|
25
23
|
end
|
24
|
+
self.service(args,UnionPay::FRONT_PAY)
|
25
|
+
end
|
26
|
+
|
27
|
+
def responce(args)
|
28
|
+
cupReserved = (args['cupReserved'] ||= '')
|
29
|
+
cupReserved = Rack::Utils.parse_nested_query cupReserved.gsub(/^{/,'').gsub(/}$/,'')
|
30
|
+
if !args['signature'] || !args['signMethod']
|
31
|
+
raise('No signature Or signMethod set in notify data!')
|
32
|
+
end
|
33
|
+
|
34
|
+
args.delete 'signMethod'
|
35
|
+
if args.delete('signature') != self.sign(args)
|
36
|
+
raise('Bad signature returned!')
|
37
|
+
end
|
38
|
+
args.merge! cupReserved
|
39
|
+
args.delete 'cupReserved'
|
40
|
+
args
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.service(args, service_type)
|
26
44
|
if args['commodityUrl']
|
27
45
|
args['commodityUrl'] = URI::encode(args['commodityUrl'])
|
28
46
|
end
|
29
47
|
|
30
48
|
has_reserved = false
|
31
|
-
UnionPay::
|
49
|
+
UnionPay::Mer_params_reserved.each do |k|
|
32
50
|
if args.has_key? k
|
33
51
|
value = args.delete k
|
34
52
|
(arr_reserved ||= []) << "#{k}=#{value}"
|
@@ -42,27 +60,28 @@ module UnionPay
|
|
42
60
|
args['merReserved'] ||= ''
|
43
61
|
end
|
44
62
|
|
45
|
-
param_check.each do |k|
|
63
|
+
@@param_check.each do |k|
|
46
64
|
raise("KEY [#{k}] not set in params given") unless args.has_key? k
|
47
65
|
end
|
48
66
|
|
49
67
|
# signature
|
50
68
|
args['signature'] = self.sign(args)
|
51
|
-
args['signMethod'] = UnionPay::
|
69
|
+
args['signMethod'] = UnionPay::Sign_method
|
52
70
|
@@args = args
|
53
71
|
self
|
54
72
|
end
|
55
73
|
|
56
74
|
def self.sign(args)
|
57
75
|
sign_str = args.sort.map do |k,v|
|
58
|
-
"#{k}=#{v}&" unless UnionPay::
|
76
|
+
"#{k}=#{v}&" unless UnionPay::Sign_ignore_params.include? k
|
59
77
|
end.join
|
60
78
|
Digest::MD5.hexdigest(sign_str + Digest::MD5.hexdigest(UnionPay.security_key))
|
61
79
|
end
|
62
80
|
|
63
|
-
def self.form
|
81
|
+
def self.form options={}
|
82
|
+
attrs = options.map{|k,v| "#{k}='#{v}'"}.join(' ')
|
64
83
|
html = [
|
65
|
-
"<form
|
84
|
+
"<form #{attrs} action='#{@@api_url}' method='post'>"
|
66
85
|
]
|
67
86
|
@@args.each do |k,v|
|
68
87
|
html << "<input type='hidden' name='#{k}' value='#{v}' />"
|
data/lib/unionpay/version.rb
CHANGED
data/lib/unionpay.rb
CHANGED
@@ -4,14 +4,35 @@ require File.dirname(__FILE__) + '/unionpay/version'
|
|
4
4
|
|
5
5
|
module UnionPay
|
6
6
|
class << self
|
7
|
-
attr_accessor :mer_id, :security_key, :mer_abbr
|
7
|
+
attr_accessor :mer_id, :security_key, :mer_abbr, :environment
|
8
8
|
|
9
9
|
def mer_id= v
|
10
|
-
UnionPay::
|
10
|
+
UnionPay::Pay_params['merId'] = v
|
11
11
|
end
|
12
12
|
|
13
13
|
def mer_abbr= v
|
14
|
-
UnionPay::
|
14
|
+
UnionPay::Pay_params['merAbbr'] = v
|
15
|
+
end
|
16
|
+
|
17
|
+
def environment= e
|
18
|
+
case e
|
19
|
+
## 测试环境
|
20
|
+
when :development
|
21
|
+
UnionPay.front_pay_url = "http://58.246.226.99/UpopWeb/api/Pay.action"
|
22
|
+
UnionPay.back_pay_url = "http://58.246.226.99/UpopWeb/api/BSPay.action"
|
23
|
+
UnionPay.query_url = "http://58.246.226.99/UpopWeb/api/Query.action"
|
24
|
+
## 预上线环境
|
25
|
+
when :pre_production
|
26
|
+
UnionPay.front_pay_url = "https://www.epay.lxdns.com/UpopWeb/api/Pay.action"
|
27
|
+
UnionPay.back_pay_url = "https://www.epay.lxdns.com/UpopWeb/api/BSPay.action"
|
28
|
+
UnionPay.query_url = "https://www.epay.lxdns.com/UpopWeb/api/Query.action"
|
29
|
+
## 线上环境
|
30
|
+
else
|
31
|
+
UnionPay.front_pay_url = "https://unionpaysecure.com/api/Pay.action"
|
32
|
+
UnionPay.back_pay_url = "https://besvr.unionpaysecure.com/api/BSPay.action"
|
33
|
+
UnionPay.query_url = "https://query.unionpaysecure.com/api/Query.action"
|
34
|
+
end
|
15
35
|
end
|
16
36
|
end
|
37
|
+
self.environment= :production
|
17
38
|
end
|
data/test.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
#encoding:utf-8
|
2
2
|
require './lib/unionpay'
|
3
3
|
|
4
|
+
UnionPay.environment = :development ## 测试环境, :pre_production #预上线环境, 默认 # 线上环境
|
5
|
+
UnionPay.mer_id = '105550149170027'
|
6
|
+
UnionPay.mer_abbr = '商户名称'
|
7
|
+
UnionPay.security_key = '88888888'
|
8
|
+
|
4
9
|
param = {}
|
5
|
-
param['transType'] = UnionPay::
|
10
|
+
param['transType'] = UnionPay::CONSUME; #交易类型,CONSUME or PRE_AUTH
|
6
11
|
param['orderAmount'] = 11000; #交易金额
|
7
12
|
param['orderNumber'] = Time.now.strftime('%Y%m%d%H%M%S') #订单号,必须唯一
|
8
13
|
param['customerIp'] = '127.0.0.1'
|
@@ -18,9 +23,6 @@ param['backEndUrl'] = "http://www.example.com/sdk/utf8/back_notify.ph
|
|
18
23
|
|
19
24
|
# 其余可填空的参数可以不填写
|
20
25
|
|
21
|
-
UnionPay.mer_id = '105550149170027'
|
22
|
-
UnionPay.mer_abbr = '商户名称'
|
23
|
-
UnionPay.security_key = '88888888'
|
24
26
|
|
25
27
|
|
26
|
-
puts UnionPay::Service.front_pay(param).form{"<input type='submit' />"}
|
28
|
+
puts UnionPay::Service.front_pay(param).form(target: '_blank', id: 'form'){"<input type='submit' />"}
|