wechat 0.6.6 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +8 -1
- data/bin/wechat +7 -0
- data/lib/action_controller/wechat_responder.rb +3 -2
- data/lib/generators/wechat/templates/config/wechat.yml +2 -0
- data/lib/wechat/api.rb +2 -2
- data/lib/wechat/api_loader.rb +4 -2
- data/lib/wechat/client.rb +6 -13
- data/lib/wechat/corp_api.rb +12 -2
- data/lib/wechat/responder.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eee061e4522d5960256e017183c61f615ef94a0d
|
4
|
+
data.tar.gz: 510a350df936a6d4d9465997ba253b4ef3e78634
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f21668a1dc3cbb3fac9336e57d214a4d9d99a1814e30e1474b1a0e9d12dd47c47bc69c5f6af02c4b6bb89f09ab76ade708ebaebfb838eba4110268730ac69688
|
7
|
+
data.tar.gz: efa6851ddb7f3f948daccdc148c412f8a73e2211c123c4417ddd3e7195cdeb3030e8f046162328e3c11ded6b96cf3c5143e35d92757fe6770f530ef18ed876a4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v0.6.7 (released at 12/18/2015)
|
4
|
+
|
5
|
+
* Add timeout configuration option, close #74
|
6
|
+
* New getuserinfo and oauth2_url to support getting FromUserName from web page.
|
7
|
+
|
3
8
|
## v0.6.6 (released at 12/15/2015)
|
4
9
|
|
5
10
|
* Add jsapi_ticket support for Enterprise Account
|
data/README.md
CHANGED
@@ -118,7 +118,8 @@ production:
|
|
118
118
|
agentid: <%= ENV['WECHAT_AGENTID'] %>
|
119
119
|
access_token: <%= ENV['WECHAT_ACCESS_TOKEN'] %>
|
120
120
|
token: <%= ENV['WECHAT_TOKEN'] %>
|
121
|
-
|
121
|
+
timeout: 30,
|
122
|
+
skip_verify_ssl: true
|
122
123
|
encoding_aes_key: <%= ENV['WECHAT_ENCODING_AES_KEY'] %>
|
123
124
|
jsapi_ticket: <%= ENV['WECHAT_JSAPI_TICKET'] %>
|
124
125
|
|
@@ -133,6 +134,10 @@ test:
|
|
133
134
|
|
134
135
|
注意在Rails项目根目录下运行`wechat`命令行工具会优先使用`config/wechat.yml`中的`default`配置,如果失败则使用`~\.wechat.yml`中的配置,以便于在生产环境下管理多个微信账号应用。
|
135
136
|
|
137
|
+
##### 配置微信服务器超时
|
138
|
+
|
139
|
+
微信服务器有时请求会花很长时间,如果不配置,默认为20秒,可视情况配置。
|
140
|
+
|
136
141
|
##### 配置跳过SSL认证
|
137
142
|
|
138
143
|
Wechat服务器有报道曾出现[RestClient::SSLCertificateNotVerified](http://qydev.weixin.qq.com/qa/index.php?qa=11037)错误,此时可以选择关闭SSL验证。`skip_verify_ssl: true`
|
@@ -191,6 +196,7 @@ Wechat commands:
|
|
191
196
|
wechat menu # 当前菜单
|
192
197
|
wechat menu_create [MENU_YAML_PATH] # 创建菜单
|
193
198
|
wechat menu_delete # 删除菜单
|
199
|
+
wechat oauth2_url [REDIRECT_URI] # 生成OAuth2.0验证URL
|
194
200
|
wechat qrcode_create_limit_scene [SCENE_ID_OR_STR] # 请求永久二维码
|
195
201
|
wechat qrcode_create_scene [SCENE_ID, EXPIRE_SECONDS] # 请求临时二维码
|
196
202
|
wechat qrcode_download [TICKET, QR_CODE_PIC_PATH] # 通过ticket下载二维码
|
@@ -236,6 +242,7 @@ Wechat commands:
|
|
236
242
|
wechat menu_create [MENU_YAML_PATH] # 创建菜单
|
237
243
|
wechat menu_delete # 删除菜单
|
238
244
|
wechat message_send [OPENID, TEXT_MESSAGE] # 发送文字消息
|
245
|
+
wechat oauth2_url [REDIRECT_URI] # 生成OAuth2.0验证URL
|
239
246
|
wechat qrcode_download [TICKET, QR_CODE_PIC_PATH] # 通过ticket下载二维码
|
240
247
|
wechat tag [TAG_ID] # 获取标签成员
|
241
248
|
wechat tag_add_department [TAG_ID, PARTY_IDS] # 增加标签部门
|
data/bin/wechat
CHANGED
@@ -13,6 +13,7 @@ require 'active_support/json'
|
|
13
13
|
require 'fileutils'
|
14
14
|
require 'yaml'
|
15
15
|
require 'wechat/api_loader'
|
16
|
+
require 'cgi'
|
16
17
|
|
17
18
|
class App < Thor
|
18
19
|
package_name 'Wechat'
|
@@ -284,6 +285,12 @@ class App < Thor
|
|
284
285
|
puts wechat_api.user(open_id)
|
285
286
|
end
|
286
287
|
|
288
|
+
desc 'oauth2_url [REDIRECT_URI]', '生成OAuth2.0验证URL'
|
289
|
+
def oauth2_url(redirect_uri)
|
290
|
+
appid = Wechat.config.corpid || Wechat.config.appid
|
291
|
+
puts oauth2_url(redirect_uri, appid)
|
292
|
+
end
|
293
|
+
|
287
294
|
desc 'user_update_remark [OPEN_ID, REMARK]', '设置备注名'
|
288
295
|
def user_update_remark(openid, remark)
|
289
296
|
puts wechat_api.user_update_remark(openid, remark)
|
@@ -6,6 +6,7 @@ module ActionController
|
|
6
6
|
self.corpid = opts[:corpid] || Wechat.config.corpid
|
7
7
|
self.agentid = opts[:agentid] || Wechat.config.agentid
|
8
8
|
self.encrypt_mode = opts[:encrypt_mode] || Wechat.config.encrypt_mode || corpid.present?
|
9
|
+
self.timeout = opts[:timeout] || 20
|
9
10
|
self.skip_verify_ssl = opts[:skip_verify_ssl]
|
10
11
|
self.token = opts[:token] || Wechat.config.token
|
11
12
|
self.encoding_aes_key = opts[:encoding_aes_key] || Wechat.config.encoding_aes_key
|
@@ -14,9 +15,9 @@ module ActionController
|
|
14
15
|
self.wechat = Wechat.api
|
15
16
|
else
|
16
17
|
if corpid.present?
|
17
|
-
self.wechat = Wechat::CorpApi.new(corpid, opts[:corpsecret], opts[:access_token], agentid, skip_verify_ssl, opts[:jsapi_ticket])
|
18
|
+
self.wechat = Wechat::CorpApi.new(corpid, opts[:corpsecret], opts[:access_token], agentid, timeout, skip_verify_ssl, opts[:jsapi_ticket])
|
18
19
|
else
|
19
|
-
self.wechat = Wechat::Api.new(opts[:appid], opts[:secret], opts[:access_token], skip_verify_ssl, opts[:jsapi_ticket])
|
20
|
+
self.wechat = Wechat::Api.new(opts[:appid], opts[:secret], opts[:access_token], timeout, skip_verify_ssl, opts[:jsapi_ticket])
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
@@ -19,6 +19,8 @@ production:
|
|
19
19
|
# appid: <%= ENV['WECHAT_APPID'] %>
|
20
20
|
# secret: <%= ENV['WECHAT_APP_SECRET'] %>
|
21
21
|
token: <%%= ENV['WECHAT_TOKEN'] %>
|
22
|
+
timeout: 30,
|
23
|
+
skip_verify_ssl: true
|
22
24
|
access_token: <%%= ENV['WECHAT_ACCESS_TOKEN'] %>
|
23
25
|
encrypt_mode: false # if true must fill encoding_aes_key
|
24
26
|
encoding_aes_key: <%%= ENV['WECHAT_ENCODING_AES_KEY'] %>
|
data/lib/wechat/api.rb
CHANGED
@@ -8,8 +8,8 @@ module Wechat
|
|
8
8
|
API_BASE = 'https://api.weixin.qq.com/cgi-bin/'
|
9
9
|
OAUTH2_BASE = 'https://api.weixin.qq.com/sns/oauth2/'
|
10
10
|
|
11
|
-
def initialize(appid, secret, token_file, skip_verify_ssl, jsapi_ticket_file)
|
12
|
-
@client = Client.new(API_BASE, skip_verify_ssl)
|
11
|
+
def initialize(appid, secret, token_file, timeout, skip_verify_ssl, jsapi_ticket_file)
|
12
|
+
@client = Client.new(API_BASE, timeout, skip_verify_ssl)
|
13
13
|
@access_token = AccessToken.new(@client, appid, secret, token_file)
|
14
14
|
@jsapi_ticket = JsapiTicket.new(@client, @access_token, jsapi_ticket_file)
|
15
15
|
end
|
data/lib/wechat/api_loader.rb
CHANGED
@@ -7,9 +7,9 @@ module Wechat
|
|
7
7
|
js_token_file = options[:js_token_file] || c.jsapi_ticket || '/var/tmp/wechat_jsapi_ticket'
|
8
8
|
|
9
9
|
if c.appid && c.secret && token_file.present?
|
10
|
-
Wechat::Api.new(c.appid, c.secret, token_file, c.skip_verify_ssl, js_token_file)
|
10
|
+
Wechat::Api.new(c.appid, c.secret, token_file, c.timeout, c.skip_verify_ssl, js_token_file)
|
11
11
|
elsif c.corpid && c.corpsecret && token_file.present?
|
12
|
-
Wechat::CorpApi.new(c.corpid, c.corpsecret, token_file, c.agentid, c.skip_verify_ssl, js_token_file)
|
12
|
+
Wechat::CorpApi.new(c.corpid, c.corpsecret, token_file, c.agentid, c.timeout, c.skip_verify_ssl, js_token_file)
|
13
13
|
else
|
14
14
|
puts <<-HELP
|
15
15
|
Need create ~/.wechat.yml with wechat appid and secret
|
@@ -35,6 +35,7 @@ HELP
|
|
35
35
|
config[:access_token] ||= Rails.root.join('tmp/access_token').to_s
|
36
36
|
config[:jsapi_ticket] ||= Rails.root.join('tmp/jsapi_ticket').to_s
|
37
37
|
end
|
38
|
+
config[:timeout] ||= 20
|
38
39
|
config.symbolize_keys!
|
39
40
|
@config = OpenStruct.new(config)
|
40
41
|
end
|
@@ -68,6 +69,7 @@ HELP
|
|
68
69
|
token: ENV['WECHAT_TOKEN'],
|
69
70
|
access_token: ENV['WECHAT_ACCESS_TOKEN'],
|
70
71
|
encrypt_mode: ENV['WECHAT_ENCRYPT_MODE'],
|
72
|
+
timeout: ENV['WECHAT_TIMEOUT'],
|
71
73
|
skip_verify_ssl: ENV['WECHAT_SKIP_VERIFY_SSL'],
|
72
74
|
encoding_aes_key: ENV['WECHAT_ENCODING_AES_KEY'],
|
73
75
|
jsapi_ticket: ENV['WECHAT_JSAPI_TICKET'] }
|
data/lib/wechat/client.rb
CHANGED
@@ -2,30 +2,23 @@ require 'rest_client'
|
|
2
2
|
|
3
3
|
module Wechat
|
4
4
|
class Client
|
5
|
-
attr_reader :base, :verify_ssl
|
5
|
+
attr_reader :base, :timeout, :verify_ssl
|
6
6
|
|
7
|
-
def initialize(base, skip_verify_ssl)
|
7
|
+
def initialize(base, timeout, skip_verify_ssl)
|
8
8
|
@base = base
|
9
|
-
@
|
9
|
+
@timeout = timeout
|
10
|
+
@verify_ssl = skip_verify_ssl ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER
|
10
11
|
end
|
11
12
|
|
12
13
|
def get(path, header = {})
|
13
14
|
request(path, header) do |url, header|
|
14
|
-
|
15
|
-
RestClient.get(url, header)
|
16
|
-
else
|
17
|
-
RestClient::Request.execute(url: url, method: :get, headers: header, verify_ssl: OpenSSL::SSL::VERIFY_NONE)
|
18
|
-
end
|
15
|
+
RestClient::Request.execute(method: :get, url: url, headers: header, timeout: timeout, verify_ssl: verify_ssl)
|
19
16
|
end
|
20
17
|
end
|
21
18
|
|
22
19
|
def post(path, payload, header = {})
|
23
20
|
request(path, header) do |url, header|
|
24
|
-
|
25
|
-
RestClient.post(url, payload, header)
|
26
|
-
else
|
27
|
-
RestClient::Request.execute(url: url, method: :post, payload: payload, headers: header, verify_ssl: OpenSSL::SSL::VERIFY_NONE)
|
28
|
-
end
|
21
|
+
RestClient::Request.execute(method: :post, url: url, payload: payload, headers: header, timeout: timeout, verify_ssl: verify_ssl)
|
29
22
|
end
|
30
23
|
end
|
31
24
|
|
data/lib/wechat/corp_api.rb
CHANGED
@@ -2,6 +2,7 @@ require 'wechat/api_base'
|
|
2
2
|
require 'wechat/client'
|
3
3
|
require 'wechat/access_token'
|
4
4
|
require 'wechat/corp_jsapi_ticket'
|
5
|
+
require 'cgi'
|
5
6
|
|
6
7
|
module Wechat
|
7
8
|
class CorpAccessToken < AccessToken
|
@@ -18,8 +19,8 @@ module Wechat
|
|
18
19
|
|
19
20
|
API_BASE = 'https://qyapi.weixin.qq.com/cgi-bin/'
|
20
21
|
|
21
|
-
def initialize(appid, secret, token_file, agentid, skip_verify_ssl, jsapi_ticket_file)
|
22
|
-
@client = Client.new(API_BASE, skip_verify_ssl)
|
22
|
+
def initialize(appid, secret, token_file, agentid, timeout, skip_verify_ssl, jsapi_ticket_file)
|
23
|
+
@client = Client.new(API_BASE, timeout, skip_verify_ssl)
|
23
24
|
@access_token = CorpAccessToken.new(@client, appid, secret, token_file)
|
24
25
|
@agentid = agentid
|
25
26
|
@jsapi_ticket = CorpJsapiTicket.new(@client, @access_token, jsapi_ticket_file)
|
@@ -37,6 +38,15 @@ module Wechat
|
|
37
38
|
get 'user/get', params: { userid: userid }
|
38
39
|
end
|
39
40
|
|
41
|
+
def getuserinfo(code)
|
42
|
+
get 'user/getuserinfo', params: { code: code }
|
43
|
+
end
|
44
|
+
|
45
|
+
def oauth2_url(redirect_uri, appid)
|
46
|
+
redirect_uri = CGI.escape(redirect_uri)
|
47
|
+
"https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{appid}&redirect_uri=#{redirect_uri}&response_type=code&scope=snsapi_base#wechat_redirect"
|
48
|
+
end
|
49
|
+
|
40
50
|
def convert_to_openid(userid)
|
41
51
|
post 'user/convert_to_openid', JSON.generate(userid: userid, agentid: agentid)
|
42
52
|
end
|
data/lib/wechat/responder.rb
CHANGED
@@ -12,7 +12,7 @@ module Wechat
|
|
12
12
|
end
|
13
13
|
|
14
14
|
module ClassMethods
|
15
|
-
attr_accessor :wechat, :token, :corpid, :agentid, :encrypt_mode, :skip_verify_ssl, :encoding_aes_key
|
15
|
+
attr_accessor :wechat, :token, :corpid, :agentid, :encrypt_mode, :timeout, :skip_verify_ssl, :encoding_aes_key
|
16
16
|
|
17
17
|
def on(message_type, with: nil, respond: nil, &block)
|
18
18
|
fail 'Unknow message type' unless [:text, :image, :voice, :video, :link, :event, :click, :view, :scan, :batch_job, :location, :fallback].include?(message_type)
|
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.6.
|
4
|
+
version: 0.6.7
|
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: 2015-12-
|
12
|
+
date: 2015-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|