allinpay_cnp 0.1.6 → 0.1.7
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 +4 -4
- data/README.md +28 -3
- data/lib/allinpay_cnp/client.rb +1 -1
- data/lib/allinpay_cnp/language.rb +40 -0
- data/lib/allinpay_cnp/version.rb +1 -1
- data/lib/allinpay_cnp.rb +1 -0
- metadata +4 -7
- data/lib/debug.rb +0 -86
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ac650967bd79647830a80efd1d725613148afcc828675284ad3ed8142be5df3a
|
|
4
|
+
data.tar.gz: 218cb69cf48768732567cf4bf49f0e5dd6ac9f4424e06ab93a2e83e180016431
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fe077759b23abafaf7c567a2f2cf45a0c6f14fe2ec8162196604a5b441f037b09c422bec6ead4f67d0c5d922fb07c921ef3ba7227f7cca9c57e09eaca0f58c68
|
|
7
|
+
data.tar.gz: adfb37bdd7f78350c362484ab1b1a062aade3e6aa29342f8484d17039e1f98be67c3f1aabb31a0bd73db65c2fa6628af361393c82cc61a2a2e1ce56c918617d6
|
data/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
### Gemfile
|
|
8
8
|
|
|
9
9
|
```ruby
|
|
10
|
-
gem 'allinpay_cnp', '~> 0.1.
|
|
10
|
+
gem 'allinpay_cnp', '~> 0.1.7'
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
### 本地安装
|
|
@@ -15,7 +15,7 @@ gem 'allinpay_cnp', '~> 0.1.6'
|
|
|
15
15
|
```bash
|
|
16
16
|
cd allinpay_cnp
|
|
17
17
|
gem build allinpay_cnp.gemspec
|
|
18
|
-
gem install allinpay_cnp-0.1.
|
|
18
|
+
gem install allinpay_cnp-0.1.7.gem
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
## 配置
|
|
@@ -96,7 +96,7 @@ response = client.unified_pay(
|
|
|
96
96
|
return_url: 'https://your-domain.com/payments/complete'
|
|
97
97
|
},
|
|
98
98
|
email: 'customer@example.com',
|
|
99
|
-
language: 'zh-
|
|
99
|
+
language: 'zh-CN', # 可选,收银台语言,见下方「收银台语言」;无法识别时回退 en
|
|
100
100
|
product_info: [ # 商品信息,可选,会以 JSON 字符串形式发送
|
|
101
101
|
{ sku: 'SKU001', productName: 'Test Product', price: '100.00', quantity: '1' }
|
|
102
102
|
],
|
|
@@ -127,6 +127,30 @@ else
|
|
|
127
127
|
end
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
+
#### 收银台语言 (language)
|
|
131
|
+
|
|
132
|
+
通联只接受下面 8 个语言码。`language` 会先经过 `AllinpayCnp::Language.resolve`
|
|
133
|
+
归一化,所以可以直接传常见的 locale 写法(大小写、`_`/`-` 分隔都行),
|
|
134
|
+
识别不出来的(俄语、泰语、德语……)以及不传时,统一回退英文。
|
|
135
|
+
|
|
136
|
+
| 传入 locale | 发送的 language | 语言 |
|
|
137
|
+
| --- | --- | --- |
|
|
138
|
+
| `zh` / `zh-CN` / `zh-Hans` | `zh` | 简体中文 |
|
|
139
|
+
| `zh-TW` / `zh-HK` / `zh-MO` / `zh-hant` | `zh-hant` | 繁体中文 |
|
|
140
|
+
| `en` | `en` | 英语 |
|
|
141
|
+
| `ja` / `jp` | `ja` | 日语 |
|
|
142
|
+
| `ko` / `kr` | `kr` | 韩语(注意通联写作 `kr`) |
|
|
143
|
+
| `fr` | `fr` | 法语 |
|
|
144
|
+
| `es` | `es` | 西班牙语 |
|
|
145
|
+
| `ar` | `ar` | 阿拉伯语 |
|
|
146
|
+
| 其他 / 不传 | `en` | 英语(默认) |
|
|
147
|
+
|
|
148
|
+
```ruby
|
|
149
|
+
AllinpayCnp::Language.resolve('zh-CN') # => "zh"
|
|
150
|
+
AllinpayCnp::Language.resolve('ko') # => "kr"
|
|
151
|
+
AllinpayCnp::Language.resolve('ru') # => "en"
|
|
152
|
+
```
|
|
153
|
+
|
|
130
154
|
### 查询订单 (Query)
|
|
131
155
|
|
|
132
156
|
```ruby
|
|
@@ -254,6 +278,7 @@ lib/
|
|
|
254
278
|
└── allinpay_cnp/
|
|
255
279
|
├── version.rb # 版本号
|
|
256
280
|
├── config.rb # 配置类
|
|
281
|
+
├── language.rb # 收银台语言归一化
|
|
257
282
|
├── signature.rb # RSA2 签名
|
|
258
283
|
├── request.rb # HTTP 请求
|
|
259
284
|
├── response.rb # 响应封装
|
data/lib/allinpay_cnp/client.rb
CHANGED
|
@@ -124,7 +124,7 @@ module AllinpayCnp
|
|
|
124
124
|
|
|
125
125
|
def build_base_option_params(options)
|
|
126
126
|
{
|
|
127
|
-
language: options[:language]
|
|
127
|
+
language: Language.resolve(options[:language]),
|
|
128
128
|
email: options[:email],
|
|
129
129
|
productInfo: options[:product_info]&.to_json
|
|
130
130
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AllinpayCnp
|
|
4
|
+
# 收银台网站语言 (`language`)。
|
|
5
|
+
#
|
|
6
|
+
# 通联只接受下面 8 个语言码,传别的会被拒绝;本模块把常见的 locale 写法
|
|
7
|
+
# (`zh-CN`、`zh_TW`、`ko` ...) 归一化过去,认不出来的一律回退英文。
|
|
8
|
+
#
|
|
9
|
+
# AllinpayCnp::Language.resolve('zh-CN') # => "zh"
|
|
10
|
+
# AllinpayCnp::Language.resolve('ko') # => "kr"
|
|
11
|
+
# AllinpayCnp::Language.resolve('ru') # => "en"
|
|
12
|
+
module Language
|
|
13
|
+
DEFAULT = 'en'
|
|
14
|
+
|
|
15
|
+
# 通联语言码 => 归一到该语言码的 locale。注意韩语在通联是 `kr`,不是 `ko`。
|
|
16
|
+
LOCALES_BY_LANGUAGE = {
|
|
17
|
+
'zh' => %w[zh zh-cn zh-hans],
|
|
18
|
+
'zh-hant' => %w[zh-tw zh-hant zh-hk zh-mo],
|
|
19
|
+
'en' => %w[en],
|
|
20
|
+
'ja' => %w[ja jp],
|
|
21
|
+
'kr' => %w[ko kr],
|
|
22
|
+
'fr' => %w[fr],
|
|
23
|
+
'es' => %w[es],
|
|
24
|
+
'ar' => %w[ar]
|
|
25
|
+
}.freeze
|
|
26
|
+
|
|
27
|
+
SUPPORTED = LOCALES_BY_LANGUAGE.each_with_object({}) do |(language, locales), map|
|
|
28
|
+
locales.each { |locale| map[locale] = language }
|
|
29
|
+
end.freeze
|
|
30
|
+
|
|
31
|
+
def self.resolve(locale)
|
|
32
|
+
SUPPORTED.fetch(normalize(locale), DEFAULT)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.normalize(locale)
|
|
36
|
+
locale.to_s.strip.tr('_', '-').downcase
|
|
37
|
+
end
|
|
38
|
+
private_class_method :normalize
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/allinpay_cnp/version.rb
CHANGED
data/lib/allinpay_cnp.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: allinpay_cnp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- DrinE
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: faraday
|
|
@@ -41,16 +40,15 @@ files:
|
|
|
41
40
|
- lib/allinpay_cnp.rb
|
|
42
41
|
- lib/allinpay_cnp/client.rb
|
|
43
42
|
- lib/allinpay_cnp/config.rb
|
|
43
|
+
- lib/allinpay_cnp/language.rb
|
|
44
44
|
- lib/allinpay_cnp/request.rb
|
|
45
45
|
- lib/allinpay_cnp/response.rb
|
|
46
46
|
- lib/allinpay_cnp/signature.rb
|
|
47
47
|
- lib/allinpay_cnp/version.rb
|
|
48
|
-
- lib/debug.rb
|
|
49
48
|
homepage: https://github.com/CoolDrinELiu/allinpay
|
|
50
49
|
licenses:
|
|
51
50
|
- MIT
|
|
52
51
|
metadata: {}
|
|
53
|
-
post_install_message:
|
|
54
52
|
rdoc_options: []
|
|
55
53
|
require_paths:
|
|
56
54
|
- lib
|
|
@@ -65,8 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
65
63
|
- !ruby/object:Gem::Version
|
|
66
64
|
version: '0'
|
|
67
65
|
requirements: []
|
|
68
|
-
rubygems_version:
|
|
69
|
-
signing_key:
|
|
66
|
+
rubygems_version: 4.0.6
|
|
70
67
|
specification_version: 4
|
|
71
68
|
summary: Ruby SDK for Allinpay CNP cross-border payment gateway
|
|
72
69
|
test_files: []
|
data/lib/debug.rb
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
require './allinpay_cnp'
|
|
2
|
-
|
|
3
|
-
AllinpayCnp.configure do |config|
|
|
4
|
-
config.merchant_id = '086310058120045'
|
|
5
|
-
config.private_key = <<~XXX
|
|
6
|
-
-----BEGIN PRIVATE KEY-----
|
|
7
|
-
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFt99S9adbC84l
|
|
8
|
-
LExEF4vjFHiurFNRmBVEMmVVeJQfzQbQ/6fY0s+2Vx0lHVcD5ZVdDRwbTl2LG+8S
|
|
9
|
-
lWH6aXmvOk5j5DI9wGJEwPo2L8GH9RHbHMQu0jr9+UO97kBCjKNZKmWkbNsPrfUb
|
|
10
|
-
HxWuKKFILaZcv4LYNsjBNvVkvRU674lJVQ+TZ8ZsPLvc5+I3anJGLbu5Bt1igqbn
|
|
11
|
-
vpMV1seYsUnNbuDBSoYHl09CPvGRc5krmRyouwwLlXiwcJDNDudl5Uohwj2LCuiC
|
|
12
|
-
TWfkd/Me1ty1YrAZR9a/zh+vM7dLc9aCBnic2/7JYBtPwcKKC0Zix9ODbNehLahE
|
|
13
|
-
Nqvxm9KtAgMBAAECggEAE3lb1rj5Zd9Qy5qEXISRM6mVhWbVwgift5rbHkMFG+i+
|
|
14
|
-
ziEQMCv7Z3NHHJu6MVkQkBy1cv8R+ZyjvInYH6j54kd05yPXyvtC8pCrVGD5x+Fc
|
|
15
|
-
g99ed1ofk1pU0MVBsQxXHnYtkrdiEDZLGQPDx+aalBhi9Wmrgo5K0bUPEIALMkWv
|
|
16
|
-
RIBTkRbA/SB4WatB7zmKJxkqA+YIRzAmLDgUE1qjyhE/1VG/d/aetkwGkMo+HSDU
|
|
17
|
-
x87ERKSbgLCri80UQ9RnMtV/wp9nh0VD3b6+MVFKacfKLHBrAwT3E/8Lv4S0I/Sr
|
|
18
|
-
I94IoxOP4gCxytps+BslNuSCd3mMp8OuxCkqg2PBhQKBgQDmC+SpWH4WU/1XO/w9
|
|
19
|
-
C0HnV7b0mpLt4+BqN/1eHdKK29L4R0iOqRjnO9bCkWGnV8nGU0kzNk9jueK2QBdR
|
|
20
|
-
eOnmwqFCvEaIksyG/sUcHkzCxgtUvHxhy3e9IvjKv/5y47P9w/YgIZn62X+tWsnv
|
|
21
|
-
EzPKPfw2+ALxllkVWZsBqB3hrwKBgQDcBkoL1JRWlrPaaSzcUbyJKUQWwIm9trHj
|
|
22
|
-
XAYzwwsNjhGuV/aefVI7priLOxWR9Djq5IuOabNQ290ve6Bu2BBrEtbIsL/0UXwq
|
|
23
|
-
HAmWXuCFc9/MfocQ+TiE0BuUDKgsYqQU2DE+JLaxvaUv1DNw2bUgm9z3zQyJJed4
|
|
24
|
-
ZAHrYqo0YwKBgE9GGe4hiJG5L7w395wxnOxT1cBE5A0GUfdIhA9Cx6MCTZkxN1ex
|
|
25
|
-
/drxS/iQkM5R+j5VxQvY01LSY8XaIC77M99Jgri0mLnHnKOId/RQnLMh/BWfPl2U
|
|
26
|
-
+BY9Tu7Paqe8v/Ha7Z309lLzUIQ0nRG91EMFSTzICnumC9zHnBreDC4RAoGBAMWl
|
|
27
|
-
JKjh6eqqb594MSMsjVcM6awigtkXn05kYPHoeCpR/5IEVHZkjxUkm8v+ZE76+pIO
|
|
28
|
-
gUqJqtms11ELFb/ceUsl3ijjlVssQ4Q0MWyRh9B5mYVB96SIq3uq0cs5X2yXo1tS
|
|
29
|
-
JVH0euTJPfTsAtWRy4IiYOl8mZEtqnNcKtk+hTSPAoGAKSF7NCZU0hQwu/rf8v7v
|
|
30
|
-
go/qdS/oYDUohs5HVLG074Eerb1Q4w/xUfSz8zIJvTg04PLWwiBO3P5hCoXUXEaR
|
|
31
|
-
V3Dl1g4i/pGrurOQQHhH9gdPINGBb7okthIwl02QT1UxX3Ibq1OjuH27qoCRQtWJ
|
|
32
|
-
7oJx+aHeFOuOHjULBy+6/CU=
|
|
33
|
-
-----END PRIVATE KEY-----
|
|
34
|
-
XXX
|
|
35
|
-
config.public_key = <<~PEM
|
|
36
|
-
-----BEGIN PUBLIC KEY-----
|
|
37
|
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNGWmxYl6uYA/X3k1OOY
|
|
38
|
-
nMlLvmgJpYMvahxDLUc9CEXbaqMoMMuLbsvfR6Zf3JIeYCjjfgNVDJTsJY/HWWbp
|
|
39
|
-
HEd4GvQAgv6wywsQ8AJqIHe3fM3B8iwS3XIxZM9fs92lU+mHuVHQdMvciQyaB3iw
|
|
40
|
-
3IvBBzCEgyqSFcGBrlQOGf1x7fZZKY9RH3EDxqzE+Zrs27BjE8T3sNvUCKcfWGhQ
|
|
41
|
-
GKX80jcqLEnFBl9CIlgL4TRSksQ1U4GhOY0/4Db6UsmbTAQeG2plWgbJ0l0khJ2O
|
|
42
|
-
DYqTtDujl4zN3tGXQ2gwCErxqBbukIFMkT+jS1lxrBeGGrvuOXTz408tDbAsJnbU
|
|
43
|
-
YwIDAQAB
|
|
44
|
-
-----END PUBLIC KEY-----
|
|
45
|
-
PEM
|
|
46
|
-
config.environment = :test
|
|
47
|
-
config.logger = Logger.new($stdout)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
client = AllinpayCnp.client
|
|
51
|
-
|
|
52
|
-
# 测试创建订单
|
|
53
|
-
response = client.unified_pay(
|
|
54
|
-
access_order_id: "TEST_#{Time.now.to_i}",
|
|
55
|
-
amount: '1.00',
|
|
56
|
-
currency: 'HKD',
|
|
57
|
-
urls: {
|
|
58
|
-
notify_url: 'https://example.com/callback',
|
|
59
|
-
return_url: 'https://example.com/return'
|
|
60
|
-
},
|
|
61
|
-
email: 'test@example.com',
|
|
62
|
-
product_info: [
|
|
63
|
-
{
|
|
64
|
-
# sku: '123456789',
|
|
65
|
-
productName: 'MacBook Pro'
|
|
66
|
-
# price: '1.00',
|
|
67
|
-
# quantity: '1'
|
|
68
|
-
}
|
|
69
|
-
],
|
|
70
|
-
shipping: {
|
|
71
|
-
first_name: 'Peter',
|
|
72
|
-
last_name: 'Zhang',
|
|
73
|
-
address1: '123 Test Street',
|
|
74
|
-
city: 'Hong Kong',
|
|
75
|
-
state: 'Hong Kong',
|
|
76
|
-
country: 'HK',
|
|
77
|
-
zip_code: '000000',
|
|
78
|
-
phone: '12345678'
|
|
79
|
-
}
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
q = client.query('TEST_1771053407')
|
|
83
|
-
puts "Success: #{response.success?}"
|
|
84
|
-
puts "Result Code: #{response.result_code}"
|
|
85
|
-
puts "Result Desc: #{response.result_desc}"
|
|
86
|
-
puts "Payment URL: #{response.payment_url}" if response.success?
|