weixin_authorize 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/lib/weixin_authorize/api/custom.rb +9 -10
- data/lib/weixin_authorize/api/groups.rb +11 -11
- data/lib/weixin_authorize/api/menu.rb +7 -7
- data/lib/weixin_authorize/api/user.rb +7 -7
- data/lib/weixin_authorize/client.rb +41 -11
- data/lib/weixin_authorize/version.rb +1 -1
- data/spec/{fetch_access_token_spec.rb → 1_fetch_access_token_spec.rb} +0 -0
- data/spec/api/groups_spec.rb +6 -1
- data/spec/api/menu_spec.rb +2 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df74fa58c1890b6aa3ac5d5684b3542d368d521a
|
4
|
+
data.tar.gz: c296a7894161afd1bdda7240945da3529e1982cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba04e33192c97ce67831fe80dce94c472405aaaa670e0e70ee946dbd086a533ece2f202e852919d1c96d5233a6c31bfd0632025883a9bb57b81c1b29d695df33
|
7
|
+
data.tar.gz: b6c34f7484b0839220ea0353b63749796e5950bf9eb5455d1fbecc7399f83803e5af5dc51e46f7deb7adf19826024b913fa653730b11e2b9a55e858829bfb102
|
data/README.md
CHANGED
@@ -104,6 +104,10 @@ $client ||= WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"])
|
|
104
104
|
|
105
105
|
`$client.send_news_custom(to_user, *articles)`
|
106
106
|
|
107
|
+
##
|
108
|
+
|
109
|
+
> 对于多用户微信营销平台的对接,需要把每次的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`来获取.
|
110
|
+
|
107
111
|
## Contributing
|
108
112
|
|
109
113
|
1. Fork it
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
module WeixinAuthorize
|
4
3
|
module Api
|
5
4
|
module Custom
|
@@ -15,7 +14,7 @@ module WeixinAuthorize
|
|
15
14
|
# }
|
16
15
|
def send_text_custom(to_user, content)
|
17
16
|
message = default_options(to_user).merge({text: {content: content}})
|
18
|
-
|
17
|
+
http_post(custom_base_url, MultiJson.dump(message))
|
19
18
|
end
|
20
19
|
|
21
20
|
# 发送图片消息
|
@@ -29,7 +28,7 @@ module WeixinAuthorize
|
|
29
28
|
# }
|
30
29
|
def send_image_custom(to_user, media_id)
|
31
30
|
message = default_options(to_user).merge({msgtype: image, image: {media_id: media_id}})
|
32
|
-
|
31
|
+
http_post(custom_base_url, MultiJson.dump(message))
|
33
32
|
end
|
34
33
|
|
35
34
|
# 发送语音消息
|
@@ -43,7 +42,7 @@ module WeixinAuthorize
|
|
43
42
|
# }
|
44
43
|
def send_voice_custom(to_user, media_id)
|
45
44
|
message = default_options(to_user).merge({msgtype: voice, voice: {media_id: media_id}})
|
46
|
-
|
45
|
+
http_post(custom_base_url, MultiJson.dump(message))
|
47
46
|
end
|
48
47
|
|
49
48
|
# 发送视频消息
|
@@ -55,10 +54,10 @@ module WeixinAuthorize
|
|
55
54
|
# "media_id":"MEDIA_ID"
|
56
55
|
# }
|
57
56
|
# }
|
58
|
-
def send_video_custom(to_user, media_id, options)
|
57
|
+
def send_video_custom(to_user, media_id, options={})
|
59
58
|
video_options = {media_id: media_id}.merge(options)
|
60
59
|
message = default_options(to_user).merge({msgtype: video, video: video_options})
|
61
|
-
|
60
|
+
http_post(custom_base_url, MultiJson.dump(message))
|
62
61
|
end
|
63
62
|
|
64
63
|
# 发送音乐消息
|
@@ -74,11 +73,11 @@ module WeixinAuthorize
|
|
74
73
|
# "thumb_media_id":"THUMB_MEDIA_ID"
|
75
74
|
# }
|
76
75
|
# }
|
77
|
-
def send_music_custom(to_user, media_id, musicurl, hqmusicurl, options)
|
76
|
+
def send_music_custom(to_user, media_id, musicurl, hqmusicurl, options={})
|
78
77
|
music_options = { thumb_media_id: media_id, musicurl: musicurl,
|
79
78
|
hqmusicurl: hqmusicurl}.merge(options)
|
80
79
|
message = default_options(to_user).merge({msgtype: music, music: music_options})
|
81
|
-
|
80
|
+
http_post(custom_base_url, MultiJson.dump(message))
|
82
81
|
end
|
83
82
|
|
84
83
|
# 发送图文消息
|
@@ -104,14 +103,14 @@ module WeixinAuthorize
|
|
104
103
|
# }
|
105
104
|
def send_news_custom(to_user, *articles)
|
106
105
|
message = default_options(to_user).merge({msgtype: "news", news: {articles: articles}})
|
107
|
-
|
106
|
+
http_post(custom_base_url, MultiJson.dump(message))
|
108
107
|
end
|
109
108
|
|
110
109
|
private
|
111
110
|
|
112
111
|
# https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
113
112
|
def custom_base_url
|
114
|
-
"
|
113
|
+
"/message/custom/send"
|
115
114
|
end
|
116
115
|
|
117
116
|
def default_options(to_user)
|
@@ -6,46 +6,46 @@ module WeixinAuthorize
|
|
6
6
|
# 创建分组
|
7
7
|
# https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN
|
8
8
|
def create_group(group_name)
|
9
|
-
create_url = "#{group_base_url}/create
|
9
|
+
create_url = "#{group_base_url}/create"
|
10
10
|
group = MultiJson.dump({group: {name: group_name}})
|
11
|
-
|
11
|
+
http_post(create_url, group)
|
12
12
|
end
|
13
13
|
|
14
14
|
# 查询所有分组
|
15
15
|
# https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN
|
16
16
|
def groups
|
17
|
-
groups_url = "#{group_base_url}/get
|
18
|
-
|
17
|
+
groups_url = "#{group_base_url}/get"
|
18
|
+
http_get(groups_url)
|
19
19
|
end
|
20
20
|
|
21
21
|
# 查询用户所在分组
|
22
22
|
# https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=ACCESS_TOKEN
|
23
23
|
def get_group_for(openid)
|
24
|
-
group_url = "#{group_base_url}/getid
|
24
|
+
group_url = "#{group_base_url}/getid"
|
25
25
|
openid = MultiJson.dump({openid: openid})
|
26
|
-
|
26
|
+
http_post(group_url, openid)
|
27
27
|
end
|
28
28
|
|
29
29
|
# 修改分组名
|
30
30
|
# https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN
|
31
31
|
def update_group_name(group_id, new_group_name)
|
32
|
-
group_url = "#{group_base_url}/update
|
32
|
+
group_url = "#{group_base_url}/update"
|
33
33
|
group = MultiJson.dump({group: {id: openid, name: new_group_name}})
|
34
|
-
|
34
|
+
http_post(group_url, group)
|
35
35
|
end
|
36
36
|
|
37
37
|
# 移动用户分组
|
38
38
|
# https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=ACCESS_TOKEN
|
39
39
|
def update_group_for_openid(openid, to_groupid)
|
40
|
-
group_url = "#{group_base_url}/members/update
|
40
|
+
group_url = "#{group_base_url}/members/update"
|
41
41
|
group = MultiJson.dump({openid: openid, to_groupid: to_groupid})
|
42
|
-
|
42
|
+
http_post(group_url, group)
|
43
43
|
end
|
44
44
|
|
45
45
|
private
|
46
46
|
|
47
47
|
def group_base_url
|
48
|
-
"
|
48
|
+
"/groups"
|
49
49
|
end
|
50
50
|
|
51
51
|
end
|
@@ -6,28 +6,28 @@ module WeixinAuthorize
|
|
6
6
|
# 自定义菜单查询接口
|
7
7
|
# https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
|
8
8
|
def menu
|
9
|
-
get_menu_url = "#{menu_base_url}/get
|
10
|
-
|
9
|
+
get_menu_url = "#{menu_base_url}/get"
|
10
|
+
http_get(get_menu_url)
|
11
11
|
end
|
12
12
|
|
13
13
|
# 自定义菜单删除接口
|
14
14
|
# https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
|
15
15
|
def delete_menu
|
16
|
-
delete_menu_url = "#{menu_base_url}/delete
|
17
|
-
|
16
|
+
delete_menu_url = "#{menu_base_url}/delete"
|
17
|
+
http_get(delete_menu_url)
|
18
18
|
end
|
19
19
|
|
20
20
|
# 自定义菜单创建接口
|
21
21
|
# https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
|
22
22
|
def create_menu(menu)
|
23
|
-
create_menu_url = "#{menu_base_url}/create
|
24
|
-
|
23
|
+
create_menu_url = "#{menu_base_url}/create"
|
24
|
+
http_post(create_menu_url, menu)
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def menu_base_url
|
30
|
-
"
|
30
|
+
"/menu"
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
@@ -7,21 +7,21 @@ module WeixinAuthorize
|
|
7
7
|
# https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
|
8
8
|
# lang: zh_CN, zh_TW, en
|
9
9
|
def user(openid, lang="zh_CN")
|
10
|
-
user_info_url = "#{user_base_url}/info
|
11
|
-
|
10
|
+
user_info_url = "#{user_base_url}/info"
|
11
|
+
http_get(user_info_url, {openid: openid, lang: lang})
|
12
12
|
end
|
13
13
|
|
14
|
-
# https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
|
15
14
|
# 获取关注者列表
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
# https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
|
16
|
+
def followers(next_openid="")
|
17
|
+
followers_url = "#{user_base_url}/get"
|
18
|
+
http_get(followers_url, {next_openid: next_openid})
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def user_base_url
|
24
|
-
"
|
24
|
+
"/user"
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
module WeixinAuthorize
|
4
3
|
|
5
4
|
class Client
|
@@ -11,41 +10,72 @@ module WeixinAuthorize
|
|
11
10
|
attr_accessor :app_id, :app_secret, :expired_at # Time.now + expires_in
|
12
11
|
attr_accessor :access_token
|
13
12
|
|
14
|
-
|
13
|
+
# 对于多用户微信营销平台的对接,需要把每次的expired_at, access_token保存在Redis中
|
14
|
+
# 每次使用,则可以从Redis中获取expired_at和access_token,即
|
15
|
+
# @client = WeixinAuthorize::Client.new(appid, appsecret, expired_at, access_token)
|
16
|
+
# 获取access_token,则仍然是:@client.get_access_token 来获取
|
17
|
+
def initialize(app_id="", app_secret="", expired_at=nil, access_token=nil)
|
15
18
|
@app_id = app_id
|
16
19
|
@app_secret = app_secret
|
17
20
|
@expired_at = (expired_at.to_i || Time.now.to_i)
|
21
|
+
@access_token = access_token
|
18
22
|
yield self if block_given?
|
19
23
|
end
|
20
24
|
|
21
25
|
# return token
|
22
26
|
def get_access_token
|
23
27
|
# 如果当前token过期时间小于现在的时间,则重新获取一次
|
24
|
-
if
|
25
|
-
authenticate
|
26
|
-
end
|
28
|
+
authenticate if token_expired?
|
27
29
|
@access_token
|
28
30
|
end
|
29
31
|
|
30
32
|
# authenticate access_token
|
31
33
|
def authenticate
|
32
|
-
hash_infos =
|
34
|
+
hash_infos = http_get_without_token("/token", authenticate_options)
|
33
35
|
self.access_token = hash_infos["access_token"]
|
34
36
|
self.expired_at = Time.now.to_i + hash_infos["expires_in"]
|
35
37
|
end
|
36
38
|
|
39
|
+
def token_expired?
|
40
|
+
@expired_at <= Time.now.to_i
|
41
|
+
end
|
42
|
+
|
37
43
|
private
|
38
44
|
|
39
|
-
def
|
40
|
-
|
45
|
+
def authenticate_options
|
46
|
+
{grant_type: "client_credential", appid: app_id, secret: app_secret}
|
47
|
+
end
|
48
|
+
|
49
|
+
def access_token_param
|
50
|
+
{access_token: get_access_token}
|
51
|
+
end
|
52
|
+
|
53
|
+
def http_get_without_token(url, options={}, endpoint="plain")
|
54
|
+
get_api_url = endpoint_url(endpoint) + url
|
55
|
+
JSON.parse(RestClient.get(get_api_url, :params => options))
|
56
|
+
end
|
57
|
+
|
58
|
+
def http_get(url, options={})
|
59
|
+
options = options.merge(access_token_param)
|
60
|
+
http_get_without_token(url, options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Refactor
|
64
|
+
def http_post(url, options={}, endpoint="plain")
|
65
|
+
post_api_url = endpoint_url(endpoint) + url + "?access_token=#{get_access_token}"
|
66
|
+
JSON.parse(RestClient.post(post_api_url ,options))
|
67
|
+
end
|
68
|
+
|
69
|
+
def endpoint_url(endpoint)
|
70
|
+
send("#{endpoint}_endpoint")
|
41
71
|
end
|
42
72
|
|
43
|
-
def
|
73
|
+
def plain_endpoint
|
44
74
|
"https://api.weixin.qq.com/cgi-bin"
|
45
75
|
end
|
46
76
|
|
47
|
-
def
|
48
|
-
"
|
77
|
+
def file_endpoint
|
78
|
+
"http://file.api.weixin.qq.com/cgi-bin"
|
49
79
|
end
|
50
80
|
|
51
81
|
end
|
File without changes
|
data/spec/api/groups_spec.rb
CHANGED
data/spec/api/menu_spec.rb
CHANGED
@@ -6,7 +6,9 @@ describe WeixinAuthorize::Api::Menu do
|
|
6
6
|
it "can create a menu" do
|
7
7
|
menu = '{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC"},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER"},{"name":"菜单","sub_button":[{"type":"view","name":"搜索","url":"http://www.soso.com/"},{"type":"view","name":"视频","url":"http://v.qq.com/"},{"type":"click","name":"赞一下我们","key":"V1001_GOOD"}]}]}'
|
8
8
|
response = $client.create_menu(menu)
|
9
|
+
puts response
|
9
10
|
expect(response["errcode"]).to eq(0)
|
11
|
+
|
10
12
|
end
|
11
13
|
|
12
14
|
it "can get a weixin Menu info" do
|
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.0.
|
4
|
+
version: 1.0.1
|
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-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -100,11 +100,11 @@ files:
|
|
100
100
|
- lib/weixin_authorize/api/user.rb
|
101
101
|
- lib/weixin_authorize/client.rb
|
102
102
|
- lib/weixin_authorize/version.rb
|
103
|
+
- spec/1_fetch_access_token_spec.rb
|
103
104
|
- spec/api/custom_spec.rb
|
104
105
|
- spec/api/groups_spec.rb
|
105
106
|
- spec/api/menu_spec.rb
|
106
107
|
- spec/api/user_spec.rb
|
107
|
-
- spec/fetch_access_token_spec.rb
|
108
108
|
- spec/spec_helper.rb
|
109
109
|
- weixin_authorize.gemspec
|
110
110
|
homepage: ''
|
@@ -132,9 +132,9 @@ signing_key:
|
|
132
132
|
specification_version: 4
|
133
133
|
summary: weixin api authorize access_token
|
134
134
|
test_files:
|
135
|
+
- spec/1_fetch_access_token_spec.rb
|
135
136
|
- spec/api/custom_spec.rb
|
136
137
|
- spec/api/groups_spec.rb
|
137
138
|
- spec/api/menu_spec.rb
|
138
139
|
- spec/api/user_spec.rb
|
139
|
-
- spec/fetch_access_token_spec.rb
|
140
140
|
- spec/spec_helper.rb
|