weixin_authorize 1.1.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +44 -11
- data/lib/weixin_authorize/client.rb +50 -13
- data/lib/weixin_authorize/config.rb +15 -0
- data/lib/weixin_authorize/version.rb +1 -1
- data/lib/weixin_authorize.rb +1 -12
- data/spec/spec_helper.rb +8 -5
- data/weixin_authorize.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 194d7f3905340f75447ec9401d845af02eedf8a8
|
4
|
+
data.tar.gz: 448c9b7656d7100801514abf18f5213456f28b01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa2e813b5c406da0bf28e9987db44318ab369fc41401b3e12158cdce540f04d8e827f5cf777123a40a3c6a6ab246749aa6143c55e859f1ba2dee8d4c51665737
|
7
|
+
data.tar.gz: e7eac68aec0577c93f10dd5e1634d9a58d5bca61d667c6fcfbbe5dd50975e5d7e6aa5b15d3085ec42bcb1ba122da9d13327c701196d230f3a6b10c71b99d78ea
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# WeixinAuthorize
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/weixin_authorize.png)](http://badge.fury.io/rb/weixin_authorize)
|
4
|
+
|
5
|
+
Support using [Redis](http://redis.io) to store `access_token`
|
6
|
+
|
3
7
|
## Installation
|
4
8
|
|
5
9
|
Add this line to your application's Gemfile:
|
@@ -24,18 +28,51 @@ Or install it yourself as:
|
|
24
28
|
|
25
29
|
```ruby
|
26
30
|
|
27
|
-
$client ||= WeixinAuthorize.
|
28
|
-
|
29
|
-
config.app_secret = ENV["APPSECRET"]
|
30
|
-
config.expired_at = Time.now.to_i
|
31
|
-
end
|
31
|
+
$client ||= WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"])
|
32
|
+
```
|
32
33
|
|
33
|
-
|
34
|
+
### Option: use [Redis](http://redis.io) to store your access_token (Recommend)
|
34
35
|
|
35
|
-
|
36
|
+
**If you don't use Redis, it will send a request to get a new access_token everytime!**
|
37
|
+
|
38
|
+
* Added `redis-namespace` to you `Gemfile`
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
# Adds a Redis::Namespace class which can be used to namespace calls to Redis. This is useful when using a single instance of Redis with multiple, different applications.
|
42
|
+
# http://github.com/resque/redis-namespace
|
43
|
+
gem "redis-namespace", "~> 1.4.1"
|
44
|
+
|
45
|
+
```
|
46
|
+
|
47
|
+
* Create file in: `config/initializers/weixin_authorize.rb`
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
|
51
|
+
# don't forget change namespace
|
52
|
+
namespace = "app_name_weixin:weixin_authorize"
|
53
|
+
redis = Redis.new(:host => "127.0.0.1", :port => "6379", :db => 15)
|
54
|
+
|
55
|
+
# cleanup keys in the current namespace when restart server everytime.
|
56
|
+
exist_keys = redis.keys("#{namespace}:*")
|
57
|
+
exist_keys.each{|key|redis.del(key)}
|
58
|
+
|
59
|
+
# Give a special namespace as prefix for Redis key, when your have more than one project used weixin_authorize, this config will make them work fine.
|
60
|
+
redis = Redis::Namespace.new("#{namespace}", :redis => redis)
|
61
|
+
|
62
|
+
WeixinAuthorize.configure do |config|
|
63
|
+
config.redis = redis
|
64
|
+
end
|
36
65
|
|
37
66
|
```
|
38
67
|
|
68
|
+
* You can also specify the `key`, but it is optionly.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
|
72
|
+
$client ||= WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"], "your_store_key")
|
73
|
+
```
|
74
|
+
**Note:** `your_store_key` should be unique for every account!
|
75
|
+
|
39
76
|
### 获取用户管理信息
|
40
77
|
|
41
78
|
* [获取用户基本信息](http://mp.weixin.qq.com/wiki/index.php?title=获取用户基本信息)
|
@@ -46,7 +83,6 @@ $client ||= WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"])
|
|
46
83
|
|
47
84
|
`followers = $client.followers`
|
48
85
|
|
49
|
-
|
50
86
|
### [分组管理接口](http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口)
|
51
87
|
|
52
88
|
* 创建分组:
|
@@ -119,9 +155,6 @@ export OPENID="your weixin openid"
|
|
119
155
|
```
|
120
156
|
Last, you have to **open a new terminal tag (Reload bash_profile)** , and run `rspec .`
|
121
157
|
|
122
|
-
## 多用户微信营销平台的对接
|
123
|
-
|
124
|
-
> 对于多用户微信营销平台的对接,需要把每次的expired_at, access_token保存在Redis中,每次使用,则可以从Redis中获取expired_at和access_token, 即 `@client = WeixinAuthorize::Client.new(appid, appsecret, expired_at, access_token)`, 获取access_token,则仍然是:`@client.get_access_token`来获取.
|
125
158
|
|
126
159
|
## Contributing
|
127
160
|
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "redis"
|
3
|
+
require 'digest'
|
2
4
|
module WeixinAuthorize
|
3
5
|
|
4
6
|
class Client
|
@@ -8,40 +10,62 @@ module WeixinAuthorize
|
|
8
10
|
include Api::Groups
|
9
11
|
|
10
12
|
attr_accessor :app_id, :app_secret, :expired_at # Time.now + expires_in
|
11
|
-
attr_accessor :access_token
|
13
|
+
attr_accessor :access_token, :redis_key
|
12
14
|
|
13
15
|
# 对于多用户微信营销平台的对接,需要把每次的expired_at, access_token保存在Redis中
|
14
16
|
# 每次使用,则可以从Redis中获取expired_at和access_token,即
|
15
|
-
# @client = WeixinAuthorize::Client.new(appid, appsecret
|
17
|
+
# @client = WeixinAuthorize::Client.new(appid, appsecret)
|
18
|
+
# 如果使用存在多个公众账号,请使用 务必传递: redis_key
|
16
19
|
# 获取access_token,则仍然是:@client.get_access_token 来获取
|
17
|
-
def initialize(app_id
|
18
|
-
@app_id
|
19
|
-
@app_secret
|
20
|
-
@expired_at
|
21
|
-
@
|
22
|
-
yield self if block_given?
|
20
|
+
def initialize(app_id, app_secret, redis_key=nil)
|
21
|
+
@app_id = app_id
|
22
|
+
@app_secret = app_secret
|
23
|
+
@expired_at = Time.now.to_i
|
24
|
+
@redis_key = security_redis_key((redis_key || "weixin_" + app_id))
|
23
25
|
end
|
24
26
|
|
25
27
|
# return token
|
26
28
|
def get_access_token
|
27
|
-
# 如果当前token过期时间小于现在的时间,则重新获取一次
|
28
29
|
authenticate if token_expired?
|
30
|
+
if !is_weixin_redis_blank?
|
31
|
+
self.access_token = weixin_redis.hget(redis_key, "access_token")
|
32
|
+
self.expired_at = weixin_redis.hget(redis_key, "expired_at")
|
33
|
+
end
|
29
34
|
@access_token
|
30
35
|
end
|
31
36
|
|
32
37
|
# authenticate access_token
|
33
38
|
def authenticate
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
if is_weixin_redis_blank?
|
40
|
+
http_get_access_token
|
41
|
+
else
|
42
|
+
authenticate_with_redis
|
43
|
+
end
|
37
44
|
end
|
38
45
|
|
39
46
|
def token_expired?
|
40
|
-
|
47
|
+
if is_weixin_redis_blank?
|
48
|
+
# 如果当前token过期时间小于现在的时间,则重新获取一次
|
49
|
+
@expired_at <= Time.now.to_i
|
50
|
+
else
|
51
|
+
weixin_redis.hvals(redis_key).empty?
|
52
|
+
end
|
41
53
|
end
|
42
54
|
|
43
55
|
private
|
44
56
|
|
57
|
+
def authenticate_with_redis
|
58
|
+
http_get_access_token
|
59
|
+
weixin_redis.hmset(redis_key, :access_token, access_token, :expired_at, expired_at)
|
60
|
+
weixin_redis.expireat(redis_key, expired_at.to_i-10) # 提前10秒超时
|
61
|
+
end
|
62
|
+
|
63
|
+
def http_get_access_token
|
64
|
+
hash_infos = http_get_without_token("/token", authenticate_options)
|
65
|
+
self.access_token = hash_infos["access_token"]
|
66
|
+
self.expired_at = Time.now.to_i + hash_infos["expires_in"]
|
67
|
+
end
|
68
|
+
|
45
69
|
def authenticate_options
|
46
70
|
{grant_type: "client_credential", appid: app_id, secret: app_secret}
|
47
71
|
end
|
@@ -79,5 +103,18 @@ module WeixinAuthorize
|
|
79
103
|
"http://file.api.weixin.qq.com/cgi-bin"
|
80
104
|
end
|
81
105
|
|
106
|
+
def weixin_redis
|
107
|
+
return nil if WeixinAuthorize.config.nil?
|
108
|
+
@redis ||= WeixinAuthorize.config.redis
|
109
|
+
end
|
110
|
+
|
111
|
+
def is_weixin_redis_blank?
|
112
|
+
weixin_redis.nil?
|
113
|
+
end
|
114
|
+
|
115
|
+
def security_redis_key(key)
|
116
|
+
Digest::MD5.hexdigest(key.to_s).upcase
|
117
|
+
end
|
118
|
+
|
82
119
|
end
|
83
120
|
end
|
data/lib/weixin_authorize.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "rest-client"
|
2
2
|
require "multi_json"
|
3
|
-
require "weixin_authorize/
|
3
|
+
require "weixin_authorize/config"
|
4
4
|
require "weixin_authorize/api/user"
|
5
5
|
require "weixin_authorize/api/menu"
|
6
6
|
require "weixin_authorize/api/custom"
|
@@ -9,15 +9,4 @@ require "weixin_authorize/client"
|
|
9
9
|
|
10
10
|
module WeixinAuthorize
|
11
11
|
|
12
|
-
# @client ||= WeixinAuthorize.configure do |config|
|
13
|
-
# config.app_id = "app_id-xxxxxxx"
|
14
|
-
# config.app_secret = "app_secret-xxxxxxx"
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
class << self
|
18
|
-
def configure(&block)
|
19
|
-
Client.new(&block)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
12
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -16,14 +16,17 @@
|
|
16
16
|
require "rspec"
|
17
17
|
require "weixin_authorize"
|
18
18
|
require "multi_json"
|
19
|
+
require "redis"
|
20
|
+
require "redis-namespace"
|
19
21
|
|
20
22
|
require "pry-rails"
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
redis = Redis.new(:host => "127.0.0.1",:port => "6379")
|
25
|
+
|
26
|
+
redis_with_ns = Redis::Namespace.new("weixin_#{Time.now.to_i}:weixin_authorize", :redis => redis)
|
27
|
+
WeixinAuthorize.configure do |config|
|
28
|
+
config.redis = redis_with_ns
|
29
|
+
end
|
27
30
|
|
28
31
|
$client = WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"])
|
29
32
|
|
data/weixin_authorize.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency "rest-client", ">= 1.6.7"
|
22
22
|
spec.add_dependency "multi_json", "~> 1.9.0"
|
23
|
+
spec.add_dependency "redis", "~> 3.0.7"
|
23
24
|
|
24
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
26
|
spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weixin_authorize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lanrion
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.9.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: redis
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.7
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.7
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,6 +113,7 @@ files:
|
|
99
113
|
- lib/weixin_authorize/api/menu.rb
|
100
114
|
- lib/weixin_authorize/api/user.rb
|
101
115
|
- lib/weixin_authorize/client.rb
|
116
|
+
- lib/weixin_authorize/config.rb
|
102
117
|
- lib/weixin_authorize/version.rb
|
103
118
|
- spec/1_fetch_access_token_spec.rb
|
104
119
|
- spec/api/custom_spec.rb
|