weixin_authorize_superayi 1.6.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 +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.travis.yml +11 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +72 -0
- data/Rakefile +1 -0
- data/lib/weixin_authorize/api/custom.rb +176 -0
- data/lib/weixin_authorize/api/data_cube.rb +8 -0
- data/lib/weixin_authorize/api/groups.rb +60 -0
- data/lib/weixin_authorize/api/mass.rb +80 -0
- data/lib/weixin_authorize/api/media.rb +149 -0
- data/lib/weixin_authorize/api/menu.rb +36 -0
- data/lib/weixin_authorize/api/oauth.rb +50 -0
- data/lib/weixin_authorize/api/qrcode.rb +53 -0
- data/lib/weixin_authorize/api/template.rb +43 -0
- data/lib/weixin_authorize/api/user.rb +69 -0
- data/lib/weixin_authorize/api.rb +3 -0
- data/lib/weixin_authorize/carrierwave/weixin_uploader.rb +4 -0
- data/lib/weixin_authorize/client.rb +95 -0
- data/lib/weixin_authorize/config.rb +35 -0
- data/lib/weixin_authorize/handler/exceptions.rb +5 -0
- data/lib/weixin_authorize/handler/global_code.rb +127 -0
- data/lib/weixin_authorize/handler/result_handler.rb +52 -0
- data/lib/weixin_authorize/handler.rb +3 -0
- data/lib/weixin_authorize/js_ticket/object_store.rb +21 -0
- data/lib/weixin_authorize/js_ticket/redis_store.rb +41 -0
- data/lib/weixin_authorize/js_ticket/store.rb +40 -0
- data/lib/weixin_authorize/token/object_store.rb +25 -0
- data/lib/weixin_authorize/token/redis_store.rb +38 -0
- data/lib/weixin_authorize/token/store.rb +72 -0
- data/lib/weixin_authorize/version.rb +3 -0
- data/lib/weixin_authorize.rb +97 -0
- data/spec/1_fetch_access_token_spec.rb +43 -0
- data/spec/2_fetch_jsticket_spec.rb +10 -0
- data/spec/api/custom_spec.rb +71 -0
- data/spec/api/groups_spec.rb +74 -0
- data/spec/api/mass_spec.rb +70 -0
- data/spec/api/media_spec.rb +82 -0
- data/spec/api/medias/favicon.ico +0 -0
- data/spec/api/medias/ruby-logo.jpg +0 -0
- data/spec/api/menu_spec.rb +26 -0
- data/spec/api/qrcode_spec.rb +22 -0
- data/spec/api/template_spec.rb +40 -0
- data/spec/api/user_spec.rb +26 -0
- data/spec/spec_helper.rb +130 -0
- data/weixin_authorize_superayi.gemspec +48 -0
- metadata +301 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module WeixinAuthorize
|
3
|
+
module Token
|
4
|
+
class RedisStore < Store
|
5
|
+
|
6
|
+
def valid?
|
7
|
+
weixin_redis.del(client.redis_key)
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def token_expired?
|
12
|
+
weixin_redis.hvals(client.redis_key).empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
def refresh_token
|
16
|
+
super
|
17
|
+
weixin_redis.hmset(
|
18
|
+
client.redis_key, "access_token",
|
19
|
+
client.access_token, "expired_at",
|
20
|
+
client.expired_at
|
21
|
+
)
|
22
|
+
weixin_redis.expireat(client.redis_key, client.expired_at.to_i)
|
23
|
+
end
|
24
|
+
|
25
|
+
def access_token
|
26
|
+
super
|
27
|
+
client.access_token = weixin_redis.hget(client.redis_key, "access_token")
|
28
|
+
client.expired_at = weixin_redis.hget(client.redis_key, "expired_at")
|
29
|
+
client.access_token
|
30
|
+
end
|
31
|
+
|
32
|
+
def weixin_redis
|
33
|
+
WeixinAuthorize.weixin_redis
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module WeixinAuthorize
|
3
|
+
module Token
|
4
|
+
class Store
|
5
|
+
|
6
|
+
attr_accessor :client
|
7
|
+
|
8
|
+
def initialize(client)
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.init_with(client)
|
13
|
+
if WeixinAuthorize.weixin_redis.nil?
|
14
|
+
ObjectStore.new(client)
|
15
|
+
else
|
16
|
+
RedisStore.new(client)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def valid?
|
21
|
+
authenticate["valid"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def authenticate
|
25
|
+
auth_result = http_get_access_token
|
26
|
+
auth = false
|
27
|
+
if auth_result.is_ok?
|
28
|
+
set_access_token(auth_result.result)
|
29
|
+
auth = true
|
30
|
+
end
|
31
|
+
{"valid" => auth, "handler" => auth_result}
|
32
|
+
end
|
33
|
+
|
34
|
+
def refresh_token
|
35
|
+
handle_valid_exception
|
36
|
+
set_access_token
|
37
|
+
end
|
38
|
+
|
39
|
+
def access_token
|
40
|
+
refresh_token if token_expired?
|
41
|
+
end
|
42
|
+
|
43
|
+
def token_expired?
|
44
|
+
raise NotImplementedError, "Subclasses must implement a token_expired? method"
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_access_token(access_token_infos=nil)
|
48
|
+
token_infos = access_token_infos || http_get_access_token.result
|
49
|
+
client.access_token = token_infos["access_token"]
|
50
|
+
client.expired_at = WeixinAuthorize.calculate_expire(token_infos["expires_in"])
|
51
|
+
end
|
52
|
+
|
53
|
+
def http_get_access_token
|
54
|
+
WeixinAuthorize.http_get_without_token("/token", authenticate_headers)
|
55
|
+
end
|
56
|
+
|
57
|
+
def authenticate_headers
|
58
|
+
{grant_type: GRANT_TYPE, appid: client.app_id, secret: client.app_secret}
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def handle_valid_exception
|
64
|
+
auth_result = authenticate
|
65
|
+
if !auth_result["valid"]
|
66
|
+
result_handler = auth_result["handler"]
|
67
|
+
raise ValidAccessTokenException, result_handler.full_error_message
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require "rest-client"
|
2
|
+
require "carrierwave"
|
3
|
+
if defined? Yajl
|
4
|
+
require 'yajl/json_gem'
|
5
|
+
else
|
6
|
+
require "json"
|
7
|
+
end
|
8
|
+
require "erb"
|
9
|
+
|
10
|
+
require "weixin_authorize/carrierwave/weixin_uploader"
|
11
|
+
require "weixin_authorize/config"
|
12
|
+
require "weixin_authorize/handler"
|
13
|
+
require "weixin_authorize/api"
|
14
|
+
require "weixin_authorize/client"
|
15
|
+
|
16
|
+
module WeixinAuthorize
|
17
|
+
|
18
|
+
# token store
|
19
|
+
module Token
|
20
|
+
autoload(:Store, "weixin_authorize/token/store")
|
21
|
+
autoload(:ObjectStore, "weixin_authorize/token/object_store")
|
22
|
+
autoload(:RedisStore, "weixin_authorize/token/redis_store")
|
23
|
+
end
|
24
|
+
|
25
|
+
module JsTicket
|
26
|
+
autoload(:Store, "weixin_authorize/js_ticket/store")
|
27
|
+
autoload(:ObjectStore, "weixin_authorize/js_ticket/object_store")
|
28
|
+
autoload(:RedisStore, "weixin_authorize/js_ticket/redis_store")
|
29
|
+
end
|
30
|
+
|
31
|
+
OK_MSG = "ok".freeze
|
32
|
+
OK_CODE = 0.freeze
|
33
|
+
GRANT_TYPE = "client_credential".freeze
|
34
|
+
# 用于标记endpoint可以直接使用url作为完整请求API
|
35
|
+
CUSTOM_ENDPOINT = "custom_endpoint".freeze
|
36
|
+
|
37
|
+
class << self
|
38
|
+
|
39
|
+
def http_get_without_token(url, url_params={}, endpoint="plain")
|
40
|
+
get_api_url = endpoint_url(endpoint, url)
|
41
|
+
load_json(resource(get_api_url).get(params: url_params))
|
42
|
+
end
|
43
|
+
|
44
|
+
def http_post_without_token(url, post_body={}, url_params={}, endpoint="plain")
|
45
|
+
post_api_url = endpoint_url(endpoint, url)
|
46
|
+
# to json if invoke "plain"
|
47
|
+
if endpoint == "plain" || endpoint == CUSTOM_ENDPOINT
|
48
|
+
post_body = JSON.dump(post_body)
|
49
|
+
end
|
50
|
+
load_json(resource(post_api_url).post(post_body, params: url_params))
|
51
|
+
end
|
52
|
+
|
53
|
+
def resource(url)
|
54
|
+
RestClient::Resource.new(url, rest_client_options)
|
55
|
+
end
|
56
|
+
|
57
|
+
# return hash
|
58
|
+
def load_json(string)
|
59
|
+
result_hash = JSON.parse(string.force_encoding("UTF-8").gsub(/[\u0011-\u001F]/, ""))
|
60
|
+
code = result_hash.delete("errcode")
|
61
|
+
en_msg = result_hash.delete("errmsg")
|
62
|
+
ResultHandler.new(code, en_msg, result_hash)
|
63
|
+
end
|
64
|
+
|
65
|
+
def endpoint_url(endpoint, url)
|
66
|
+
# 此处为了应对第三方开发者如果自助对接接口时,URL不规范的情况下,可以直接使用URL当为endpoint
|
67
|
+
return url if endpoint == CUSTOM_ENDPOINT
|
68
|
+
send("#{endpoint}_endpoint") + url
|
69
|
+
end
|
70
|
+
|
71
|
+
def plain_endpoint
|
72
|
+
"#{api_endpoint}/cgi-bin"
|
73
|
+
end
|
74
|
+
|
75
|
+
def api_endpoint
|
76
|
+
"https://api.weixin.qq.com"
|
77
|
+
end
|
78
|
+
|
79
|
+
def file_endpoint
|
80
|
+
"http://file.api.weixin.qq.com/cgi-bin"
|
81
|
+
end
|
82
|
+
|
83
|
+
def mp_endpoint(url)
|
84
|
+
"https://mp.weixin.qq.com/cgi-bin#{url}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def open_endpoint(url)
|
88
|
+
"https://open.weixin.qq.com#{url}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def calculate_expire(expires_in)
|
92
|
+
Time.now.to_i + expires_in.to_i - key_expired.to_i
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# NOTE: the rspec should be test alonely.
|
2
|
+
describe WeixinAuthorize::Client do
|
3
|
+
describe "#get access_token" do
|
4
|
+
it "return a access_token nil value before authenticate" do
|
5
|
+
expect($client.access_token).to eq(nil)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "appid and appsecret shoud be valid" do
|
9
|
+
valid_info = $client.is_valid?
|
10
|
+
expect(valid_info).to eq(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "return the same access_token in the same thing twice" do
|
14
|
+
access_token_1 = $client.get_access_token
|
15
|
+
sleep 5
|
16
|
+
access_token_2 = $client.get_access_token
|
17
|
+
expect(access_token_1).to eq(access_token_2)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "return errorcode and errormsg when appid or appsecret is invalid" do
|
21
|
+
$client_1 = WeixinAuthorize::Client.new("appid", "app_secret")
|
22
|
+
valid_info = $client_1.is_valid?
|
23
|
+
expect(valid_info).to eq(false)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "#get_access_token should raise error if app_secret or appid is invalid" do
|
27
|
+
$client_2 = WeixinAuthorize::Client.new("appid_2", "app_secret_2")
|
28
|
+
expect{$client_2.get_access_token}.to raise_error(RuntimeError)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "#token_expired return the different access_token after token is expired" do
|
32
|
+
token_1 = $client.get_access_token
|
33
|
+
if WeixinAuthorize.weixin_redis.nil?
|
34
|
+
$client.expired_at = Time.now.to_i - 7300
|
35
|
+
else
|
36
|
+
WeixinAuthorize.weixin_redis.del($client.redis_key)
|
37
|
+
end
|
38
|
+
token_2 = $client.get_access_token
|
39
|
+
expect(token_1).to_not eq(token_2)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
describe WeixinAuthorize::Client do
|
2
|
+
describe "#get jsticket" do
|
3
|
+
it "return the same jsticket in the same thing twice" do
|
4
|
+
js_ticket_1 = $client.get_jsticket
|
5
|
+
sleep 5
|
6
|
+
js_ticket_2 = $client.get_jsticket
|
7
|
+
expect(js_ticket_1).to eq(js_ticket_2)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
describe WeixinAuthorize::Api::Custom do
|
2
|
+
let(:text_message) do
|
3
|
+
"text Custom message"
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:image_path) do
|
7
|
+
"#{File.dirname(__FILE__)}/medias/ruby-logo.jpg"
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:image_file) do
|
11
|
+
File.new(image_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "#send_text_custom" do
|
15
|
+
response = $client.send_text_custom(ENV["OPENID"], text_message)
|
16
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "#send_news_custom" do
|
20
|
+
articles = [{
|
21
|
+
"title" => "Happy Day",
|
22
|
+
"description" => "Is Really A Happy Day",
|
23
|
+
"url" => "http://www.baidu.com",
|
24
|
+
"picurl" => "http://www.baidu.com/img/bdlogo.gif"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"title" => "Happy Day",
|
28
|
+
"description" => "Is Really A Happy Day",
|
29
|
+
"url" => "http://www.baidu.com",
|
30
|
+
"picurl"=> "http://www.baidu.com/img/bdlogo.gif"
|
31
|
+
}]
|
32
|
+
response = $client.send_news_custom(ENV["OPENID"], articles)
|
33
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "#send_image_custom" do
|
37
|
+
image = $client.upload_media(image_file, "image")
|
38
|
+
media_id = image.result["media_id"]
|
39
|
+
response = $client.send_image_custom(ENV["OPENID"], media_id)
|
40
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "#send_video_custom" do
|
44
|
+
pending("The test must have a media_id")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "#send_mpnews_custom" do
|
48
|
+
pending("The test must have a media_id")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "#send_music_custom" do
|
52
|
+
pending("The test must have a media_id")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "#send_voice_custom" do
|
56
|
+
pending("The test must have a media_id")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "#get_custom_msg_record" do
|
60
|
+
option = {pageindex: 1, pagesize: 10}
|
61
|
+
response = $client.get_custom_msg_record(Time.now - 10.days, Time.now, option)
|
62
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
63
|
+
expect(response.result.keys).to eq(["recordlist", "retcode"])
|
64
|
+
end
|
65
|
+
|
66
|
+
it "#create_kf_session" do
|
67
|
+
response = $client.create_kf_session("test1@test", ENV["APPID"], "test kfsession")
|
68
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
describe WeixinAuthorize::Api::Groups do
|
2
|
+
|
3
|
+
let(:group_name) do
|
4
|
+
"test group_name"
|
5
|
+
end
|
6
|
+
|
7
|
+
let(:group_name_2) do
|
8
|
+
"test group_name_2"
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:groups) do
|
12
|
+
$client.groups
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:last_group_id) do
|
16
|
+
groups.result["groups"][-1]["id"]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "#delete all group step by step" do
|
20
|
+
group_ids = groups.result["groups"].collect{|group|group["id"]}
|
21
|
+
group_ids.each do |group_id|
|
22
|
+
res = $client.delete_group(group_id)
|
23
|
+
if res.code.to_s != "45009"
|
24
|
+
expect(res.code).to eq(WeixinAuthorize::OK_CODE)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "create a group" do
|
30
|
+
response = $client.create_group(group_name)
|
31
|
+
if response.code == WeixinAuthorize::OK_CODE
|
32
|
+
expect(response.result["group"]["name"]).to eq(group_name)
|
33
|
+
else
|
34
|
+
expect(response.code).to eq(-1)
|
35
|
+
puts "WEIXIN says: system error"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "get groups" do
|
40
|
+
expect(groups.result["groups"][-1]["name"]).to eq(group_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "#get_group_for ENV['OPENID']" do
|
44
|
+
group = $client.get_group_for(ENV["OPENID"])
|
45
|
+
expect(group.result.keys).to eq(["groupid"])
|
46
|
+
end
|
47
|
+
|
48
|
+
it "#update_group_name" do
|
49
|
+
response = $client.create_group(group_name)
|
50
|
+
if response.code != WeixinAuthorize::OK_CODE
|
51
|
+
expect(response.code).to eq(-1)
|
52
|
+
puts "WEIXIN says: system error"
|
53
|
+
else
|
54
|
+
expect(response.result["group"]["name"]).to eq(group_name)
|
55
|
+
response = $client.update_group_name(response.result["group"]["id"], group_name_2)
|
56
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
57
|
+
groups = $client.groups
|
58
|
+
expect(groups.result["groups"][-1]["name"]).to eq(group_name_2)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "#update_group_for_openid" do
|
63
|
+
$client.update_group_for_openid(ENV["OPENID"], last_group_id)
|
64
|
+
group = $client.get_group_for(ENV["OPENID"])
|
65
|
+
expect(group.result["groupid"]).to eq(last_group_id)
|
66
|
+
$client.update_group_for_openid(ENV["OPENID"], 0)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "#batch update group for openids" do
|
70
|
+
res = $client.batch_update_group_for_openids([ENV["OPENID"]], last_group_id)
|
71
|
+
expect(res.code).to eq(WeixinAuthorize::OK_CODE)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe WeixinAuthorize::Api::Mass do
|
4
|
+
|
5
|
+
let(:image_jpg_path) do
|
6
|
+
"#{File.dirname(__FILE__)}/medias/ruby-logo.jpg"
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:news_media_1) do
|
10
|
+
{
|
11
|
+
"thumb_media_id" => "",
|
12
|
+
"author" => "lanrion",
|
13
|
+
"title" => "Happy Day",
|
14
|
+
"content_source_url" => "www.qq.com",
|
15
|
+
"content" => "content",
|
16
|
+
"digest" => "digest"
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:image_media_id) do
|
21
|
+
# Get image media_id
|
22
|
+
image_media = $client.upload_media(image_jpg_path, "image")
|
23
|
+
media_id = image_media.result["media_id"]
|
24
|
+
media_id
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:mass_media_id) do
|
28
|
+
media = {"thumb_media_id" => image_media_id}
|
29
|
+
news_media = news_media_1.merge(media)
|
30
|
+
|
31
|
+
# upload news media
|
32
|
+
response = $client.upload_mass_news([news_media])
|
33
|
+
mass_media_id = response.result["media_id"]
|
34
|
+
mass_media_id
|
35
|
+
end
|
36
|
+
|
37
|
+
it "#upload_mass_news" do
|
38
|
+
media = {"thumb_media_id" => image_media_id}
|
39
|
+
news_media = news_media_1.merge(media)
|
40
|
+
|
41
|
+
# upload news media
|
42
|
+
response = $client.upload_mass_news([news_media])
|
43
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
44
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
45
|
+
end
|
46
|
+
|
47
|
+
it "#mass_with_group with mpnews" do
|
48
|
+
response = $client.mass_with_group("1", "mass_group_text", "text")
|
49
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "#mass_with_groug send to all" do
|
53
|
+
response = $client.mass_with_group("1", "mass_group_text_to_all", "text", true)
|
54
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "#mass_with_openids with mpnews and can delete message" do
|
58
|
+
response = $client.mass_with_openids([ENV["OPENID"]], mass_media_id)
|
59
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
60
|
+
expect(response.result.keys).to eq(["msg_id"])
|
61
|
+
delete_res = $client.mass_delete_with_msgid(response.result["msg_id"])
|
62
|
+
expect(delete_res.code).to eq(WeixinAuthorize::OK_CODE)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "#mass_preview can preview by openid" do
|
66
|
+
response = $client.mass_preview(ENV["OPENID"], "mass_text", "text")
|
67
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
describe WeixinAuthorize::Api::Media do
|
2
|
+
|
3
|
+
let(:image_jpg_path) do
|
4
|
+
"#{File.dirname(__FILE__)}/medias/ruby-logo.jpg"
|
5
|
+
end
|
6
|
+
|
7
|
+
let(:image_ico_path) do
|
8
|
+
"#{File.dirname(__FILE__)}/medias/favicon.ico"
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:image_jpg_file) do
|
12
|
+
File.new(image_jpg_path)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:image_ico_file) do
|
16
|
+
File.new(image_ico_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:remote_png_path) do
|
20
|
+
"https://ruby-china-files.b0.upaiyun.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png"
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:remote_jpg_path) do
|
24
|
+
"http://g.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=ce55457e4334970a537e187df4a3baad/03087bf40ad162d99455ef4d13dfa9ec8b13632762d0ed14.jpg"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can upload a jpg image and get url" do
|
28
|
+
response = $client.upload_image(image_jpg_file)
|
29
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
30
|
+
expect(response.result.keys).to eq(["url"])
|
31
|
+
end
|
32
|
+
|
33
|
+
it "can upload a png image and get url" do
|
34
|
+
response = $client.upload_image(remote_png_path)
|
35
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
36
|
+
expect(response.result.keys).to eq(["url"])
|
37
|
+
end
|
38
|
+
|
39
|
+
it "can upload a jpg File image" do
|
40
|
+
response = $client.upload_media(image_jpg_file, "image")
|
41
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
42
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can upload a ico File image" do
|
46
|
+
response = $client.upload_media(image_ico_file, "image")
|
47
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
48
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
49
|
+
end
|
50
|
+
|
51
|
+
it "can upload a local image" do
|
52
|
+
response = $client.upload_media(image_jpg_path, "image")
|
53
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
54
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
55
|
+
end
|
56
|
+
|
57
|
+
it "can upload a local ico image" do
|
58
|
+
response = $client.upload_media(image_ico_path, "image")
|
59
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
60
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
61
|
+
end
|
62
|
+
|
63
|
+
it "can upload a remote png image" do
|
64
|
+
response = $client.upload_media(remote_png_path, "image")
|
65
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
66
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can upload a remote jpg image" do
|
70
|
+
response = $client.upload_media(remote_jpg_path, "image")
|
71
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
72
|
+
expect(response.result.keys).to eq(["type", "media_id", "created_at"])
|
73
|
+
end
|
74
|
+
|
75
|
+
it "#download_media_url return a String url" do
|
76
|
+
image = $client.upload_media(image_ico_path, "image")
|
77
|
+
media_id = image.result["media_id"]
|
78
|
+
image_url = $client.download_media_url(media_id)
|
79
|
+
expect(image_url.class).to eq(String)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
describe WeixinAuthorize::Api::Menu do
|
3
|
+
|
4
|
+
it "can create a menu" do
|
5
|
+
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"}]}]}'
|
6
|
+
response = $client.create_menu(JSON.load(menu)) # or Json string
|
7
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "can't create a menu if invalid button size" do
|
11
|
+
menu = '{"button":[]}'
|
12
|
+
response = $client.create_menu(menu)
|
13
|
+
expect(response.code).not_to eq(WeixinAuthorize::OK_CODE)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "can get a weixin Menu info" do
|
17
|
+
menu_info = $client.menu
|
18
|
+
expect(menu_info.result.keys[0]).to eq("menu")
|
19
|
+
expect(menu_info.code).to eq(WeixinAuthorize::OK_CODE)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can delete weixin Menu" do
|
23
|
+
response = $client.delete_menu
|
24
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
describe WeixinAuthorize::Api::Qrcode do
|
2
|
+
|
3
|
+
it "#create_qr_scene" do
|
4
|
+
response = $client.create_qr_scene("123")
|
5
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
6
|
+
expect(response.result.keys).to eq(["ticket", "expire_seconds", "url"])
|
7
|
+
expect(response.result["expire_seconds"]).to eq(1800)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "#create_qr_limit_scene" do
|
11
|
+
response = $client.create_qr_limit_scene(scene_id: 1234, scene_str: "wechat")
|
12
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
13
|
+
expect(response.result.keys).to eq(["ticket", "url"])
|
14
|
+
end
|
15
|
+
|
16
|
+
it "#return_qr_url" do
|
17
|
+
response = $client.create_qr_limit_scene(scene_id: 1234, scene_str: "wechat")
|
18
|
+
qr_url = $client.qr_code_url(response.result["ticket"])
|
19
|
+
expect(response.code).to eq(WeixinAuthorize::OK_CODE)
|
20
|
+
expect(qr_url).to match(/(\S+\.(com|net|org|edu|gov)(\/\S+)?)/)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
describe WeixinAuthorize::Api::Template do
|
2
|
+
# {{first.DATA}}
|
3
|
+
# 项目名称:{{class.DATA}}
|
4
|
+
# 时间:{{time.DATA}}
|
5
|
+
# 地点:{{add.DATA}}
|
6
|
+
# {{remark.DATA}}
|
7
|
+
it "can send template msg" do
|
8
|
+
url = "http://www.baidu.com"
|
9
|
+
data = {
|
10
|
+
first: {
|
11
|
+
value: "报名结果通知",
|
12
|
+
color: "#173277"
|
13
|
+
},
|
14
|
+
class: {
|
15
|
+
value: "领导与管理课程培训/人格测评",
|
16
|
+
color: "#173177"
|
17
|
+
},
|
18
|
+
time: {
|
19
|
+
value: "11月6日—11月7日(周三—周五)",
|
20
|
+
color: "#274177"
|
21
|
+
},
|
22
|
+
add: {
|
23
|
+
value: "F302室",
|
24
|
+
color: "#274377"
|
25
|
+
},
|
26
|
+
remark: {
|
27
|
+
value: "您可点击【详情】查看详细信息。",
|
28
|
+
color: "#274377"
|
29
|
+
}
|
30
|
+
}
|
31
|
+
msg_result = $client.send_template_msg(
|
32
|
+
ENV["OPENID"],
|
33
|
+
ENV["TEMPLATE_ID"],
|
34
|
+
url,
|
35
|
+
"#173177",
|
36
|
+
data
|
37
|
+
)
|
38
|
+
expect(msg_result.code).to eq(WeixinAuthorize::OK_CODE)
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
describe WeixinAuthorize::Api::User do
|
2
|
+
it "can get a weixin User info" do
|
3
|
+
user_info = $client.user(ENV["OPENID"])
|
4
|
+
expect(user_info.code).to eq(WeixinAuthorize::OK_CODE)
|
5
|
+
expect(user_info.result["openid"]).to eq(ENV["OPENID"])
|
6
|
+
end
|
7
|
+
|
8
|
+
it "can get followers infos" do
|
9
|
+
valid_info = $client.is_valid?
|
10
|
+
expect(valid_info).to eq(true)
|
11
|
+
followers = $client.followers
|
12
|
+
expect(followers.code).to eq(WeixinAuthorize::OK_CODE)
|
13
|
+
expect(followers.result.keys).to eq(["total", "count", "data", "next_openid"])
|
14
|
+
|
15
|
+
valid_info = $client.is_valid?
|
16
|
+
expect(valid_info).to eq(true)
|
17
|
+
followers = $client.followers
|
18
|
+
expect(followers.code).to eq(WeixinAuthorize::OK_CODE)
|
19
|
+
expect(followers.result.keys).to eq(["total", "count", "data", "next_openid"])
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can update user remark" do
|
23
|
+
user_info = $client.update_remark(ENV["OPENID"], "dylan")
|
24
|
+
expect(user_info.code).to eq(WeixinAuthorize::OK_CODE)
|
25
|
+
end
|
26
|
+
end
|