wechat 0.7.0 → 0.7.1
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/CHANGELOG.md +10 -1
- data/README-CN.md +16 -9
- data/README.md +19 -12
- data/bin/wechat +8 -20
- data/lib/wechat/api.rb +3 -3
- data/lib/wechat/api_base.rb +7 -1
- data/lib/wechat/client.rb +12 -1
- data/lib/wechat/corp_api.rb +5 -5
- data/lib/wechat/responder.rb +2 -0
- data/lib/wechat/ticket/{jsapi_ticket.rb → public_jsapi_ticket.rb} +1 -2
- metadata +4 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24f3a19bb36361d788567cdb400d5a6247753de4
|
4
|
+
data.tar.gz: eee12cc2791847bb3a0568d57829b348785d10c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 742d6ed1dbad1e243aea4fce5e289838aee163f858da65d818c82638069e0ecb5a1afd94cb7a9b2689f30867aa4a6c18a8389fe7bdca8e81cae988fedf6dc04e
|
7
|
+
data.tar.gz: 8e0f78fedb6bc0cd798d1f8debbab117e3fa8ac642e5c42504d6e2226656b4813fd4ab3685b7092473ebc3ad0964ed416ee5db2b141742b0c70a3839477982a0
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v0.7.1 (released at 1/11/2016)
|
4
|
+
|
5
|
+
* Fix after using http, upload file function break. #78
|
6
|
+
* Add callback function after_wechat_response support. by @zfben #79
|
7
|
+
* Should using department_id instead of departmentid at enterprise api: user_simplelist/user_list.
|
8
|
+
|
3
9
|
## v0.7.0 (released at 1/1/2016)
|
4
10
|
|
5
|
-
* Using [http](https://github.com/httprb/http) instead of rest-client for performance reason.
|
11
|
+
* Using [http](https://github.com/httprb/http) instead of rest-client for performance reason. (not support upload file yet)
|
12
|
+
|
13
|
+
## v0.6.9 (released at 1/6/2016)
|
14
|
+
|
6
15
|
* Fix token refresh bug on multi worker. #76
|
7
16
|
* Rewrite the token relative code to add more storage support in future.
|
8
17
|
|
data/README-CN.md
CHANGED
@@ -79,16 +79,16 @@ default: &default
|
|
79
79
|
token: "app_token"
|
80
80
|
access_token: "/var/tmp/wechat_access_token"
|
81
81
|
|
82
|
-
production:
|
82
|
+
production:
|
83
83
|
appid: <%= ENV['WECHAT_APPID'] %>
|
84
84
|
secret: <%= ENV['WECHAT_APP_SECRET'] %>
|
85
85
|
token: <%= ENV['WECHAT_TOKEN'] %>
|
86
86
|
access_token: <%= ENV['WECHAT_ACCESS_TOKEN'] %>
|
87
87
|
|
88
|
-
development:
|
88
|
+
development:
|
89
89
|
<<: *default
|
90
90
|
|
91
|
-
test:
|
91
|
+
test:
|
92
92
|
<<: *default
|
93
93
|
```
|
94
94
|
|
@@ -149,11 +149,11 @@ Wechat服务器有报道曾出现[RestClient::SSLCertificateNotVerified](http://
|
|
149
149
|
```ruby
|
150
150
|
class WechatFirstController < ActionController::Base
|
151
151
|
wechat_responder appid: "app1", secret: "secret1", token: "token1", access_token: Rails.root.join("tmp/access_token1")
|
152
|
-
|
152
|
+
|
153
153
|
on :text, with:"help", respond: "help content"
|
154
154
|
end
|
155
155
|
```
|
156
|
-
|
156
|
+
|
157
157
|
#### jssdk 支持
|
158
158
|
|
159
159
|
jssdk 使用前需通过config接口注入权限验证配置, 所需参数可以通过 signature 方法获取:
|
@@ -354,7 +354,7 @@ articles:
|
|
354
354
|
然后执行命令行
|
355
355
|
|
356
356
|
```
|
357
|
-
$ wechat custom_news oCfEht9oM*********** articles.yml
|
357
|
+
$ wechat custom_news oCfEht9oM*********** articles.yml
|
358
358
|
|
359
359
|
```
|
360
360
|
|
@@ -368,7 +368,7 @@ template:
|
|
368
368
|
url: "http://weixin.qq.com/download"
|
369
369
|
topcolor: "#FF0000"
|
370
370
|
data:
|
371
|
-
first:
|
371
|
+
first:
|
372
372
|
value: "你好,你已报名成功"
|
373
373
|
color: "#0A0A0A"
|
374
374
|
keynote1:
|
@@ -405,7 +405,7 @@ $ wechat template_message oCfEht9oM*********** template.yml
|
|
405
405
|
```ruby
|
406
406
|
class WechatsController < ActionController::Base
|
407
407
|
wechat_responder
|
408
|
-
|
408
|
+
|
409
409
|
# 默认文字信息responder
|
410
410
|
on :text do |request, content|
|
411
411
|
request.reply.text "echo: #{content}" #Just echo
|
@@ -522,6 +522,13 @@ class WechatsController < ActionController::Base
|
|
522
522
|
|
523
523
|
# 当无任何responder处理用户信息时,使用这个responder处理
|
524
524
|
on :fallback, respond: 'fallback message'
|
525
|
+
|
526
|
+
# 如果你要在微信回复后增加一些操作,可以用 after_wechat_response(req, res)
|
527
|
+
# private
|
528
|
+
#
|
529
|
+
# def after_wechat_response(req, res)
|
530
|
+
# WechatLog.create req: req, res: res
|
531
|
+
# end
|
525
532
|
end
|
526
533
|
```
|
527
534
|
|
@@ -557,7 +564,7 @@ class WechatsController < ActionController::Base
|
|
557
564
|
# 当无任何responder处理用户信息时,转发至客服处理。
|
558
565
|
on :fallback do |message|
|
559
566
|
message.reply.transfer_customer_service
|
560
|
-
end
|
567
|
+
end
|
561
568
|
end
|
562
569
|
```
|
563
570
|
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ WeChat gem trying to helping Rails developer to integrated [enterprise account](
|
|
17
17
|
|
18
18
|
`wechat` command share the same API in console, so you can interactive with wechat server quickly, without starting up web environment/code.
|
19
19
|
|
20
|
-
A responder DSL can used in Rails controller, so giving a event based interface to handler message sent by end user from wechat server.
|
20
|
+
A responder DSL can used in Rails controller, so giving a event based interface to handler message sent by end user from wechat server.
|
21
21
|
|
22
22
|
Wechat provide OAuth2.0 as authentication service and possible to intergrated with devise/other authorization gems, [omniauth-wechat-oauth2](https://github.com/skinnyworm/omniauth-wechat-oauth2) is a good start
|
23
23
|
|
@@ -88,16 +88,16 @@ default: &default
|
|
88
88
|
token: "app_token"
|
89
89
|
access_token: "/var/tmp/wechat_access_token"
|
90
90
|
|
91
|
-
production:
|
91
|
+
production:
|
92
92
|
appid: <%= ENV['WECHAT_APPID'] %>
|
93
93
|
secret: <%= ENV['WECHAT_APP_SECRET'] %>
|
94
94
|
token: <%= ENV['WECHAT_TOKEN'] %>
|
95
95
|
access_token: <%= ENV['WECHAT_ACCESS_TOKEN'] %>
|
96
96
|
|
97
|
-
development:
|
97
|
+
development:
|
98
98
|
<<: *default
|
99
99
|
|
100
|
-
test:
|
100
|
+
test:
|
101
101
|
<<: *default
|
102
102
|
```
|
103
103
|
|
@@ -161,11 +161,11 @@ Rare case, you may want to hosting more than one wechat enterprise/public accoun
|
|
161
161
|
```ruby
|
162
162
|
class WechatFirstController < ActionController::Base
|
163
163
|
wechat_responder appid: "app1", secret: "secret1", token: "token1", access_token: Rails.root.join("tmp/access_token1")
|
164
|
-
|
164
|
+
|
165
165
|
on :text, with:"help", respond: "help content"
|
166
166
|
end
|
167
167
|
```
|
168
|
-
|
168
|
+
|
169
169
|
#### JS-SDK helper
|
170
170
|
|
171
171
|
JS-SDK enable you control wechat behavior in your web page, but need inject a config with signature methods first, you can obtain those signature hash via below
|
@@ -182,7 +182,7 @@ wechat gems won't handle any privilege exception. (except token time out, but it
|
|
182
182
|
|
183
183
|
The available API is different between public account and enterprise account, so wechat gems provide different set of command.
|
184
184
|
|
185
|
-
Feel safe if you can not read Chinese in the comments, it's keep there in order to copy & find in official document more easier.
|
185
|
+
Feel safe if you can not read Chinese in the comments, it's keep there in order to copy & find in official document more easier.
|
186
186
|
|
187
187
|
#### Public account command line
|
188
188
|
|
@@ -367,7 +367,7 @@ articles:
|
|
367
367
|
After that, can running command:
|
368
368
|
|
369
369
|
```
|
370
|
-
$ wechat custom_news oCfEht9oM*********** articles.yml
|
370
|
+
$ wechat custom_news oCfEht9oM*********** articles.yml
|
371
371
|
|
372
372
|
```
|
373
373
|
|
@@ -381,7 +381,7 @@ template:
|
|
381
381
|
url: "http://weixin.qq.com/download"
|
382
382
|
topcolor: "#FF0000"
|
383
383
|
data:
|
384
|
-
first:
|
384
|
+
first:
|
385
385
|
value: "Hello, you successfully registed"
|
386
386
|
color: "#0A0A0A"
|
387
387
|
keynote1:
|
@@ -535,10 +535,17 @@ class WechatsController < ActionController::Base
|
|
535
535
|
|
536
536
|
# Any not match above will fail to below
|
537
537
|
on :fallback, respond: 'fallback message'
|
538
|
+
|
539
|
+
# If you need do something after response, you should add after_wechat_response(req, res)
|
540
|
+
# private
|
541
|
+
#
|
542
|
+
# def after_wechat_response(req, res)
|
543
|
+
# WechatLog.create req: req, res: res
|
544
|
+
# end
|
538
545
|
end
|
539
546
|
```
|
540
547
|
|
541
|
-
So the importent statement is only `wechat_responder`, all other is just a DSL:
|
548
|
+
So the importent statement is only `wechat_responder`, all other is just a DSL:
|
542
549
|
|
543
550
|
```
|
544
551
|
on <message_type> do |message|
|
@@ -571,13 +578,13 @@ class WechatsController < ActionController::Base
|
|
571
578
|
# When no other responder can handle incoming message, will transfer to human customer service.
|
572
579
|
on :fallback do |message|
|
573
580
|
message.reply.transfer_customer_service
|
574
|
-
end
|
581
|
+
end
|
575
582
|
end
|
576
583
|
```
|
577
584
|
|
578
585
|
Caution: do not setting default text responder if you want to using [multiply human customer service](http://dkf.qq.com/), other will lead text message can not transfer.
|
579
586
|
|
580
|
-
|
587
|
+
|
581
588
|
## Known Issue
|
582
589
|
|
583
590
|
* Sometime, enterprise account can not receive the menu message due to Tencent server can not resolved the DNS, so using IP as a callback URL more stable, but it's never happen for user sent text message.
|
data/bin/wechat
CHANGED
@@ -173,8 +173,7 @@ class App < Thor
|
|
173
173
|
|
174
174
|
desc 'upload_replaceparty [BATCH_PARTY_CSV_PATH]', '上传文件方式全量覆盖部门'
|
175
175
|
def upload_replaceparty(batch_party_csv_path)
|
176
|
-
|
177
|
-
media_id = wechat_api.media_create('file', file)['media_id']
|
176
|
+
media_id = wechat_api.media_create('file', batch_party_csv_path)['media_id']
|
178
177
|
job_id = wechat_api.batch_replaceparty(media_id)['jobid']
|
179
178
|
puts "running job_id: #{job_id}"
|
180
179
|
puts wechat_api.batch_job_result(job_id)
|
@@ -192,8 +191,7 @@ class App < Thor
|
|
192
191
|
|
193
192
|
desc 'upload_replaceuser [BATCH_USER_CSV_PATH]', '上传文件方式全量覆盖成员'
|
194
193
|
def upload_replaceuser(batch_user_csv_path)
|
195
|
-
|
196
|
-
media_id = wechat_api.media_create('file', file)['media_id']
|
194
|
+
media_id = wechat_api.media_create('file', batch_user_csv_path)['media_id']
|
197
195
|
job_id = wechat_api.batch_replaceuser(media_id)['jobid']
|
198
196
|
puts "running job_id: #{job_id}"
|
199
197
|
puts wechat_api.batch_job_result(job_id)
|
@@ -321,8 +319,7 @@ class App < Thor
|
|
321
319
|
|
322
320
|
desc 'media_create [MEDIA_TYPE, PATH]', '媒体上传'
|
323
321
|
def media_create(type, path)
|
324
|
-
|
325
|
-
puts wechat_api.media_create(type, file)
|
322
|
+
puts wechat_api.media_create(type, path)
|
326
323
|
end
|
327
324
|
|
328
325
|
desc 'material [MEDIA_ID, PATH]', '永久媒体下载'
|
@@ -334,8 +331,7 @@ class App < Thor
|
|
334
331
|
|
335
332
|
desc 'material_add [MEDIA_TYPE, PATH]', '永久媒体上传'
|
336
333
|
def material_add(type, path)
|
337
|
-
|
338
|
-
puts wechat_api.material_add(type, file)
|
334
|
+
puts wechat_api.material_add(type, path)
|
339
335
|
end
|
340
336
|
|
341
337
|
desc 'material_delete [MEDIA_ID]', '删除永久素材'
|
@@ -370,19 +366,15 @@ class App < Thor
|
|
370
366
|
|
371
367
|
desc 'custom_image [OPENID, IMAGE_PATH]', '发送图片客服消息'
|
372
368
|
def custom_image(openid, image_path)
|
373
|
-
file = File.new(image_path)
|
374
369
|
api = wechat_api
|
375
|
-
|
376
|
-
media_id = api.media_create('image', file)['media_id']
|
370
|
+
media_id = api.media_create('image', image_path)['media_id']
|
377
371
|
puts api.custom_message_send Wechat::Message.to(openid).image(media_id)
|
378
372
|
end
|
379
373
|
|
380
374
|
desc 'custom_voice [OPENID, VOICE_PATH]', '发送语音客服消息'
|
381
375
|
def custom_voice(openid, voice_path)
|
382
|
-
file = File.new(voice_path)
|
383
376
|
api = wechat_api
|
384
|
-
|
385
|
-
media_id = api.media_create('voice', file)['media_id']
|
377
|
+
media_id = api.media_create('voice', voice_path)['media_id']
|
386
378
|
puts api.custom_message_send Wechat::Message.to(openid).voice(media_id)
|
387
379
|
end
|
388
380
|
|
@@ -390,11 +382,9 @@ class App < Thor
|
|
390
382
|
method_option :title, aliases: '-h', desc: '视频标题'
|
391
383
|
method_option :description, aliases: '-d', desc: '视频描述'
|
392
384
|
def custom_video(openid, video_path)
|
393
|
-
file = File.new(video_path)
|
394
385
|
api = wechat_api
|
395
|
-
|
396
386
|
api_opts = options.slice(:title, :description)
|
397
|
-
media_id = api.media_create('video',
|
387
|
+
media_id = api.media_create('video', video_path)['media_id']
|
398
388
|
puts api.custom_message_send Wechat::Message.to(openid).video(media_id, api_opts)
|
399
389
|
end
|
400
390
|
|
@@ -403,11 +393,9 @@ class App < Thor
|
|
403
393
|
method_option :description, aliases: '-d', desc: '音乐描述'
|
404
394
|
method_option :HQ_music_url, aliases: '-u', desc: '高质量音乐URL链接'
|
405
395
|
def custom_music(openid, thumbnail_path, music_url)
|
406
|
-
file = File.new(thumbnail_path)
|
407
396
|
api = wechat_api
|
408
|
-
|
409
397
|
api_opts = options.slice(:title, :description, :HQ_music_url)
|
410
|
-
thumb_media_id = api.media_create('thumb',
|
398
|
+
thumb_media_id = api.media_create('thumb', thumbnail_path)['thumb_media_id']
|
411
399
|
puts api.custom_message_send Wechat::Message.to(openid).music(thumb_media_id, music_url, api_opts)
|
412
400
|
end
|
413
401
|
|
data/lib/wechat/api.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'wechat/api_base'
|
2
2
|
require 'wechat/client'
|
3
3
|
require 'wechat/token/public_access_token'
|
4
|
-
require 'wechat/ticket/
|
4
|
+
require 'wechat/ticket/public_jsapi_ticket'
|
5
5
|
|
6
6
|
module Wechat
|
7
7
|
class Api < ApiBase
|
@@ -11,7 +11,7 @@ module Wechat
|
|
11
11
|
def initialize(appid, secret, token_file, timeout, skip_verify_ssl, jsapi_ticket_file)
|
12
12
|
@client = Client.new(API_BASE, timeout, skip_verify_ssl)
|
13
13
|
@access_token = Token::PublicAccessToken.new(@client, appid, secret, token_file)
|
14
|
-
@jsapi_ticket = Ticket::
|
14
|
+
@jsapi_ticket = Ticket::PublicJsapiTicket.new(@client, @access_token, jsapi_ticket_file)
|
15
15
|
end
|
16
16
|
|
17
17
|
def groups
|
@@ -94,7 +94,7 @@ module Wechat
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def material_add(type, file)
|
97
|
-
|
97
|
+
post_file 'material/add_material', file, params: { type: type }
|
98
98
|
end
|
99
99
|
|
100
100
|
def material_delete(media_id)
|
data/lib/wechat/api_base.rb
CHANGED
@@ -17,7 +17,7 @@ module Wechat
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def media_create(type, file)
|
20
|
-
|
20
|
+
post_file 'media/upload', file, params: { type: type }
|
21
21
|
end
|
22
22
|
|
23
23
|
protected
|
@@ -34,6 +34,12 @@ module Wechat
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
def post_file(path, file, headers = {})
|
38
|
+
with_access_token(headers[:params]) do |params|
|
39
|
+
client.post_file path, file, headers.merge(params: params)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
37
43
|
def with_access_token(params = {}, tries = 2)
|
38
44
|
params ||= {}
|
39
45
|
yield(params.merge(access_token: access_token.token))
|
data/lib/wechat/client.rb
CHANGED
@@ -25,12 +25,23 @@ module Wechat
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def post_file(path, file, post_header = {})
|
29
|
+
request(path, post_header) do |url, header|
|
30
|
+
params = header.delete(:params)
|
31
|
+
HTTP.headers(header)
|
32
|
+
.post(url, params: params,
|
33
|
+
form: { media: HTTP::FormData::File.new(file),
|
34
|
+
hack: 'X' }, # Existing here for http-form_data 1.0.1 handle single param improperly
|
35
|
+
ssl_context: ssl_context)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
28
39
|
private
|
29
40
|
|
30
41
|
def request(path, header = {}, &_block)
|
31
42
|
url = "#{header.delete(:base) || base}#{path}"
|
32
43
|
as = header.delete(:as)
|
33
|
-
header.merge!(
|
44
|
+
header.merge!('Accept' => 'application/json')
|
34
45
|
response = yield(url, header)
|
35
46
|
|
36
47
|
fail "Request not OK, response status #{response.status}" if response.status != 200
|
data/lib/wechat/corp_api.rb
CHANGED
@@ -90,12 +90,12 @@ module Wechat
|
|
90
90
|
get 'department/list', params: { id: departmentid }
|
91
91
|
end
|
92
92
|
|
93
|
-
def user_simplelist(
|
94
|
-
get 'user/simplelist', params: {
|
93
|
+
def user_simplelist(department_id, fetch_child = 0, status = 0)
|
94
|
+
get 'user/simplelist', params: { department_id: department_id, fetch_child: fetch_child, status: status }
|
95
95
|
end
|
96
96
|
|
97
|
-
def user_list(
|
98
|
-
get 'user/list', params: {
|
97
|
+
def user_list(department_id, fetch_child = 0, status = 0)
|
98
|
+
get 'user/list', params: { department_id: department_id, fetch_child: fetch_child, status: status }
|
99
99
|
end
|
100
100
|
|
101
101
|
def tag_create(tagname, tagid = nil)
|
@@ -152,7 +152,7 @@ module Wechat
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def material_add(type, file)
|
155
|
-
|
155
|
+
post_file 'material/add_material', file, params: { type: type, agentid: agentid }
|
156
156
|
end
|
157
157
|
|
158
158
|
def material_delete(media_id)
|
data/lib/wechat/responder.rb
CHANGED
@@ -2,8 +2,7 @@ require 'wechat/ticket/jsapi_base'
|
|
2
2
|
|
3
3
|
module Wechat
|
4
4
|
module Ticket
|
5
|
-
class
|
6
|
-
# refresh jsapi ticket
|
5
|
+
class PublicJsapiTicket < JsapiBase
|
7
6
|
def refresh
|
8
7
|
data = client.get('ticket/getticket', params: { access_token: access_token.token, type: 'jsapi' })
|
9
8
|
write_ticket_to_file(data)
|
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.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Skinnyworm
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-01-
|
12
|
+
date: 2016-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -136,7 +136,7 @@ files:
|
|
136
136
|
- lib/wechat/signature.rb
|
137
137
|
- lib/wechat/ticket/corp_jsapi_ticket.rb
|
138
138
|
- lib/wechat/ticket/jsapi_base.rb
|
139
|
-
- lib/wechat/ticket/
|
139
|
+
- lib/wechat/ticket/public_jsapi_ticket.rb
|
140
140
|
- lib/wechat/token/access_token_base.rb
|
141
141
|
- lib/wechat/token/corp_access_token.rb
|
142
142
|
- lib/wechat/token/public_access_token.rb
|
@@ -144,13 +144,7 @@ homepage: https://github.com/Eric-Guo/wechat
|
|
144
144
|
licenses:
|
145
145
|
- MIT
|
146
146
|
metadata: {}
|
147
|
-
post_install_message:
|
148
|
-
*****WECHAT BREAK CHANGE*****
|
149
|
-
1. Scan 2D barcode using new syntax `on :scan, with: 'BINDING_QR_CODE' `
|
150
|
-
instead of previous `on :event, with: 'BINDING_QR_CODE' `.
|
151
|
-
2. Batch job using new syntax `on :batch_job, with: 'replace_user' `
|
152
|
-
instead of previous `on :event, with: 'replace_user' `.
|
153
|
-
*****************************
|
147
|
+
post_install_message:
|
154
148
|
rdoc_options: []
|
155
149
|
require_paths:
|
156
150
|
- lib
|