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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fafe64e400a551831d156112734279e2fb85e79be6501313be8207a1cfec73f7
4
- data.tar.gz: 2622d961e762fab513b071796956dc60475e43271541f862c08f3a11b813b725
3
+ metadata.gz: ac650967bd79647830a80efd1d725613148afcc828675284ad3ed8142be5df3a
4
+ data.tar.gz: 218cb69cf48768732567cf4bf49f0e5dd6ac9f4424e06ab93a2e83e180016431
5
5
  SHA512:
6
- metadata.gz: eb660034680377320d589e3608ff84df6f2225276ae57bf7711648600b3df5d6d61973c539a925cb7b05aa986a161e293c62481bffd3471d04f7ddc7a1dd385b
7
- data.tar.gz: 5da018a9be520a162b9dbcfa76807ca15fe2b63baa607aff17d0b17a3ac65d50cc8f914296a59fb52a031e7cf884446f67e77c0734ccf3db95b572dda0380ab8
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.6'
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.6.gem
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-hant', # 可选: zh-hant, zh-hans, en
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 # 响应封装
@@ -124,7 +124,7 @@ module AllinpayCnp
124
124
 
125
125
  def build_base_option_params(options)
126
126
  {
127
- language: options[:language] || 'zh-hant',
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AllinpayCnp
4
- VERSION = '0.1.6'
4
+ VERSION = '0.1.7'
5
5
  end
data/lib/allinpay_cnp.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'allinpay_cnp/version'
4
4
  require_relative 'allinpay_cnp/config'
5
+ require_relative 'allinpay_cnp/language'
5
6
  require_relative 'allinpay_cnp/signature'
6
7
  require_relative 'allinpay_cnp/response'
7
8
  require_relative 'allinpay_cnp/request'
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.6
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: 2026-04-21 00:00:00.000000000 Z
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: 3.5.9
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?