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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +11 -0
  6. data/Gemfile +5 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +72 -0
  9. data/Rakefile +1 -0
  10. data/lib/weixin_authorize/api/custom.rb +176 -0
  11. data/lib/weixin_authorize/api/data_cube.rb +8 -0
  12. data/lib/weixin_authorize/api/groups.rb +60 -0
  13. data/lib/weixin_authorize/api/mass.rb +80 -0
  14. data/lib/weixin_authorize/api/media.rb +149 -0
  15. data/lib/weixin_authorize/api/menu.rb +36 -0
  16. data/lib/weixin_authorize/api/oauth.rb +50 -0
  17. data/lib/weixin_authorize/api/qrcode.rb +53 -0
  18. data/lib/weixin_authorize/api/template.rb +43 -0
  19. data/lib/weixin_authorize/api/user.rb +69 -0
  20. data/lib/weixin_authorize/api.rb +3 -0
  21. data/lib/weixin_authorize/carrierwave/weixin_uploader.rb +4 -0
  22. data/lib/weixin_authorize/client.rb +95 -0
  23. data/lib/weixin_authorize/config.rb +35 -0
  24. data/lib/weixin_authorize/handler/exceptions.rb +5 -0
  25. data/lib/weixin_authorize/handler/global_code.rb +127 -0
  26. data/lib/weixin_authorize/handler/result_handler.rb +52 -0
  27. data/lib/weixin_authorize/handler.rb +3 -0
  28. data/lib/weixin_authorize/js_ticket/object_store.rb +21 -0
  29. data/lib/weixin_authorize/js_ticket/redis_store.rb +41 -0
  30. data/lib/weixin_authorize/js_ticket/store.rb +40 -0
  31. data/lib/weixin_authorize/token/object_store.rb +25 -0
  32. data/lib/weixin_authorize/token/redis_store.rb +38 -0
  33. data/lib/weixin_authorize/token/store.rb +72 -0
  34. data/lib/weixin_authorize/version.rb +3 -0
  35. data/lib/weixin_authorize.rb +97 -0
  36. data/spec/1_fetch_access_token_spec.rb +43 -0
  37. data/spec/2_fetch_jsticket_spec.rb +10 -0
  38. data/spec/api/custom_spec.rb +71 -0
  39. data/spec/api/groups_spec.rb +74 -0
  40. data/spec/api/mass_spec.rb +70 -0
  41. data/spec/api/media_spec.rb +82 -0
  42. data/spec/api/medias/favicon.ico +0 -0
  43. data/spec/api/medias/ruby-logo.jpg +0 -0
  44. data/spec/api/menu_spec.rb +26 -0
  45. data/spec/api/qrcode_spec.rb +22 -0
  46. data/spec/api/template_spec.rb +40 -0
  47. data/spec/api/user_spec.rb +26 -0
  48. data/spec/spec_helper.rb +130 -0
  49. data/weixin_authorize_superayi.gemspec +48 -0
  50. 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,3 @@
1
+ module WeixinAuthorize
2
+ VERSION = "1.6.4"
3
+ 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