easy_weixin 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -26
- data/Rakefile +11 -1
- data/easy_weixin.gemspec +6 -2
- data/lib/easy_weixin.rb +34 -31
- data/lib/easy_weixin/api.rb +86 -0
- data/lib/easy_weixin/auth.rb +1 -1
- data/lib/easy_weixin/config.rb +25 -0
- data/lib/easy_weixin/menu.rb +11 -0
- data/lib/easy_weixin/{model.rb → message.rb} +8 -14
- data/lib/easy_weixin/response.rb +32 -0
- data/lib/easy_weixin/version.rb +1 -1
- data/test/menu.json +54 -0
- data/test/test_auth.rb +19 -0
- data/test/test_get_access_token.rb +13 -0
- data/test/test_menu.rb +13 -0
- data/test/test_response.rb +44 -0
- data/{spec → test}/test_xml.rb +1 -1
- metadata +63 -11
- data/spec/auth_spec.rb +0 -20
- data/spec/reply_spec.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0441570dd87ce9e4cf8311ed51603591805e773d
|
4
|
+
data.tar.gz: 4e1988ce9b0501884b545cf70cdea68584e5faec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be0eb93ce57ecd370ada2097c7927fece940d064a2688260147e5958aa4566ae536d1d8ebf0824dba3f1ecd20a0b34b3309421ed4b9d0f59f906f8bb7fe26b33
|
7
|
+
data.tar.gz: 5d6dc102a8bd1b199004f45e275ebf9761b292a08d0fd2db747e7e3ead87fe139f4048c4516830dcf19f22e3a3ff1c7212550d5dee7cb6a49a08970189e52f1f
|
data/README.md
CHANGED
@@ -1,37 +1,51 @@
|
|
1
1
|
# EasyWeixin
|
2
2
|
|
3
|
-
A Simple gem for weixin
|
3
|
+
A Simple gem for weixin
|
4
4
|
|
5
|
-
|
5
|
+
# Installation
|
6
6
|
|
7
7
|
gem install easy_weixin
|
8
8
|
|
9
|
-
|
9
|
+
### Rails use redis
|
10
10
|
|
11
|
-
|
11
|
+
```
|
12
|
+
EasyWeixin.configure do |config|
|
13
|
+
config.redis = Redis.new
|
14
|
+
end
|
15
|
+
```
|
12
16
|
|
13
|
-
|
17
|
+
# Usage
|
14
18
|
|
15
|
-
|
16
|
-
nonce = params[:nonce]
|
17
|
-
signature = params[:signature]
|
18
|
-
echostr = params[:echostr]
|
19
|
-
token = 'xxxxx'
|
20
|
-
easy_weixin = EasyWeixin::Auth.new(token, timestamp, nonce, signature, echostr) # => echostr or false
|
19
|
+
### 验证
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
```
|
22
|
+
easy_weixin = EasyWeixin::Auth.new(@token, @timestamp, @nonce, @signature, @echostr)
|
23
|
+
easy_weixin.check_valid # => echostr or false
|
24
|
+
```
|
25
25
|
|
26
|
-
###
|
26
|
+
### 创建菜单
|
27
|
+
|
28
|
+
```
|
29
|
+
$client = EasyWeixin::Api.new(ENV["APPID"], ENV["APPSECRET"])
|
30
|
+
$client.create_menu(data)
|
31
|
+
```
|
32
|
+
|
33
|
+
### 解析XML
|
34
|
+
```
|
35
|
+
request_xml = Nokogiri::XML(request.body.read).to_s
|
36
|
+
msg = EasyWeixin::Response.analysis_xml(request_xml)
|
37
|
+
```
|
38
|
+
|
39
|
+
### 回复
|
27
40
|
|
28
41
|
* ReplyText
|
29
42
|
```
|
30
43
|
EasyWeixin.text_msg(msg.ToUserName, msg.FromUserName, 'i am a text reply')
|
31
44
|
```
|
45
|
+
|
32
46
|
* ReplyNews
|
33
47
|
```
|
34
|
-
msg = EasyWeixin::
|
48
|
+
msg = EasyWeixin::Response.analysis_xml(request_xml)
|
35
49
|
if msg.Content == 'Hello2BizUser'
|
36
50
|
item1 = EasyWeixin::Item.new
|
37
51
|
item1.Title = 'title1'
|
@@ -42,14 +56,9 @@ check_valid
|
|
42
56
|
Articles = [item1, item2]
|
43
57
|
ArticleCount = Articles.size
|
44
58
|
end
|
45
|
-
|
46
|
-
|
59
|
+
EasyWeixin::Response.news_msg(msg.ToUserName, msg.FromUserName, Articles, ArticleCount)
|
60
|
+
```
|
61
|
+
### 测试
|
62
|
+
```
|
63
|
+
rake test
|
47
64
|
```
|
48
|
-
|
49
|
-
## Contributing
|
50
|
-
|
51
|
-
1. Fork it ( http://github.com/<my-github-username>/easy_weixin/fork )
|
52
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
53
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
54
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
55
|
-
5. Create new Pull Request
|
data/Rakefile
CHANGED
@@ -1 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
Rake::TestTask.new(:test) do |t|
|
4
|
+
# libs表示要添加到$LOAD_PATH(就是加载ruby文件的搜索路径)的文件夹
|
5
|
+
# 默认是"lib",现在再添加"test"
|
6
|
+
t.libs << "test"
|
7
|
+
# 要运行的测试文件的特征。匹配以test_开头的所有文件
|
8
|
+
t.pattern = 'test/*.rb'
|
9
|
+
# 不输出测试文件的信息
|
10
|
+
t.verbose = false
|
11
|
+
end
|
data/easy_weixin.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = EasyWeixin::VERSION
|
9
9
|
spec.authors = ["menghuanwd"]
|
10
10
|
spec.email = ["651019063@qq.com"]
|
11
|
-
spec.summary = %q{easy to use weixin.}
|
12
|
-
spec.description = %q{
|
11
|
+
spec.summary = %q{easy to use weixin public api.}
|
12
|
+
spec.description = %q{create menu and reply message.}
|
13
13
|
spec.homepage = "https://github.com/menghuanwd/easy_weixin"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -22,4 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "roxml"
|
24
24
|
spec.add_development_dependency "multi_xml"
|
25
|
+
spec.add_development_dependency "faraday"
|
26
|
+
spec.add_development_dependency "typhoeus"
|
27
|
+
spec.add_development_dependency "redis"
|
28
|
+
|
25
29
|
end
|
data/lib/easy_weixin.rb
CHANGED
@@ -1,40 +1,43 @@
|
|
1
1
|
require 'multi_xml'
|
2
2
|
require 'ostruct'
|
3
|
-
require
|
3
|
+
require 'redis'
|
4
|
+
require 'roxml'
|
5
|
+
require "easy_weixin/config"
|
4
6
|
require "easy_weixin/auth"
|
7
|
+
require "easy_weixin/menu"
|
8
|
+
require "easy_weixin/response"
|
9
|
+
require "easy_weixin/message"
|
10
|
+
require "easy_weixin/api"
|
5
11
|
require 'rack'
|
6
|
-
require '
|
12
|
+
require 'faraday'
|
13
|
+
require 'typhoeus/adapters/faraday'
|
7
14
|
|
8
15
|
module EasyWeixin
|
9
|
-
extend self
|
16
|
+
# extend self
|
10
17
|
|
11
|
-
def text_msg(from, to, content)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
+
# def text_msg(from, to, content)
|
19
|
+
# msg = TextReplyMessage.new
|
20
|
+
# msg.ToUserName = to
|
21
|
+
# msg.FromUserName = from
|
22
|
+
# msg.Content = content
|
23
|
+
# msg.to_xml
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# def news_msg(from, to, articles, articleCount=1)
|
27
|
+
# msg = NewsReplyMessage.new
|
28
|
+
# msg.ToUserName = to
|
29
|
+
# msg.FromUserName = from
|
30
|
+
# unless articles.is_a?(Array)
|
31
|
+
# articles = [articles]
|
32
|
+
# end
|
33
|
+
# msg.Articles = articles
|
34
|
+
# msg.ArticleCount = articleCount
|
35
|
+
# msg.to_xml
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# def analysis_xml(request_xml)
|
39
|
+
# hash = MultiXml.parse(request_xml)['xml']
|
40
|
+
# source = OpenStruct.new(hash)
|
41
|
+
# end
|
18
42
|
|
19
|
-
def news_msg(from, to, articles, articleCount=1)
|
20
|
-
msg = NewsReplyMessage.new
|
21
|
-
msg.ToUserName = to
|
22
|
-
msg.FromUserName = from
|
23
|
-
unless articles.is_a?(Array)
|
24
|
-
articles = [articles]
|
25
|
-
end
|
26
|
-
msg.Articles = articles
|
27
|
-
msg.ArticleCount = articleCount
|
28
|
-
msg.to_xml
|
29
|
-
end
|
30
|
-
|
31
|
-
def analysis_xml(request_xml)
|
32
|
-
hash = MultiXml.parse(request_xml)['xml']
|
33
|
-
source = OpenStruct.new(hash)
|
34
|
-
end
|
35
|
-
|
36
|
-
def get_weixin_access_token(appid, appsecret)
|
37
|
-
url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=#{appid}&secret=#{appsecret}"
|
38
|
-
JSON.parse(open(url).read)["access_token"]
|
39
|
-
end
|
40
43
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# 接入API
|
2
|
+
|
3
|
+
module EasyWeixin
|
4
|
+
class Api
|
5
|
+
include Menu
|
6
|
+
|
7
|
+
def initialize(app_id, app_secret)
|
8
|
+
@app_id = app_id
|
9
|
+
@app_secret = app_secret
|
10
|
+
@redis_key = "weixin_access_token_#{app_id}"
|
11
|
+
@grant_type = 'client_credential'
|
12
|
+
@weixin_api_url = 'https://api.weixin.qq.com'
|
13
|
+
end
|
14
|
+
|
15
|
+
# 获取access_token,如果启用redis则使用redis记录,如果没启用就每次进行一次查询。
|
16
|
+
def get_access_token
|
17
|
+
if EasyWeixin.weixin_redis
|
18
|
+
access_token = weixin_redis.get(@redis_key)
|
19
|
+
|
20
|
+
if access_token
|
21
|
+
access_token
|
22
|
+
else
|
23
|
+
refresh_token
|
24
|
+
end
|
25
|
+
|
26
|
+
else
|
27
|
+
get_access_token_http
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_access_token_http
|
32
|
+
conn = Faraday.new(url: "https://api.weixin.qq.com") do |faraday|
|
33
|
+
faraday.request :url_encoded
|
34
|
+
faraday.adapter :typhoeus
|
35
|
+
end
|
36
|
+
response = conn.get("cgi-bin/token", authenticate_headers)
|
37
|
+
|
38
|
+
token_hash = JSON.parse(response.body)
|
39
|
+
|
40
|
+
access_token = token_hash["access_token"]
|
41
|
+
end
|
42
|
+
|
43
|
+
def refresh_token
|
44
|
+
get_access_token_http
|
45
|
+
|
46
|
+
conn = Faraday.new(url: "https://api.weixin.qq.com") do |faraday|
|
47
|
+
faraday.request :url_encoded
|
48
|
+
faraday.adapter :typhoeus
|
49
|
+
end
|
50
|
+
response = conn.get("cgi-bin/token", authenticate_headers)
|
51
|
+
token_hash = JSON.parse(response.body)
|
52
|
+
|
53
|
+
access_token = token_hash["access_token"]
|
54
|
+
expires_in = token_hash["expires_in"]
|
55
|
+
|
56
|
+
weixin_redis.set(@redis_key, access_token)
|
57
|
+
weixin_redis.expire(@redis_key, expires_in - 5)
|
58
|
+
|
59
|
+
token_hash["access_token"]
|
60
|
+
end
|
61
|
+
|
62
|
+
def authenticate_headers
|
63
|
+
{grant_type: @grant_type, appid: @app_id, secret: @app_secret}
|
64
|
+
end
|
65
|
+
|
66
|
+
def weixin_redis
|
67
|
+
EasyWeixin.weixin_redis
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def http_post(url, data)
|
73
|
+
conn = Faraday.new(url: @weixin_api_url) do |faraday|
|
74
|
+
faraday.request :url_encoded
|
75
|
+
faraday.adapter :typhoeus
|
76
|
+
end
|
77
|
+
response = conn.post do |req|
|
78
|
+
req.url url
|
79
|
+
req.params['access_token'] = get_access_token
|
80
|
+
req.headers['Content-Type'] = 'application/json'
|
81
|
+
req.body = data
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
data/lib/easy_weixin/auth.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
module EasyWeixin
|
2
|
+
class << self
|
3
|
+
|
4
|
+
attr_accessor :config
|
5
|
+
|
6
|
+
def configure
|
7
|
+
yield self.config ||= Config.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def weixin_redis
|
11
|
+
# use add log
|
12
|
+
return nil if EasyWeixin.config.nil?
|
13
|
+
EasyWeixin.config.redis
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class Config
|
19
|
+
attr_accessor :redis
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# EasyWeixin.configure do |config|
|
24
|
+
# config.redis = Redis.new
|
25
|
+
# end
|
@@ -1,20 +1,14 @@
|
|
1
|
-
require 'multi_xml'
|
2
|
-
require 'ostruct'
|
3
|
-
require 'roxml'
|
4
|
-
|
5
1
|
module EasyWeixin
|
6
2
|
class Message
|
7
|
-
attr_accessor :ToUserName, :FromUserName, :CreateTime
|
8
3
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@CreateTime = CreateTime
|
13
|
-
end
|
4
|
+
include Response
|
5
|
+
|
6
|
+
# attr_accessor :ToUserName, :FromUserName, :CreateTime
|
14
7
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
8
|
+
def initialize(to,from,time)
|
9
|
+
@ToUserName = to
|
10
|
+
@FromUserName = from
|
11
|
+
@CreateTime = time
|
18
12
|
end
|
19
13
|
|
20
14
|
end
|
@@ -70,4 +64,4 @@ module EasyWeixin
|
|
70
64
|
end
|
71
65
|
|
72
66
|
|
73
|
-
end
|
67
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module EasyWeixin
|
2
|
+
module Response
|
3
|
+
extend self
|
4
|
+
|
5
|
+
# 创建文本信息
|
6
|
+
def text_msg(from, to, content)
|
7
|
+
msg = TextReplyMessage.new
|
8
|
+
msg.ToUserName = to
|
9
|
+
msg.FromUserName = from
|
10
|
+
msg.Content = content
|
11
|
+
msg.to_xml
|
12
|
+
end
|
13
|
+
|
14
|
+
def news_msg(from, to, articles, articleCount=1)
|
15
|
+
msg = NewsReplyMessage.new
|
16
|
+
msg.ToUserName = to
|
17
|
+
msg.FromUserName = from
|
18
|
+
unless articles.is_a?(Array)
|
19
|
+
articles = [articles]
|
20
|
+
end
|
21
|
+
msg.Articles = articles
|
22
|
+
msg.ArticleCount = articleCount
|
23
|
+
msg.to_xml
|
24
|
+
end
|
25
|
+
|
26
|
+
def analysis_xml(request_xml)
|
27
|
+
hash = MultiXml.parse(request_xml)['xml']
|
28
|
+
source = OpenStruct.new(hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/lib/easy_weixin/version.rb
CHANGED
data/test/menu.json
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
{
|
2
|
+
"button": [
|
3
|
+
{
|
4
|
+
"name": "美女如云",
|
5
|
+
"sub_button": [
|
6
|
+
{
|
7
|
+
"type": "view",
|
8
|
+
"name": "性感美女",
|
9
|
+
"url": "http://wap.guyifeng.pw/photos?photo_category_id=1"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"type": "view",
|
13
|
+
"name": "小清新",
|
14
|
+
"url": "http://wap.guyifeng.pw/photos?photo_category_id=2"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"type": "view",
|
18
|
+
"name": "甜素纯",
|
19
|
+
"url": "http://wap.guyifeng.pw/photos?photo_category_id=5"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"type": "view",
|
23
|
+
"name": "清纯",
|
24
|
+
"url": "http://wap.guyifeng.pw/photos?photo_category_id=6"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"type": "view",
|
28
|
+
"name": "嫩萝莉",
|
29
|
+
"url": "http://wap.guyifeng.pw/photos?photo_category_id=11"
|
30
|
+
}
|
31
|
+
]
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"name": "来个人",
|
35
|
+
"sub_button": [
|
36
|
+
{
|
37
|
+
"type": "click",
|
38
|
+
"name": "男人",
|
39
|
+
"key": "boy"
|
40
|
+
},
|
41
|
+
{
|
42
|
+
"type": "click",
|
43
|
+
"name": "女人",
|
44
|
+
"key": "girl"
|
45
|
+
}
|
46
|
+
]
|
47
|
+
},
|
48
|
+
{
|
49
|
+
"name": "来个笑话",
|
50
|
+
"type": "click",
|
51
|
+
"key": "joke"
|
52
|
+
}
|
53
|
+
]
|
54
|
+
}
|
data/test/test_auth.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'easy_weixin'
|
3
|
+
|
4
|
+
describe "EasyWeixin" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@token = 'dave'
|
8
|
+
@timestamp = Time.now.to_i.to_s
|
9
|
+
@nonce = '123456'
|
10
|
+
@signature = Digest::SHA1.hexdigest( [@token, @timestamp, @nonce].sort.join )
|
11
|
+
@echostr = 'caishu'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'function check_valid' do
|
15
|
+
easy_weixin = EasyWeixin::Auth.new(@token, @timestamp, @nonce, @signature, @echostr)
|
16
|
+
easy_weixin.check_valid.must_equal @echostr
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'easy_weixin'
|
3
|
+
|
4
|
+
describe 'AccessToken' do
|
5
|
+
before do
|
6
|
+
@client = EasyWeixin::Api.new('wx61e7c4dba13cc83e', 'bfdffb358e437f3149bbbfed7e7c8ccd')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'ssss' do
|
10
|
+
puts @client.get_access_token
|
11
|
+
# @client.get_access_token.must_equal "OHAI!"
|
12
|
+
end
|
13
|
+
end
|
data/test/test_menu.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'easy_weixin'
|
3
|
+
|
4
|
+
describe 'AccessToken' do
|
5
|
+
before do
|
6
|
+
@client = EasyWeixin::Api.new('wx61e7c4dba13cc83e', 'bfdffb358e437f3149bbbfed7e7c8ccd')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'menu' do
|
10
|
+
data = File.open(File.expand_path('../menu.json',__FILE__)).read
|
11
|
+
puts @client.create_menu(data).body
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'easy_weixin'
|
3
|
+
require File.expand_path('../test_xml',__FILE__)
|
4
|
+
|
5
|
+
describe "EasyWeixin" do
|
6
|
+
|
7
|
+
describe "subscribe" do
|
8
|
+
it 'subscribe' do
|
9
|
+
|
10
|
+
msg = EasyWeixin::Response.analysis_xml($subscribe_xml)
|
11
|
+
|
12
|
+
puts easy_weixin = EasyWeixin::Response.text_msg(msg.ToUserName, msg.FromUserName, 'Hi 欢迎来到顾益峰的个人微信频道,能来到这里的,都是我的朋友,都是一家人,这里你可以很放松!回复joke,听个笑话.回复girl,会显示我的五个女性朋友.回复boy,会显示我的五个男性朋友,回复其他内容,有你意想不到的内容喔~')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "text" do
|
17
|
+
it 'text' do
|
18
|
+
|
19
|
+
msg = EasyWeixin::Response.analysis_xml($text_xml)
|
20
|
+
|
21
|
+
puts easy_weixin = EasyWeixin::Response.text_msg(msg.ToUserName, msg.FromUserName, '我只是一个回复')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "news" do
|
26
|
+
it 'news' do
|
27
|
+
msg = EasyWeixin::Response.analysis_xml($text_xml)
|
28
|
+
if msg.Content == 'Hello2BizUser'
|
29
|
+
item1 = EasyWeixin::Item.new
|
30
|
+
item1.Title = 'title1'
|
31
|
+
item1.Description = 'blah'
|
32
|
+
item2 = EasyWeixin::Item.new
|
33
|
+
item2.Title = 'title2'
|
34
|
+
item2.Description = 'blah blah'
|
35
|
+
Articles = [item1, item2]
|
36
|
+
ArticleCount = Articles.size
|
37
|
+
end
|
38
|
+
|
39
|
+
puts EasyWeixin::Response.news_msg(msg.ToUserName, msg.FromUserName, Articles, ArticleCount)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
data/{spec → test}/test_xml.rb
RENAMED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_weixin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- menghuanwd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,7 +66,49 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: typhoeus
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: redis
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: create menu and reply message.
|
70
112
|
email:
|
71
113
|
- 651019063@qq.com
|
72
114
|
executables: []
|
@@ -81,12 +123,19 @@ files:
|
|
81
123
|
- Rakefile
|
82
124
|
- easy_weixin.gemspec
|
83
125
|
- lib/easy_weixin.rb
|
126
|
+
- lib/easy_weixin/api.rb
|
84
127
|
- lib/easy_weixin/auth.rb
|
85
|
-
- lib/easy_weixin/
|
128
|
+
- lib/easy_weixin/config.rb
|
129
|
+
- lib/easy_weixin/menu.rb
|
130
|
+
- lib/easy_weixin/message.rb
|
131
|
+
- lib/easy_weixin/response.rb
|
86
132
|
- lib/easy_weixin/version.rb
|
87
|
-
-
|
88
|
-
-
|
89
|
-
-
|
133
|
+
- test/menu.json
|
134
|
+
- test/test_auth.rb
|
135
|
+
- test/test_get_access_token.rb
|
136
|
+
- test/test_menu.rb
|
137
|
+
- test/test_response.rb
|
138
|
+
- test/test_xml.rb
|
90
139
|
homepage: https://github.com/menghuanwd/easy_weixin
|
91
140
|
licenses:
|
92
141
|
- MIT
|
@@ -110,8 +159,11 @@ rubyforge_project:
|
|
110
159
|
rubygems_version: 2.2.2
|
111
160
|
signing_key:
|
112
161
|
specification_version: 4
|
113
|
-
summary: easy to use weixin.
|
162
|
+
summary: easy to use weixin public api.
|
114
163
|
test_files:
|
115
|
-
-
|
116
|
-
-
|
117
|
-
-
|
164
|
+
- test/menu.json
|
165
|
+
- test/test_auth.rb
|
166
|
+
- test/test_get_access_token.rb
|
167
|
+
- test/test_menu.rb
|
168
|
+
- test/test_response.rb
|
169
|
+
- test/test_xml.rb
|
data/spec/auth_spec.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'rspec'
|
2
|
-
require 'digest/sha1'
|
3
|
-
require 'easy_weixin/auth'
|
4
|
-
describe "Weixin::Middleware" do
|
5
|
-
|
6
|
-
before(:all) do
|
7
|
-
@token = 'dave'
|
8
|
-
@timestamp = Time.now.to_i.to_s
|
9
|
-
@nonce = '123456'
|
10
|
-
@signature = Digest::SHA1.hexdigest( [@token, @timestamp, @nonce].sort.join )
|
11
|
-
@echostr = 'caishu'
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
it 'function check_valid' do
|
16
|
-
easy_weixin = EasyWeixin::Auth.new(@token, @timestamp, @nonce, @signature, @echostr)
|
17
|
-
easy_weixin.check_valid.should == @echostr
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
data/spec/reply_spec.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'rspec'
|
2
|
-
require 'digest/sha1'
|
3
|
-
require 'easy_weixin/model'
|
4
|
-
require 'easy_weixin'
|
5
|
-
require File.expand_path('../test_xml',__FILE__)
|
6
|
-
|
7
|
-
describe "Weixin::Message" do
|
8
|
-
it 'is a text message' do
|
9
|
-
puts msg = EasyWeixin.analysis_xml($subscribe_xml)
|
10
|
-
|
11
|
-
case msg.MsgType
|
12
|
-
when 'text'
|
13
|
-
# TextMessage.new(hash)
|
14
|
-
puts EasyWeixin.text_msg(msg.ToUserName, msg.FromUserName, '我只是一个回复')
|
15
|
-
when 'image'
|
16
|
-
# ImageMessage.new(hash)
|
17
|
-
when 'location'
|
18
|
-
# LocationMessage.new(hash)
|
19
|
-
when 'link'
|
20
|
-
# LinkMessage.new(hash)
|
21
|
-
when 'event'
|
22
|
-
if msg.Event == "subscribe"
|
23
|
-
puts EasyWeixin.text_msg(msg.ToUserName, msg.FromUserName, 'Hi 欢迎来到顾益峰的个人微信频道,能来到这里的,都是我的朋友,都是一家人,这里你可以很放松!回复joke,听个笑话.回复girl,会显示我的五个女性朋友.回复boy,会显示我的五个男性朋友,回复其他内容,有你意想不到的内容喔~')
|
24
|
-
else
|
25
|
-
puts EasyWeixin.text_msg(msg.ToUserName, msg.FromUserName, '你确定?')
|
26
|
-
end
|
27
|
-
when 'voice'
|
28
|
-
# VoiceMessage.new(hash)
|
29
|
-
when 'video'
|
30
|
-
# VideoMessage.new(hash)
|
31
|
-
else
|
32
|
-
raise 'Unknown Message'
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'is a news' do
|
38
|
-
puts msg = EasyWeixin::Message.factory($text_xml)
|
39
|
-
|
40
|
-
if msg.Content == 'Hello2BizUser'
|
41
|
-
item1 = EasyWeixin::Item.new
|
42
|
-
item1.Title = 'title1'
|
43
|
-
item1.Description = 'blah'
|
44
|
-
item2 = EasyWeixin::Item.new
|
45
|
-
item2.Title = 'title2'
|
46
|
-
item2.Description = 'blah blah'
|
47
|
-
Articles = [item1, item2]
|
48
|
-
ArticleCount = Articles.size
|
49
|
-
end
|
50
|
-
|
51
|
-
puts EasyWeixin.news_msg(msg.ToUserName, msg.FromUserName, Articles, ArticleCount)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|