wechat 0.17.6 → 1.0.0

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: 7f52a2187b27eeeefa75054f9918a0775220e8306e91da7abfa04de6e15d1dd3
4
- data.tar.gz: 27c1d1a120fd0283bb585931b6798f2051acb4c72b4ecf6bd99171da77a9e8ad
3
+ metadata.gz: 7c59986fcf04aecd798a52b731fb9dfbe5cf145198defa76dfcb73351a8b2096
4
+ data.tar.gz: b4c2bd303e624cadd77537642f74e913d566d5dcc30eca97d5616807b70dd696
5
5
  SHA512:
6
- metadata.gz: 5fd77e84ec3ab4a1d6369e6a2563f69f695bbb7613f9d74de699ffc696e1820476682e6612facb8291c7f4632e6ac3c0d0181e256c759696e677906022cfe544
7
- data.tar.gz: f4027609c8a0148c7c0c9e22bc106b9a49d43bebdae94728c81992a569d837535cbb6978197c406bde8e90bb85f4d14d98cd13fa223fc8a3c6eb0e38a95d4cd7
6
+ metadata.gz: 44916ab7ae7f8881d7d8c6e9b5f92165e253530f6d4a0dee020fe2e6af677ba1e551cbaed437fef6787b8da9fa33ef206a98fd1226bab1290090650a72b96746
7
+ data.tar.gz: 552eef6ce3131be319c5aa5a68e0eecb775f74e036f90b8287c3c8995992ee0525d265c787430aa210a673e2330387b6fb145d429b79c1fd4963fe85b0c47c1c
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+
4
+ ## v1.0.0 (released at 2025-05-17)
5
+
6
+ * WECHAT_PROXY_URL should be writen with port, like `export WECHAT_PROXY_URL=http://127.0.0.1:6152`, since WECHAT_PROXY_PORT removed.
7
+ * Replace http with httpx, [reason](https://honeyryderchuck.gitlab.io/2023/10/15/state-of-ruby-http-clients-use-httpx.html)
8
+ * Feat: add account_type to WechatConfig. by @leepood #324
9
+
10
+ ## v0.17.7 (released at 2025-03-02)
11
+
12
+ * Adding ostruct into its gemspec. Fix #323
13
+
3
14
  ## v0.17.6 (released at 2024-10-25)
4
15
 
5
16
  * Support Rails 8.0 now
data/README-CN.md CHANGED
@@ -227,6 +227,7 @@ test:
227
227
  environment | 字串 | 必填。配置对应的运行环境,一般有:`production`、`development`、`test`。比如 `production` 配置仅在生产环境有效。默认为 `development`。
228
228
  account | 字串 | 必填。自定义的微信账户名称。同一 `environment` 下,账户名称不允许重复。
229
229
  enabled | 布尔 | 必填。配置是否生效。默认 `true`。
230
+ account_type | 字串 | 非必填。当前只支持`mp`,表示小程序。
230
231
  appid | 字串 | 公众号 id ,此字段和 `corpid` 两者必填其一。
231
232
  secret | 字串 | 公众号相关配置。当公众号 `appid` 存在时必填。
232
233
  corpid | 字串 | 企业号 id。此字段和 `appid` 两者必填其一。
@@ -896,6 +897,5 @@ end
896
897
 
897
898
  ## 已知问题
898
899
 
899
- * 企业微信接受菜单消息时,Wechat 腾讯服务器无法解析部分域名,请使用 iP 绑定回调 URL,用户的普通消息目前不受影响。
900
900
  * 企业微信全量覆盖成员使用的 CSV 通讯录格式,直接将下载的模板导入[是不工作的](http://qydev.weixin.qq.com/qa/index.php?qa=13978),必须使用 Excel 打开,然后另存为 CSV 格式才会变成合法格式。
901
- * 如果使用 Nginx + Unicron 部署方案,并且使用了 Https,必须设置 `trusted_domain_fullname` 为 Https,否则会导致 JS-SDK 签名失效。
901
+ * 在开发模式上使用外部反响代理 https 回调,可能需要设置 `trusted_domain_fullname` 为 https,否则会导致 JS-SDK 签名失效。
data/README.md CHANGED
@@ -254,6 +254,7 @@ Attribute | Type | Annotation
254
254
  ---- | ---- | ----
255
255
  environment | string | Required. Environment of account configuration. Typical values are: `production`, `development` and `test`. For example, a `production` config will only be available in `production`. Default to `development`.
256
256
  account | string | Required. Custom wechat account name. Account names must be unique within each environment.
257
+ account_type | string | account type, only support `mp` which is short for `mini program` currently
257
258
  enabled | boolean | Required. Whether this configuration is activated. Default to `true`.
258
259
  appid | string | Public account id. Either this attribute or `corpid` must be specified.
259
260
  secret | string | Public account configuration. Required when `appid` exists.
@@ -928,6 +929,5 @@ end
928
929
 
929
930
  ## Known Issues
930
931
 
931
- * Sometimes, enterprise account can not receive the menu message due to Tencent server unable to resolve DNS, so using IP as a callback URL is more stable, but it never happens for user sent text messages.
932
932
  * Enterprise batch "replace users" uses a CSV format file, but if you are using the downloaded template directly, it's [not working](http://qydev.weixin.qq.com/qa/index.php?qa=13978), must open the CSV file in Excel first, then save as CSV format again, seems Tencent only supports Excel "Save as CSV" file format.
933
- * If you using unicorn behind nginx and https, you need to set `trusted_domain_fullname` and point it to https, otherwise it will be http and will lead to invalid signature in the JS-SDK.
933
+ * Using an external feedback proxy HTTPS callback in development mode may require setting `trusted_domain_fullname` to HTTPS, otherwise the JS-SDK signature will be invalid.
@@ -41,7 +41,6 @@ module ActionController
41
41
  self.skip_verify_ssl = opts.key?(:skip_verify_ssl) ? opts[:skip_verify_ssl] : cfg.skip_verify_ssl
42
42
 
43
43
  proxy_url = opts.key?(:proxy_url) ? opts[:proxy_url] : cfg.proxy_url
44
- proxy_port = opts.key?(:proxy_port) ? opts[:proxy_port] : cfg.proxy_port
45
44
  proxy_username = opts.key?(:proxy_username) ? opts[:proxy_username] : cfg.proxy_username
46
45
  proxy_password = opts.key?(:proxy_password) ? opts[:proxy_password] : cfg.proxy_password
47
46
 
@@ -56,7 +55,7 @@ module ActionController
56
55
  api_type = opts[:type] || cfg.type
57
56
  secret = corpid.present? ? opts[:corpsecret] || cfg.corpsecret : opts[:secret] || cfg.secret
58
57
 
59
- network_setting = Wechat::NetworkSetting.new(timeout, skip_verify_ssl, proxy_url, proxy_port, proxy_username, proxy_password)
58
+ network_setting = Wechat::NetworkSetting.new(timeout, skip_verify_ssl, proxy_url, proxy_username, proxy_password)
60
59
  qcloud_setting = Wechat::Qcloud::Setting.new(qcloud_env, qcloud_token, qcloud_token_lifespan)
61
60
  get_wechat_api(api_type, corpid, appid, secret, access_token, agentid, network_setting, jsapi_ticket, qcloud_setting)
62
61
  end
@@ -9,10 +9,11 @@ class WechatConfig < ActiveRecord::Base
9
9
  validates :access_token, presence: true
10
10
  validates :jsapi_ticket, presence: true
11
11
  validates :encoding_aes_key, presence: { if: :encrypt_mode? }
12
+ validates :account_type, inclusion: { in: %w[mp] }, if: -> { account_type.present? }
12
13
 
13
14
  validate :app_config_is_valid
14
15
 
15
- ATTRIBUTES_TO_REMOVE = %w[environment account created_at updated_at enabled].freeze
16
+ ATTRIBUTES_TO_REMOVE = %w[environment account created_at updated_at enabled account_type].freeze
16
17
 
17
18
  def self.get_all_configs(environment)
18
19
  WechatConfig.where(environment: environment, enabled: true).each_with_object({}) do |config, hash|
@@ -21,7 +22,9 @@ class WechatConfig < ActiveRecord::Base
21
22
  end
22
23
 
23
24
  def build_config_hash
24
- as_json(except: ATTRIBUTES_TO_REMOVE)
25
+ config_hash = as_json(except: ATTRIBUTES_TO_REMOVE)
26
+ config_hash[:type] = account_type if account_type.present?
27
+ config_hash
25
28
  end
26
29
 
27
30
  private
@@ -5,6 +5,8 @@ class CreateWechatConfigs < ActiveRecord::Migration<%= migration_version %>
5
5
  t.string :environment, null: false, default: 'development'
6
6
  # account name
7
7
  t.string :account, null: false
8
+ # account type, "mp" is short for mini program
9
+ t.string :account_type
8
10
  # whether this config is activated
9
11
  t.boolean :enabled, default: true
10
12
 
@@ -12,7 +12,7 @@ module Wechat
12
12
  js_token_file = options[:js_token_file] || c.jsapi_ticket.presence || '/var/tmp/wechat_jsapi_ticket'
13
13
  type = options[:type] || c.type
14
14
 
15
- network_setting = Wechat::NetworkSetting.new(c.timeout, c.skip_verify_ssl, c.proxy_url, c.proxy_port, c.proxy_username, c.proxy_password)
15
+ network_setting = Wechat::NetworkSetting.new(c.timeout, c.skip_verify_ssl, c.proxy_url, c.proxy_username, c.proxy_password)
16
16
  if c.appid && c.secret && token_file.present?
17
17
  if type == 'mp'
18
18
  qcloud_env = options[:qcloud_env] || c.qcloud_env
@@ -166,7 +166,6 @@ module Wechat
166
166
  timeout: ENV.fetch('WECHAT_TIMEOUT', nil),
167
167
  skip_verify_ssl: ENV.fetch('WECHAT_SKIP_VERIFY_SSL', nil),
168
168
  proxy_url: ENV.fetch('WECHAT_PROXY_URL', nil),
169
- proxy_port: ENV.fetch('WECHAT_PROXY_PORT', nil),
170
169
  proxy_username: ENV.fetch('WECHAT_PROXY_USERNAME', nil),
171
170
  proxy_password: ENV.fetch('WECHAT_PROXY_PASSWORD', nil),
172
171
  encoding_aes_key: ENV.fetch('WECHAT_ENCODING_AES_KEY', nil),
@@ -144,12 +144,6 @@ module Wechat
144
144
  post 'menu/delconditional', JSON.generate(menuid: menuid)
145
145
  end
146
146
 
147
- def material(media_id)
148
- ActiveSupport::Deprecation.new.warn('material is deprecated. use get_material instead.')
149
-
150
- post 'material/get_material', JSON.generate(media_id: media_id), as: :file
151
- end
152
-
153
147
  def get_material(media_id)
154
148
  post 'material/get_material', JSON.generate(media_id: media_id), as: :file
155
149
  end
@@ -102,7 +102,7 @@ module Wechat
102
102
  'x-cos-security-token': x_cos_security_token,
103
103
  'x-cos-meta-fileid': x_cos_meta_fileid,
104
104
  file: form_file })
105
- client.httprb.post(upload_url, form: form_data, ssl_context: client.ssl_context)
105
+ client.httpx.post(upload_url, form: form_data)
106
106
  end
107
107
 
108
108
  def tcb_upload_file(q_path, file)
@@ -170,12 +170,6 @@ module Wechat
170
170
  post 'material/batchget', JSON.generate(type: type, agentid: agentid, offset: offset, count: count)
171
171
  end
172
172
 
173
- def material(media_id)
174
- ActiveSupport::Deprecation.new.warn('material is deprecated. use get_material instead.')
175
-
176
- post 'material/get_material', JSON.generate(media_id: media_id), params: { agentid: agentid }, as: :file
177
- end
178
-
179
173
  def get_material(media_id)
180
174
  post 'material/get_material', JSON.generate(media_id: media_id), params: { agentid: agentid }, as: :file
181
175
  end
@@ -1,51 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'http'
3
+ require 'httpx'
4
4
 
5
5
  module Wechat
6
6
  class HttpClient
7
- attr_reader :base, :ssl_context, :httprb
7
+ attr_reader :base, :httpx
8
8
 
9
9
  def initialize(base, network_setting)
10
10
  @base = base
11
- @httprb = if HTTP::VERSION.to_i >= 4
12
- HTTP.timeout(write: network_setting.timeout, connect: network_setting.timeout, read: network_setting.timeout)
13
- else
14
- HTTP.timeout(:global, write: network_setting.timeout, connect: network_setting.timeout, read: network_setting.timeout)
15
- end
16
-
17
- unless network_setting.proxy_url.nil?
18
- @httprb = @httprb.via(network_setting.proxy_url, network_setting.proxy_port.to_i, network_setting.proxy_username, network_setting.proxy_password)
11
+ @httpx = HTTPX.with(timeout: { connect_timeout: network_setting.timeout, request_timeout: network_setting.timeout })
12
+
13
+ if network_setting.proxy_url.present?
14
+ @httpx = @httpx.with_proxy(uri: network_setting.proxy_url,
15
+ username: network_setting.proxy_username,
16
+ password: network_setting.proxy_password)
19
17
  end
20
18
 
21
- @ssl_context = OpenSSL::SSL::SSLContext.new
22
- @ssl_context.ssl_version = 'TLSv1_2'
23
- @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE if network_setting.skip_verify_ssl
19
+ return unless network_setting.skip_verify_ssl
20
+
21
+ @httpx = @httpx.with(ssl: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
24
22
  end
25
23
 
26
24
  def get(path, get_header = {})
27
- request(path, get_header) do |url, header|
28
- params = header.delete(:params)
29
- httprb.headers(header).get(url, params: params, ssl_context: ssl_context)
25
+ request(path, get_header) do |url, headers|
26
+ params = headers.delete(:params)
27
+ httpx.with(headers: headers)
28
+ .get(url, params: params)
30
29
  end
31
30
  end
32
31
 
33
32
  def post(path, payload, post_header = {})
34
- request(path, post_header) do |url, header|
35
- params = header.delete(:params)
36
- httprb.headers(header).post(url, params: params, body: payload, ssl_context: ssl_context)
33
+ request(path, post_header) do |url, headers|
34
+ params = headers.delete(:params)
35
+ httpx.with(headers: headers)
36
+ .post(url, params: params, body: payload)
37
37
  end
38
38
  end
39
39
 
40
40
  def post_file(path, file, post_header = {})
41
- request(path, post_header) do |url, header|
42
- params = header.delete(:params)
41
+ request(path, post_header) do |url, headers|
42
+ params = headers.delete(:params)
43
43
  form_file = file.is_a?(HTTP::FormData::File) ? file : HTTP::FormData::File.new(file)
44
- httprb.headers(header)
45
- .post(url, params: params,
46
- form: { media: form_file,
47
- hack: 'X' }, # Existing here for http-form_data 1.0.1 handle single param improperly
48
- ssl_context: ssl_context)
44
+ httpx.with(headers: headers)
45
+ .post(url, params: params,
46
+ form: { media: form_file })
49
47
  end
50
48
  end
51
49
 
@@ -80,7 +78,7 @@ module Wechat
80
78
  end
81
79
 
82
80
  def parse_response(response, as_type)
83
- content_type = response.headers[:content_type]
81
+ content_type = response.headers['content-type']
84
82
  parse_as = {
85
83
  %r{^application/json} => :json,
86
84
  %r{^image/.*} => :file,
@@ -238,7 +238,7 @@ module Wechat
238
238
  key = key.to_s
239
239
  [TO_JSON_KEY_MAP[key] || (keep_camel_case_key ? key : key.downcase), value]
240
240
  end
241
- json_hash = json_hash.transform_keys(&:downcase).select { |k, _v| TO_JSON_ALLOWED.include? k }
241
+ json_hash = json_hash.transform_keys(&:downcase).slice(*TO_JSON_ALLOWED)
242
242
 
243
243
  case json_hash['msgtype']
244
244
  when 'text'
@@ -2,13 +2,12 @@
2
2
 
3
3
  module Wechat
4
4
  class NetworkSetting
5
- attr_reader :timeout, :skip_verify_ssl, :proxy_url, :proxy_port, :proxy_username, :proxy_password
5
+ attr_reader :timeout, :skip_verify_ssl, :proxy_url, :proxy_username, :proxy_password
6
6
 
7
- def initialize(timeout, skip_verify_ssl, proxy_url, proxy_port, proxy_username, proxy_password)
7
+ def initialize(timeout, skip_verify_ssl, proxy_url, proxy_username, proxy_password)
8
8
  @timeout = timeout
9
9
  @skip_verify_ssl = skip_verify_ssl
10
10
  @proxy_url = proxy_url
11
- @proxy_port = proxy_port
12
11
  @proxy_username = proxy_username
13
12
  @proxy_password = proxy_password
14
13
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,42 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wechat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Skinnyworm
8
8
  - Eric Guo
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain:
12
11
  - |
13
12
  -----BEGIN CERTIFICATE-----
14
13
  MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMRMwEQYDVQQDDAplcmlj
15
14
  Lmd1b2N6MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
16
- b20wHhcNMjMxMjMwMDgzMDQ1WhcNMjQxMjI5MDgzMDQ1WjBBMRMwEQYDVQQDDApl
15
+ b20wHhcNMjUwMzAxMTgwODA1WhcNMjYwMzAxMTgwODA1WjBBMRMwEQYDVQQDDApl
17
16
  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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
38
37
  -----END CERTIFICATE-----
39
- date: 2024-12-11 00:00:00.000000000 Z
38
+ date: 1980-01-02 00:00:00.000000000 Z
40
39
  dependencies:
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: activesupport
@@ -59,25 +58,19 @@ dependencies:
59
58
  - !ruby/object:Gem::Version
60
59
  version: '9'
61
60
  - !ruby/object:Gem::Dependency
62
- name: http
61
+ name: httpx
63
62
  requirement: !ruby/object:Gem::Requirement
64
63
  requirements:
65
64
  - - ">="
66
65
  - !ruby/object:Gem::Version
67
- version: 1.0.4
68
- - - "<"
69
- - !ruby/object:Gem::Version
70
- version: '6'
66
+ version: 1.3.4
71
67
  type: :runtime
72
68
  prerelease: false
73
69
  version_requirements: !ruby/object:Gem::Requirement
74
70
  requirements:
75
71
  - - ">="
76
72
  - !ruby/object:Gem::Version
77
- version: 1.0.4
78
- - - "<"
79
- - !ruby/object:Gem::Version
80
- version: '6'
73
+ version: 1.3.4
81
74
  - !ruby/object:Gem::Dependency
82
75
  name: nokogiri
83
76
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +85,20 @@ dependencies:
92
85
  - - ">="
93
86
  - !ruby/object:Gem::Version
94
87
  version: 1.6.0
88
+ - !ruby/object:Gem::Dependency
89
+ name: ostruct
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
95
102
  - !ruby/object:Gem::Dependency
96
103
  name: thor
97
104
  requirement: !ruby/object:Gem::Requirement
@@ -140,28 +147,28 @@ dependencies:
140
147
  requirements:
141
148
  - - "~>"
142
149
  - !ruby/object:Gem::Version
143
- version: 1.68.0
150
+ version: 1.72.2
144
151
  type: :development
145
152
  prerelease: false
146
153
  version_requirements: !ruby/object:Gem::Requirement
147
154
  requirements:
148
155
  - - "~>"
149
156
  - !ruby/object:Gem::Version
150
- version: 1.68.0
157
+ version: 1.72.2
151
158
  - !ruby/object:Gem::Dependency
152
159
  name: rails
153
160
  requirement: !ruby/object:Gem::Requirement
154
161
  requirements:
155
162
  - - ">="
156
163
  - !ruby/object:Gem::Version
157
- version: 8.0.0
164
+ version: '7.2'
158
165
  type: :development
159
166
  prerelease: false
160
167
  version_requirements: !ruby/object:Gem::Requirement
161
168
  requirements:
162
169
  - - ">="
163
170
  - !ruby/object:Gem::Version
164
- version: 8.0.0
171
+ version: '7.2'
165
172
  - !ruby/object:Gem::Dependency
166
173
  name: rspec-rails
167
174
  requirement: !ruby/object:Gem::Requirement
@@ -263,10 +270,12 @@ licenses:
263
270
  metadata:
264
271
  bug_tracker_uri: https://github.com/Eric-Guo/wechat/issues
265
272
  changelog_uri: https://github.com/Eric-Guo/wechat/releases
266
- documentation_uri: https://github.com/Eric-Guo/wechat/tree/v0.17.6#readme
267
- source_code_uri: https://github.com/Eric-Guo/wechat/tree/v0.17.6
273
+ documentation_uri: https://github.com/Eric-Guo/wechat/tree/v1.0.0#readme
274
+ source_code_uri: https://github.com/Eric-Guo/wechat/tree/v1.0.0
268
275
  rubygems_mfa_required: 'true'
269
- post_install_message:
276
+ post_install_message: |2
277
+
278
+ BREAKING changes: WECHAT_PROXY_URL should be written with port now, like `export WECHAT_PROXY_URL=http://127.0.0.1:6152`, since WECHAT_PROXY_PORT removed.
270
279
  rdoc_options: []
271
280
  require_paths:
272
281
  - lib
@@ -281,8 +290,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
290
  - !ruby/object:Gem::Version
282
291
  version: 3.1.6
283
292
  requirements: []
284
- rubygems_version: 3.5.23
285
- signing_key:
293
+ rubygems_version: 3.6.9
286
294
  specification_version: 4
287
295
  summary: DSL for wechat message handling and API
288
296
  test_files: []
metadata.gz.sig CHANGED
Binary file