unionpei 1.2.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/gem-push.yml +45 -0
- data/README.md +67 -0
- data/lib/unionpei/configuration.rb +15 -0
- data/lib/unionpei/payment.rb +69 -60
- data/lib/unionpei/sdk_config.rb +2 -3
- data/lib/unionpei/version.rb +2 -2
- data/lib/unionpei.rb +15 -3
- metadata +6 -4
- data/readme.txt +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e6b75a75c7873af619848b433d7f80bc086e110fd675130a529fdc87e38fcdb
|
4
|
+
data.tar.gz: 8d85162ba956cd54db133f1383f1c27354053d243fe4bc0d0105ce46b9283b63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7a5e4a06edf18f83a62d13a2974434b3fdbbc52d83125c94c2dd0f50a8061c3b9ac4ac74cfd90e10ea4216c543df7d68dec96d383f4fb742ed3eb65de53fe32
|
7
|
+
data.tar.gz: d743aa56571ab9bad9e23b2b87f63a41185da98ab126e3988f0f3924e03f6ad82dea18125267c0972af8f440dc640f7c46476a9258c35e07536ab34ae8c9f288
|
@@ -0,0 +1,45 @@
|
|
1
|
+
name: Ruby Gem
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ "master" ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ "master" ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
name: Build + Publish
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
permissions:
|
14
|
+
contents: read
|
15
|
+
packages: write
|
16
|
+
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v3
|
19
|
+
- name: Set up Ruby 2.6
|
20
|
+
uses: actions/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: 2.6.x
|
23
|
+
|
24
|
+
- name: Publish to GPR
|
25
|
+
run: |
|
26
|
+
mkdir -p $HOME/.gem
|
27
|
+
touch $HOME/.gem/credentials
|
28
|
+
chmod 0600 $HOME/.gem/credentials
|
29
|
+
printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
30
|
+
gem build *.gemspec
|
31
|
+
gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
|
32
|
+
env:
|
33
|
+
GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
|
34
|
+
OWNER: ${{ github.repository_owner }}
|
35
|
+
|
36
|
+
- name: Publish to RubyGems
|
37
|
+
run: |
|
38
|
+
mkdir -p $HOME/.gem
|
39
|
+
touch $HOME/.gem/credentials
|
40
|
+
chmod 0600 $HOME/.gem/credentials
|
41
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
42
|
+
gem build *.gemspec
|
43
|
+
gem push *.gem
|
44
|
+
env:
|
45
|
+
GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
UnionPei - 非官方银联支付(UnionPay)SDK
|
2
|
+
--------
|
3
|
+
|
4
|
+
# Install
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
gem 'unionpei'
|
8
|
+
|
9
|
+
```
|
10
|
+
|
11
|
+
# 快速开始(rails)
|
12
|
+
|
13
|
+
## 指定读取设定的配置文件
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
# config/initializers/unionpei.rb
|
17
|
+
UnionPei.configure do |config|
|
18
|
+
if Rails.env.production?
|
19
|
+
config.acp_sdk_config_path = Rails.root.join('safe/unionpay/acp_production_sdk.ini')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
```
|
24
|
+
|
25
|
+
## 生成支付的页面
|
26
|
+
```ruby
|
27
|
+
# 参数可参考相关文档,或者源码中payment.rb
|
28
|
+
|
29
|
+
class PaymentsController < ApplicationController
|
30
|
+
|
31
|
+
# B2C 支付
|
32
|
+
def union_b2c_pay
|
33
|
+
UnionPei::Payment.b2c({})
|
34
|
+
render html: UnionPei::Payment.b2c.html_safe
|
35
|
+
end
|
36
|
+
|
37
|
+
# B2B 支付
|
38
|
+
def union_b2b_pay
|
39
|
+
UnionPei::Payment.b2b({})
|
40
|
+
render html: UnionPei::Payment.b2b.html_safe
|
41
|
+
end
|
42
|
+
|
43
|
+
# 查询订单详情
|
44
|
+
def query_trans
|
45
|
+
UnionPei::Payment.query_trans({})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
# 参考文档
|
51
|
+
|
52
|
+
- 银联测试参数:https://open.unionpay.com/tjweb/user/mchTest/param
|
53
|
+
- 测试说明:https://open.unionpay.com/tjweb/support/faq/mchlist?id=516
|
54
|
+
- 证书说明:https://open.unionpay.com/tjweb/support/faq/mchlist?id=21
|
55
|
+
- API文档:https://open.unionpay.com/tjweb/acproduct/APIList?apiservId=448&acpAPIId=754&bussType=0
|
56
|
+
- SDK下载:https://open.unionpay.com/tjweb/support/faq/mchlist?id=38
|
57
|
+
- 测试卡信息:https://open.unionpay.com/tjweb/support/faq/mchlist?id=4
|
58
|
+
- B2B:https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=452&index=999
|
59
|
+
|
60
|
+
# 免责声明
|
61
|
+
|
62
|
+
本Gem对以下非官方代码进行封装和改造:
|
63
|
+
|
64
|
+
https://open.unionpay.com/tjweb/support/faq/mchlist?id=38
|
65
|
+
|
66
|
+
代码仅供参考学习,生产环境请自行封装代码。
|
67
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module UnionPei
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :acp_sdk_config_path
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@acp_sdk_config_path = default_acp_sdk_path
|
9
|
+
end
|
10
|
+
|
11
|
+
def default_acp_sdk_path
|
12
|
+
"#{File.dirname(__FILE__)}/acp_sdk.ini"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/unionpei/payment.rb
CHANGED
@@ -6,80 +6,89 @@ require_relative 'acp_service'
|
|
6
6
|
module UnionPei
|
7
7
|
class Payment
|
8
8
|
class << self
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
9
|
+
def default_b2c_req
|
10
|
+
{
|
11
|
+
'version' => UnionPei::SDKConfig.instance.version,
|
12
|
+
'encoding' => UnionPei::SDKConfig.instance.encoding,
|
13
|
+
'signMethod' => UnionPei::SDKConfig.instance.signMethod,
|
14
|
+
'frontUrl' => UnionPei::SDKConfig.instance.frontUrl,
|
15
|
+
'backUrl' => UnionPei::SDKConfig.instance.backUrl,
|
16
|
+
'txnType' => '01',
|
17
|
+
'txnSubType' => '01',
|
18
|
+
'bizType' => '000201', # 000201 是b2c / 000202 是 b2b
|
19
|
+
'channelType' => '07',
|
20
|
+
'currencyCode' => '156',
|
21
|
+
'txnAmt' => '881000',
|
22
|
+
'merId' => '777290058189920',
|
23
|
+
'orderId' => DateTime.parse(Time.now.to_s).strftime('%Y%m%d%H%M%S').to_s,
|
24
|
+
'txnTime' => DateTime.parse(Time.now.to_s).strftime('%Y%m%d%H%M%S').to_s,
|
25
|
+
'accessType' => '0'
|
26
|
+
}
|
27
|
+
end
|
26
28
|
|
27
29
|
# 【默认大于配置】哲学
|
28
|
-
def b2c(req =
|
29
|
-
req =
|
30
|
-
UnionPei::AcpService.sign(req)
|
30
|
+
def b2c(req = {})
|
31
|
+
req = default_b2c_req.merge(req)
|
32
|
+
signature = UnionPei::AcpService.sign(req)
|
33
|
+
req['signature'] = signature
|
31
34
|
url = UnionPei::SDKConfig.instance.frontTransUrl
|
32
35
|
UnionPei::AcpService.createAutoFormHtml(req, url)
|
33
36
|
end
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
38
|
+
def default_b2b_req
|
39
|
+
{
|
40
|
+
'version' => UnionPei::SDKConfig.instance.version,
|
41
|
+
'encoding' => UnionPei::SDKConfig.instance.encoding,
|
42
|
+
'signMethod' => UnionPei::SDKConfig.instance.signMethod,
|
43
|
+
'frontUrl' => UnionPei::SDKConfig.instance.frontUrl,
|
44
|
+
'backUrl' => UnionPei::SDKConfig.instance.backUrl,
|
45
|
+
'txnType' => '01',
|
46
|
+
'txnSubType' => '01',
|
47
|
+
'bizType' => '000202', # 000201 是b2c / 000202 是 b2b,
|
48
|
+
'channelType' => '07',
|
49
|
+
'currencyCode' => '156',
|
50
|
+
'txnAmt' => '881000',
|
51
|
+
'merId' => '777290058189920',
|
52
|
+
'orderId' => DateTime.parse(Time.now.to_s).strftime('%Y%m%d%H%M%S').to_s,
|
53
|
+
'txnTime' => DateTime.parse(Time.now.to_s).strftime('%Y%m%d%H%M%S').to_s,
|
54
|
+
'accessType' => '0',
|
55
|
+
'payTimeout' => DateTime.parse((Time.now + 15 * 60 * 1000).to_s).strftime('%Y%m%d%H%M%S').to_s,
|
56
|
+
'bizScene' => '110001',
|
57
|
+
'payeeAcctNm' => 'xx商户',
|
58
|
+
'payeeAcctNo' => '12345678',
|
59
|
+
'payeeBankName' => 'xx行'
|
60
|
+
}
|
61
|
+
end
|
57
62
|
|
58
|
-
def b2b(req =
|
59
|
-
req =
|
60
|
-
UnionPei::AcpService.sign(req)
|
63
|
+
def b2b(req = {})
|
64
|
+
req = default_b2b_req.merge(req)
|
65
|
+
signature = UnionPei::AcpService.sign(req)
|
66
|
+
req['signature'] = signature
|
61
67
|
url = UnionPei::SDKConfig.instance.frontTransUrl
|
62
68
|
UnionPei::AcpService.createAutoFormHtml(req, url)
|
63
69
|
end
|
64
70
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
def default_trans_req
|
72
|
+
{
|
73
|
+
'version' => UnionPei::SDKConfig.instance.version,
|
74
|
+
'encoding' => UnionPei::SDKConfig.instance.encoding,
|
75
|
+
'bizType' => '000000',
|
76
|
+
'txnTime' => DateTime.parse(Time.now.to_s).strftime('%Y%m%d%H%M%S').to_s,
|
77
|
+
'txnType' => '00',
|
78
|
+
'txnSubType' => '00',
|
79
|
+
'accessType' => '0',
|
80
|
+
'signMethod' => UnionPei::SDKConfig.instance.signMethod,
|
81
|
+
'merId' => '777290058189920',
|
82
|
+
'orderId' => DateTime.parse(Time.now.to_s).strftime('%Y%m%d%H%M%S').to_s
|
83
|
+
}
|
84
|
+
end
|
77
85
|
|
78
86
|
# query single transaction info
|
79
87
|
# doc https://open.unionpay.com/tjweb/acproduct/APIList?acpAPIId=757&apiservId=448&version=V2.2&bussType=0
|
80
|
-
def query_trans(req =
|
81
|
-
req =
|
82
|
-
UnionPei::AcpService.sign(req)
|
88
|
+
def query_trans(req = {})
|
89
|
+
req = default_trans_req.merge(req)
|
90
|
+
signature = UnionPei::AcpService.sign(req)
|
91
|
+
req['signature'] = signature
|
83
92
|
url = UnionPei::SDKConfig.instance.singleQueryUrl
|
84
93
|
UnionPei::AcpService.post(req, url)
|
85
94
|
end
|
data/lib/unionpei/sdk_config.rb
CHANGED
@@ -16,7 +16,6 @@ module UnionPei
|
|
16
16
|
def initialize
|
17
17
|
ini = parse_acpsdk
|
18
18
|
acpsdk = ini['acpsdk']
|
19
|
-
|
20
19
|
@frontTransUrl = acpsdk['acpsdk.frontTransUrl']
|
21
20
|
@singleQueryUrl = acpsdk['acpsdk.singleQueryUrl']
|
22
21
|
@backTransUrl = acpsdk['acpsdk.backTransUrl']
|
@@ -68,8 +67,8 @@ module UnionPei
|
|
68
67
|
end
|
69
68
|
|
70
69
|
def parse_acpsdk
|
71
|
-
|
72
|
-
|
70
|
+
acp_sdk_config_path = ::UnionPei.configuration.acp_sdk_config_path
|
71
|
+
IniParse.parse(File.read(acp_sdk_config_path).force_encoding('UTF-8'))
|
73
72
|
end
|
74
73
|
end
|
75
74
|
end
|
data/lib/unionpei/version.rb
CHANGED
data/lib/unionpei.rb
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module UnionPei
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def configuration
|
8
|
+
@configuration ||= Configuration.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure
|
12
|
+
yield(configuration)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'unionpei/configuration'
|
3
18
|
require 'unionpei/version'
|
4
19
|
require 'unionpei/sdk_config'
|
5
20
|
require 'unionpei/log_util'
|
@@ -7,6 +22,3 @@ require 'unionpei/cert_util'
|
|
7
22
|
require 'unionpei/sdk_util'
|
8
23
|
require 'unionpei/acp_service'
|
9
24
|
require 'unionpei/payment'
|
10
|
-
|
11
|
-
module UnionPei
|
12
|
-
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unionpei
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- memorycancel
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-08-
|
12
|
+
date: 2022-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: iniparse
|
@@ -101,8 +101,10 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
+
- ".github/workflows/gem-push.yml"
|
104
105
|
- ".gitignore"
|
105
106
|
- Gemfile
|
107
|
+
- README.md
|
106
108
|
- Rakefile
|
107
109
|
- certs/acp_test_enc.cer
|
108
110
|
- certs/acp_test_middle.cer
|
@@ -113,12 +115,12 @@ files:
|
|
113
115
|
- lib/unionpei/acp_sdk.ini
|
114
116
|
- lib/unionpei/acp_service.rb
|
115
117
|
- lib/unionpei/cert_util.rb
|
118
|
+
- lib/unionpei/configuration.rb
|
116
119
|
- lib/unionpei/log_util.rb
|
117
120
|
- lib/unionpei/payment.rb
|
118
121
|
- lib/unionpei/sdk_config.rb
|
119
122
|
- lib/unionpei/sdk_util.rb
|
120
123
|
- lib/unionpei/version.rb
|
121
|
-
- readme.txt
|
122
124
|
- unionpei.gemspec
|
123
125
|
homepage: https://rubygems.org/gems/unionpei
|
124
126
|
licenses:
|
@@ -139,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
141
|
- !ruby/object:Gem::Version
|
140
142
|
version: '0'
|
141
143
|
requirements: []
|
142
|
-
rubygems_version: 3.3.
|
144
|
+
rubygems_version: 3.0.3.1
|
143
145
|
signing_key:
|
144
146
|
specification_version: 4
|
145
147
|
summary: An unofficial unionpay gem
|
data/readme.txt
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
UnionPei - 非官方银联支付(UnionPay)SDK,使用MIT协议。
|
2
|
-
|
3
|
-
免责声明
|
4
|
-
|
5
|
-
本Gem对以下非官方代码进行封装和改造:
|
6
|
-
https://open.unionpay.com/tjweb/support/faq/mchlist?id=38
|
7
|
-
代码仅供参考学习,生产环境请自行封装代码。
|
8
|
-
|
9
|
-
参考文档
|
10
|
-
|
11
|
-
银联测试参数:https://open.unionpay.com/tjweb/user/mchTest/param
|
12
|
-
测试说明:https://open.unionpay.com/tjweb/support/faq/mchlist?id=516
|
13
|
-
证书说明:https://open.unionpay.com/tjweb/support/faq/mchlist?id=21
|
14
|
-
API文档:https://open.unionpay.com/tjweb/acproduct/APIList?apiservId=448&acpAPIId=754&bussType=0
|
15
|
-
SDK下载:https://open.unionpay.com/tjweb/support/faq/mchlist?id=38
|
16
|
-
测试卡信息:https://open.unionpay.com/tjweb/support/faq/mchlist?id=4
|
17
|
-
B2B:https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=452&index=999
|
18
|
-
|
19
|
-
快速开始(rails)
|
20
|
-
|
21
|
-
class PaymentsController < ApplicationController
|
22
|
-
def union_pay
|
23
|
-
render html: UnionPei::Payment.b2c.html_safe
|
24
|
-
end
|
25
|
-
end
|