wechat 0.7.3 → 0.7.4

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
  SHA1:
3
- metadata.gz: f60b7afc101f3badd6661236b6df3747d24995ce
4
- data.tar.gz: b1c7ef968ef8db8c843a4edf35a48a169b647bd7
3
+ metadata.gz: 6fb8761bd99cd1efecca27649bf0b95a0bb24bc1
4
+ data.tar.gz: 036cf5d32c2a355dbf81f0eb505b646e3397ec51
5
5
  SHA512:
6
- metadata.gz: 3324275a6604f4cac101bd11ade6d4c405380432169febf634fb13b4d4fbbe5c548ce48d9f2faad1840e11272fda3699376cb3e944b4937750b057ed0b0df2ac
7
- data.tar.gz: 14606aa8ff517eb6f1249e35cf7abb64862613cdb4ab748ae9f5baee805a3bb07e53c0bc55cd02c721c54ccbb3d7456223284dbcd261814b0533079704d6a677
6
+ metadata.gz: bf28762a242a5c33f8fcabe556464a6d50cd567d3a90fc5ff9475fac7d91e957226f93c9b759a088b20e862cd03854648f617d430df07a5b49626b6eec3f0967
7
+ data.tar.gz: 526982f68c795107123939e94dfb05201274666ddf5e2b574161b9e5034155c84eaaa0fad85df0013f8fbd12998fdde9c760f099cfe432cea08e660a137d4da4
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.7.4 (released at 1/23/2016)
4
+
5
+ * Add Redis store token/ticket support, close #76, #60
6
+ * Rails 5 support without deprecate warning or other not necessory call. #82
7
+
3
8
  ## v0.7.3 (released at 1/19/2016)
4
9
 
5
10
  * Allow transfer_customer_service to specific account.
@@ -55,6 +55,13 @@ rake db:migrate
55
55
 
56
56
  运行后会自动启用回调消息会话(session)记录,wechat gem会在Rails项目中生成两个文件,用户可以在*wechat_session*表中添加更多字段或者声明一些关联关系。使用已有的**hash_store**直接保存也是可以的,但对于PostgreSQL用户,使用[hstore](http://guides.rubyonrails.org/active_record_postgresql.html#hstore)或者json格式可能更佳,当然,最佳方案仍然是添加新字段记录数据。
57
57
 
58
+ 启用Redis存贮token和ticket:
59
+
60
+ ```console
61
+ rails g wechat:redis_store
62
+ ```
63
+
64
+ Redis存贮相比默认的文件存贮,可以允许Rails应用运行在多台服务器中,如果只有一台服务器,仍然推荐使用默认的文件存贮,另外命令行不会读取Redis存贮的Token或者Ticket。
58
65
 
59
66
  ## 配置
60
67
 
data/README.md CHANGED
@@ -61,6 +61,14 @@ rake db:migrate
61
61
 
62
62
  Enable session record will generate two files in Rails folder, User can add more column fields in *wechat_session* table and add declare to link to users table, it's also possible to store data directly in **hash_store**. if you are using PostgreSQL, using [hstore](http://guides.rubyonrails.org/active_record_postgresql.html#hstore)/json maybe better, but the best way is still add dedicate column to record the data, the Rails way.
63
63
 
64
+ Using Redis to store wechat token and ticket:
65
+
66
+ ```console
67
+ rails g wechat:redis_store
68
+ ```
69
+
70
+ Redis store support Rails application running in multi-server, no need to enable it if your Rails application running in one server only, the wechat command won't read the token/ticket store in Redis.
71
+
64
72
  ## Configuration
65
73
 
66
74
  #### Configure for command line
@@ -0,0 +1,16 @@
1
+ module Wechat
2
+ module Generators
3
+ class RedisStoreGenerator < Rails::Generators::Base
4
+ desc 'Using redis as token/ticket store'
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ def copy_wechat_redis_initializer
8
+ template 'config/initializers/wechat_redis_store.rb'
9
+ end
10
+
11
+ def add_redis_gem
12
+ gem 'redis'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,30 @@
1
+ module Wechat
2
+ def self.redis
3
+ # You can reuse existing redis connection and remove this method if require
4
+ @redis ||= Redis.new # more options see https://github.com/redis/redis-rb#getting-started
5
+ end
6
+
7
+ module Token
8
+ class AccessTokenBase
9
+ def read_token
10
+ JSON.parse(Wechat.redis.get('my_app_wechat_token'))
11
+ end
12
+
13
+ def write_token(token_hash)
14
+ Wechat.redis.set 'my_app_wechat_token', token_hash.to_json
15
+ end
16
+ end
17
+ end
18
+
19
+ module Ticket
20
+ class JsapiBase
21
+ def read_ticket
22
+ JSON.parse(Wechat.redis.get('my_app_wechat_ticket'))
23
+ end
24
+
25
+ def write_ticket(ticket_hash)
26
+ Wechat.redis.set 'my_app_wechat_ticket', ticket_hash.to_json
27
+ end
28
+ end
29
+ end
30
+ end
@@ -10,7 +10,7 @@ module Wechat
10
10
  # Rails 5 remove before_filter and skip_before_filter
11
11
  if respond_to?(:skip_before_action)
12
12
  # Rails 5 API mode won't define verify_authenticity_token
13
- skip_before_action :verify_authenticity_token unless defined?(:verify_authenticity_token)
13
+ skip_before_action :verify_authenticity_token if respond_to?(:verify_authenticity_token)
14
14
  before_action :verify_signature, only: [:show, :create]
15
15
  else
16
16
  skip_before_filter :verify_authenticity_token
@@ -209,8 +209,14 @@ module Wechat
209
209
  data = Hash.from_xml(content)
210
210
  end
211
211
 
212
- HashWithIndifferentAccess.new_from_hash_copying_default(data.fetch('xml', {})).tap do |msg|
213
- msg[:Event].downcase! if msg[:Event]
212
+ if Rails::VERSION::MAJOR >= 5
213
+ HashWithIndifferentAccess.new(data.fetch('xml', {})).tap do |msg|
214
+ msg[:Event].downcase! if msg[:Event]
215
+ end
216
+ else
217
+ HashWithIndifferentAccess.new_from_hash_copying_default(data.fetch('xml', {})).tap do |msg|
218
+ msg[:Event].downcase! if msg[:Event]
219
+ end
214
220
  end
215
221
  end
216
222
 
@@ -5,8 +5,8 @@ module Wechat
5
5
  class CorpJsapiTicket < JsapiBase
6
6
  def refresh
7
7
  data = client.get('get_jsapi_ticket', params: { access_token: access_token.token })
8
- write_ticket_to_file(data)
9
- read_ticket_from_file
8
+ write_ticket_to_store(data)
9
+ read_ticket_from_store
10
10
  end
11
11
  end
12
12
  end
@@ -14,7 +14,7 @@ module Wechat
14
14
 
15
15
  def ticket
16
16
  # Possible two worker running, one worker refresh ticket, other unaware, so must read every time
17
- read_ticket_from_file
17
+ read_ticket_from_store
18
18
  refresh if remain_life_seconds < @random_generator.rand(30..3 * 60)
19
19
  access_ticket
20
20
  end
@@ -43,17 +43,26 @@ module Wechat
43
43
 
44
44
  protected
45
45
 
46
- def read_ticket_from_file
47
- td = JSON.parse(File.read(jsapi_ticket_file))
46
+ def read_ticket_from_store
47
+ td = read_ticket
48
+ @ticket_life_in_seconds = td.fetch('ticket_expires_in').to_i
48
49
  @got_ticket_at = td.fetch('got_ticket_at').to_i
49
- @ticket_life_in_seconds = td.fetch('expires_in').to_i
50
- @access_ticket = td.fetch('ticket')
51
- rescue JSON::ParserError, Errno::ENOENT, KeyError
50
+ @access_ticket = td.fetch('ticket') # return access_ticket same time
51
+ rescue JSON::ParserError, Errno::ENOENT, KeyError, TypeError
52
52
  refresh
53
53
  end
54
54
 
55
- def write_ticket_to_file(ticket_hash)
56
- ticket_hash.merge!('got_ticket_at'.freeze => Time.now.to_i)
55
+ def write_ticket_to_store(ticket_hash)
56
+ ticket_hash['got_ticket_at'.freeze] = Time.now.to_i
57
+ ticket_hash['ticket_expires_in'.freeze] = ticket_hash.delete('expires_in')
58
+ write_ticket(ticket_hash)
59
+ end
60
+
61
+ def read_ticket
62
+ JSON.parse(File.read(jsapi_ticket_file))
63
+ end
64
+
65
+ def write_ticket(ticket_hash)
57
66
  File.write(jsapi_ticket_file, ticket_hash.to_json)
58
67
  end
59
68
 
@@ -5,8 +5,8 @@ module Wechat
5
5
  class PublicJsapiTicket < JsapiBase
6
6
  def refresh
7
7
  data = client.get('ticket/getticket', params: { access_token: access_token.token, type: 'jsapi' })
8
- write_ticket_to_file(data)
9
- read_ticket_from_file
8
+ write_ticket_to_store(data)
9
+ read_ticket_from_store
10
10
  end
11
11
  end
12
12
  end
@@ -13,24 +13,33 @@ module Wechat
13
13
 
14
14
  def token
15
15
  # Possible two worker running, one worker refresh token, other unaware, so must read every time
16
- read_token_from_file
16
+ read_token_from_store
17
17
  refresh if remain_life_seconds < @random_generator.rand(30..3 * 60)
18
18
  access_token
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def read_token_from_file
24
- td = JSON.parse(File.read(token_file))
23
+ def read_token_from_store
24
+ td = read_token
25
+ @token_life_in_seconds = td.fetch('token_expires_in').to_i
25
26
  @got_token_at = td.fetch('got_token_at').to_i
26
- @token_life_in_seconds = td.fetch('expires_in').to_i
27
- @access_token = td.fetch('access_token')
28
- rescue JSON::ParserError, Errno::ENOENT, KeyError
27
+ @access_token = td.fetch('access_token') # return access_token same time
28
+ rescue JSON::ParserError, Errno::ENOENT, KeyError, TypeError
29
29
  refresh
30
30
  end
31
31
 
32
- def write_token_to_file(token_hash)
33
- token_hash.merge!('got_token_at'.freeze => Time.now.to_i)
32
+ def write_token_to_store(token_hash)
33
+ token_hash['got_token_at'.freeze] = Time.now.to_i
34
+ token_hash['token_expires_in'.freeze] = token_hash.delete('expires_in')
35
+ write_token(token_hash)
36
+ end
37
+
38
+ def read_token
39
+ JSON.parse(File.read(token_file))
40
+ end
41
+
42
+ def write_token(token_hash)
34
43
  File.write(token_file, token_hash.to_json)
35
44
  end
36
45
 
@@ -5,8 +5,8 @@ module Wechat
5
5
  class CorpAccessToken < AccessTokenBase
6
6
  def refresh
7
7
  data = client.get('gettoken', params: { corpid: appid, corpsecret: secret })
8
- write_token_to_file(data)
9
- read_token_from_file
8
+ write_token_to_store(data)
9
+ read_token_from_store
10
10
  end
11
11
  end
12
12
  end
@@ -5,8 +5,8 @@ module Wechat
5
5
  class PublicAccessToken < AccessTokenBase
6
6
  def refresh
7
7
  data = client.get('token', params: { grant_type: 'client_credential', appid: appid, secret: secret })
8
- write_token_to_file(data)
9
- read_token_from_file
8
+ write_token_to_store(data)
9
+ read_token_from_store
10
10
  end
11
11
  end
12
12
  end
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.3
4
+ version: 0.7.4
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-19 00:00:00.000000000 Z
12
+ date: 2016-01-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -136,9 +136,11 @@ files:
136
136
  - bin/wechat
137
137
  - lib/action_controller/wechat_responder.rb
138
138
  - lib/generators/wechat/install_generator.rb
139
+ - lib/generators/wechat/redis_store_generator.rb
139
140
  - lib/generators/wechat/session_generator.rb
140
141
  - lib/generators/wechat/templates/app/controllers/wechats_controller.rb
141
142
  - lib/generators/wechat/templates/app/models/wechat_session.rb
143
+ - lib/generators/wechat/templates/config/initializers/wechat_redis_store.rb
142
144
  - lib/generators/wechat/templates/config/wechat.yml
143
145
  - lib/generators/wechat/templates/db/migration.rb
144
146
  - lib/wechat.rb