wechat 0.12.3 → 0.13.3
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +12 -390
- data/README-CN.md +100 -95
- data/README.md +6 -1
- data/bin/wechat +6 -3
- data/lib/action_controller/wechat_responder.rb +0 -11
- data/lib/generators/wechat/config_generator.rb +1 -1
- data/lib/generators/wechat/session_generator.rb +1 -1
- data/lib/wechat.rb +23 -11
- data/lib/wechat/api.rb +0 -6
- data/lib/wechat/concern/common.rb +9 -2
- data/lib/wechat/controller_api.rb +2 -2
- data/lib/wechat/corp_api.rb +0 -5
- data/lib/wechat/helpers.rb +2 -1
- data/lib/wechat/mp_api.rb +0 -8
- data/lib/wechat/responder.rb +9 -41
- data/lib/wechat/ticket/corp_jsapi_ticket.rb +0 -2
- data/lib/wechat/ticket/public_jsapi_ticket.rb +0 -2
- data/lib/wechat/token/corp_access_token.rb +0 -2
- data/lib/wechat/token/public_access_token.rb +0 -2
- metadata +28 -14
- metadata.gz.sig +0 -0
data/README.md
CHANGED
@@ -34,12 +34,16 @@ Use `gem install`
|
|
34
34
|
|
35
35
|
```
|
36
36
|
gem install "wechat"
|
37
|
+
# If your ruby version < 2.6
|
38
|
+
# gem install wechat -v 0.12.2
|
37
39
|
```
|
38
40
|
|
39
41
|
Or add it to your app's `Gemfile`:
|
40
42
|
|
41
43
|
```
|
42
44
|
gem 'wechat'
|
45
|
+
# If your rails version < 6.0
|
46
|
+
# gem 'wechat', '~> 0.12.2'
|
43
47
|
```
|
44
48
|
|
45
49
|
Run the following command to install it:
|
@@ -391,8 +395,9 @@ Wechat Public Account commands:
|
|
391
395
|
wechat group_delete [GROUP_ID] # 删除分组
|
392
396
|
wechat group_update [GROUP_ID, NEW_GROUP_NAME] # 修改分组名
|
393
397
|
wechat groups # 查询所有分组
|
394
|
-
wechat material_get [MEDIA_ID, PATH]
|
398
|
+
wechat material_get [MEDIA_ID, PATH] # 永久媒体下载
|
395
399
|
wechat material_add [MEDIA_TYPE, PATH] # 永久媒体上传
|
400
|
+
wechat material_add_news [MPNEWS_YAML_PATH] # 永久图文素材上传
|
396
401
|
wechat material_count # 获取永久素材总数
|
397
402
|
wechat material_delete [MEDIA_ID] # 删除永久素材
|
398
403
|
wechat material_list [TYPE, OFFSET, COUNT] # 获取永久素材列表
|
data/bin/wechat
CHANGED
@@ -6,13 +6,10 @@ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
|
6
6
|
require 'thor'
|
7
7
|
require 'wechat'
|
8
8
|
require 'json'
|
9
|
-
require 'active_support' # To support Rails 4.2.1, see #17936
|
10
|
-
require 'active_support/dependencies/autoload'
|
11
9
|
require 'active_support/core_ext'
|
12
10
|
require 'active_support/json'
|
13
11
|
require 'fileutils'
|
14
12
|
require 'yaml'
|
15
|
-
require 'wechat/api_loader'
|
16
13
|
require 'cgi'
|
17
14
|
|
18
15
|
class App < Thor
|
@@ -411,6 +408,12 @@ class App < Thor
|
|
411
408
|
puts wechat_api.material_add(type, path)
|
412
409
|
end
|
413
410
|
|
411
|
+
desc 'material_add_news [MPNEWS_YAML_PATH]', '永久图文素材上传'
|
412
|
+
def material_add_news(mpnews_yaml_path)
|
413
|
+
new = YAML.load(File.read(mpnews_yaml_path))
|
414
|
+
puts wechat_api.material_add_news(Wechat::Message.new(MsgType: 'mpnews').mpnews(new['articles']))
|
415
|
+
end
|
416
|
+
|
414
417
|
desc 'material_delete [MEDIA_ID]', '删除永久素材'
|
415
418
|
def material_delete(media_id)
|
416
419
|
puts wechat_api.material_delete(media_id)
|
data/lib/wechat.rb
CHANGED
@@ -1,20 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'zeitwerk'
|
4
|
+
loader = Zeitwerk::Loader.for_gem
|
5
|
+
loader.ignore("#{__dir__}/generators/**/*.rb")
|
6
|
+
loader.setup
|
7
|
+
|
3
8
|
require 'base64'
|
4
9
|
require 'openssl/cipher'
|
5
|
-
require 'wechat/api_loader'
|
6
|
-
require 'wechat/api'
|
7
|
-
require 'wechat/mp_api'
|
8
|
-
require 'wechat/corp_api'
|
9
|
-
require 'wechat/helpers'
|
10
|
-
require 'action_controller/wechat_responder'
|
11
10
|
|
12
11
|
module Wechat
|
13
|
-
autoload :Message, 'wechat/message'
|
14
|
-
autoload :Responder, 'wechat/responder'
|
15
|
-
autoload :Cipher, 'wechat/cipher'
|
16
|
-
autoload :ControllerApi, 'wechat/controller_api'
|
17
|
-
|
18
12
|
class AccessTokenExpiredError < StandardError; end
|
19
13
|
|
20
14
|
class InvalidCredentialError < StandardError; end
|
@@ -55,3 +49,21 @@ module Wechat
|
|
55
49
|
end
|
56
50
|
|
57
51
|
ActionView::Base.include Wechat::Helpers if defined? ActionView::Base
|
52
|
+
require 'action_controller/wechat_responder' # To make wechat_api and wechat_responder available
|
53
|
+
|
54
|
+
module ActionController
|
55
|
+
if defined? Base
|
56
|
+
ActiveSupport.on_load(:action_controller_base) do
|
57
|
+
class << Base
|
58
|
+
include WechatResponder
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
if defined? API
|
63
|
+
ActiveSupport.on_load(:action_controller_api) do
|
64
|
+
class << API
|
65
|
+
include WechatResponder
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/wechat/api.rb
CHANGED
@@ -1,11 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'wechat/api_base'
|
4
|
-
require 'wechat/http_client'
|
5
|
-
require 'wechat/token/public_access_token'
|
6
|
-
require 'wechat/ticket/public_jsapi_ticket'
|
7
|
-
require 'wechat/concern/common'
|
8
|
-
|
9
3
|
module Wechat
|
10
4
|
class Api < ApiBase
|
11
5
|
def initialize(appid, secret, token_file, timeout, skip_verify_ssl, jsapi_ticket_file)
|
@@ -148,8 +148,15 @@ module Wechat
|
|
148
148
|
post 'material/batchget_material', JSON.generate(type: type, offset: offset, count: count)
|
149
149
|
end
|
150
150
|
|
151
|
-
def material_add(type, file)
|
152
|
-
|
151
|
+
def material_add(type, file, opts = {})
|
152
|
+
params = { type: type }
|
153
|
+
params.merge!(description: opts.slice(:title, :introduction).to_json) if type == 'video'
|
154
|
+
|
155
|
+
post_file 'material/add_material', file, params: params
|
156
|
+
end
|
157
|
+
|
158
|
+
def material_add_news(mpnews_message)
|
159
|
+
post 'material/add_news', mpnews_message.to_json
|
153
160
|
end
|
154
161
|
|
155
162
|
def material_delete(media_id)
|
@@ -58,7 +58,7 @@ module Wechat
|
|
58
58
|
cookies.signed_or_encrypted[:we_access_token] = { value: access_info['access_token'], expires: self.class.oauth2_cookie_duration.from_now }
|
59
59
|
yield access_info['openid'], access_info
|
60
60
|
else
|
61
|
-
|
61
|
+
redirect_to generate_oauth2_url(oauth2_params), allow_other_host: true
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -73,7 +73,7 @@ module Wechat
|
|
73
73
|
cookies.signed_or_encrypted[:we_deviceid] = { value: userinfo['DeviceId'], expires: self.class.oauth2_cookie_duration.from_now }
|
74
74
|
yield userinfo['UserId'], userinfo
|
75
75
|
else
|
76
|
-
|
76
|
+
redirect_to generate_oauth2_url(oauth2_params), allow_other_host: true
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
data/lib/wechat/corp_api.rb
CHANGED
data/lib/wechat/helpers.rb
CHANGED
@@ -34,7 +34,8 @@ module Wechat
|
|
34
34
|
timestamp: "#{js_hash[:timestamp]}",
|
35
35
|
nonceStr: "#{js_hash[:noncestr]}",
|
36
36
|
signature: "#{js_hash[:signature]}",
|
37
|
-
jsApiList: ['#{config_options[:api]
|
37
|
+
jsApiList: ['#{config_options[:api]&.join("','")}'],
|
38
|
+
openTagList: ['#{config_options[:open_tags]&.join("','")}']
|
38
39
|
});
|
39
40
|
WECHAT_CONFIG_JS
|
40
41
|
javascript_tag config_js, type: 'application/javascript'
|
data/lib/wechat/mp_api.rb
CHANGED
@@ -1,13 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'wechat/api_base'
|
4
|
-
require 'wechat/http_client'
|
5
|
-
require 'wechat/token/public_access_token'
|
6
|
-
require 'wechat/ticket/public_jsapi_ticket'
|
7
|
-
require 'wechat/qcloud/token'
|
8
|
-
require 'wechat/concern/common'
|
9
|
-
require 'wechat/concern/qcloud'
|
10
|
-
|
11
3
|
module Wechat
|
12
4
|
class MpApi < ApiBase
|
13
5
|
def initialize(appid, secret, token_file, timeout, skip_verify_ssl, jsapi_ticket_file, qcloud_env, qcloud_token_file, qcloud_token_lifespan)
|
data/lib/wechat/responder.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'English'
|
4
4
|
require 'rexml/document'
|
5
|
-
require 'wechat/signature'
|
6
5
|
|
7
6
|
module Wechat
|
8
7
|
module Responder
|
@@ -11,24 +10,9 @@ module Wechat
|
|
11
10
|
include Cipher
|
12
11
|
|
13
12
|
included do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
skip_before_action :verify_authenticity_token
|
18
|
-
else
|
19
|
-
# Rails 5 API mode won't define verify_authenticity_token
|
20
|
-
# https://github.com/rails/rails/blob/v5.0.0.beta3/actionpack/lib/abstract_controller/callbacks.rb#L66
|
21
|
-
# https://github.com/rails/rails/blob/v5.0.0.beta3/activesupport/lib/active_support/callbacks.rb#L640
|
22
|
-
skip_before_action :verify_authenticity_token, raise: false
|
23
|
-
end
|
24
|
-
|
25
|
-
before_action :config_account, only: %i[show create]
|
26
|
-
before_action :verify_signature, only: %i[show create]
|
27
|
-
else
|
28
|
-
skip_before_filter :verify_authenticity_token
|
29
|
-
before_filter :config_account, only: %i[show create]
|
30
|
-
before_filter :verify_signature, only: %i[show create]
|
31
|
-
end
|
13
|
+
skip_before_action :verify_authenticity_token, raise: false
|
14
|
+
before_action :config_account, only: %i[show create]
|
15
|
+
before_action :verify_signature, only: %i[show create]
|
32
16
|
end
|
33
17
|
|
34
18
|
module ClassMethods
|
@@ -180,15 +164,9 @@ module Wechat
|
|
180
164
|
def show
|
181
165
|
if @we_corpid.present?
|
182
166
|
echostr, _corp_id = unpack(decrypt(Base64.decode64(params[:echostr]), @we_encoding_aes_key))
|
183
|
-
|
184
|
-
render plain: echostr
|
185
|
-
else
|
186
|
-
render text: echostr
|
187
|
-
end
|
188
|
-
elsif Rails::VERSION::MAJOR >= 4
|
189
|
-
render plain: params[:echostr]
|
167
|
+
render plain: echostr
|
190
168
|
else
|
191
|
-
render
|
169
|
+
render plain: params[:echostr]
|
192
170
|
end
|
193
171
|
end
|
194
172
|
|
@@ -197,11 +175,7 @@ module Wechat
|
|
197
175
|
response_msg = run_responder(request_msg)
|
198
176
|
|
199
177
|
if response_msg.respond_to? :to_xml
|
200
|
-
|
201
|
-
render plain: process_response(response_msg)
|
202
|
-
else
|
203
|
-
render text: process_response(response_msg)
|
204
|
-
end
|
178
|
+
render plain: process_response(response_msg)
|
205
179
|
else
|
206
180
|
head :ok, content_type: 'text/html'
|
207
181
|
end
|
@@ -248,15 +222,9 @@ module Wechat
|
|
248
222
|
end
|
249
223
|
|
250
224
|
data_hash = data.fetch('xml', {})
|
251
|
-
if
|
252
|
-
|
253
|
-
|
254
|
-
msg[:Event]&.downcase!
|
255
|
-
end
|
256
|
-
else
|
257
|
-
HashWithIndifferentAccess.new_from_hash_copying_default(data_hash).tap do |msg|
|
258
|
-
msg[:Event]&.downcase!
|
259
|
-
end
|
225
|
+
data_hash = data_hash.to_unsafe_hash if data_hash.instance_of?(ActionController::Parameters)
|
226
|
+
HashWithIndifferentAccess.new(data_hash).tap do |msg|
|
227
|
+
msg[:Event]&.downcase!
|
260
228
|
end
|
261
229
|
end
|
262
230
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wechat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Skinnyworm
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
spvOK5/LPXWX6ZGc2SR8SH/s7ftYH2EkeM1VUbtemow08NdgCwJ4IG+fRQ9dcrJ+
|
36
36
|
L9TbpLHvVrCe1w8duMqNeUmqj+M1iC/5Zst2vIe14QcOTuAh
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2021-
|
38
|
+
date: 2021-06-18 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: activesupport
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
requirements:
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
46
|
+
version: '6.0'
|
47
47
|
- - "<"
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '7'
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
requirements:
|
54
54
|
- - ">="
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
56
|
+
version: '6.0'
|
57
57
|
- - "<"
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '7'
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
version: 1.0.4
|
67
67
|
- - "<"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '6'
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: 1.0.4
|
77
77
|
- - "<"
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: '
|
79
|
+
version: '6'
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: nokogiri
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,48 +119,62 @@ dependencies:
|
|
119
119
|
- - ">="
|
120
120
|
- !ruby/object:Gem::Version
|
121
121
|
version: '0'
|
122
|
+
- !ruby/object:Gem::Dependency
|
123
|
+
name: zeitwerk
|
124
|
+
requirement: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - "~>"
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '2.4'
|
129
|
+
type: :runtime
|
130
|
+
prerelease: false
|
131
|
+
version_requirements: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - "~>"
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '2.4'
|
122
136
|
- !ruby/object:Gem::Dependency
|
123
137
|
name: rubocop
|
124
138
|
requirement: !ruby/object:Gem::Requirement
|
125
139
|
requirements:
|
126
140
|
- - "~>"
|
127
141
|
- !ruby/object:Gem::Version
|
128
|
-
version: '1.
|
142
|
+
version: '1.9'
|
129
143
|
type: :development
|
130
144
|
prerelease: false
|
131
145
|
version_requirements: !ruby/object:Gem::Requirement
|
132
146
|
requirements:
|
133
147
|
- - "~>"
|
134
148
|
- !ruby/object:Gem::Version
|
135
|
-
version: '1.
|
149
|
+
version: '1.9'
|
136
150
|
- !ruby/object:Gem::Dependency
|
137
151
|
name: rails
|
138
152
|
requirement: !ruby/object:Gem::Requirement
|
139
153
|
requirements:
|
140
154
|
- - ">="
|
141
155
|
- !ruby/object:Gem::Version
|
142
|
-
version: '
|
156
|
+
version: '6.0'
|
143
157
|
type: :development
|
144
158
|
prerelease: false
|
145
159
|
version_requirements: !ruby/object:Gem::Requirement
|
146
160
|
requirements:
|
147
161
|
- - ">="
|
148
162
|
- !ruby/object:Gem::Version
|
149
|
-
version: '
|
163
|
+
version: '6.0'
|
150
164
|
- !ruby/object:Gem::Dependency
|
151
165
|
name: rspec-rails
|
152
166
|
requirement: !ruby/object:Gem::Requirement
|
153
167
|
requirements:
|
154
168
|
- - "~>"
|
155
169
|
- !ruby/object:Gem::Version
|
156
|
-
version: '
|
170
|
+
version: '5.0'
|
157
171
|
type: :development
|
158
172
|
prerelease: false
|
159
173
|
version_requirements: !ruby/object:Gem::Requirement
|
160
174
|
requirements:
|
161
175
|
- - "~>"
|
162
176
|
- !ruby/object:Gem::Version
|
163
|
-
version: '
|
177
|
+
version: '5.0'
|
164
178
|
- !ruby/object:Gem::Dependency
|
165
179
|
name: sqlite3
|
166
180
|
requirement: !ruby/object:Gem::Requirement
|
@@ -237,14 +251,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
237
251
|
requirements:
|
238
252
|
- - ">="
|
239
253
|
- !ruby/object:Gem::Version
|
240
|
-
version: '2.
|
254
|
+
version: '2.6'
|
241
255
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
256
|
requirements:
|
243
257
|
- - ">="
|
244
258
|
- !ruby/object:Gem::Version
|
245
259
|
version: '0'
|
246
260
|
requirements: []
|
247
|
-
rubygems_version: 3.2.
|
261
|
+
rubygems_version: 3.2.20
|
248
262
|
signing_key:
|
249
263
|
specification_version: 4
|
250
264
|
summary: DSL for wechat message handling and API
|