weixin_rails_middleware 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c106f4f5b4f9a69155ebed8496650fea9e818c5e
4
- data.tar.gz: 5e14b1dcb4fb846396a93d2e243fd1591310f645
3
+ metadata.gz: 328982300f97b4e56ae76baac5df06ae9b8e5605
4
+ data.tar.gz: 330a98f5c4c6b13cd86a0740b2a91cf6f2a3c4cb
5
5
  SHA512:
6
- metadata.gz: 7cf5f89774e7659dffe2b12be128348b0fb34e12afd73cf9cb9db80c230ced3996ec37033cd62a492969f727aefed648a29b86be905043f0237cddac07adf349
7
- data.tar.gz: 140ce490d0704183158f44112cb2cb9460a99628a0e462507ae820cefc49ac4c95794b45f50a12a58d0a2820f01c7a4422c44e179af19fb094bd5aae361fd49c
6
+ metadata.gz: 999b82f09d4bf3cc3731e6ab1bf7dd7ad19b3183e2cbb0aef72c49c688e53065b4b201407ed28e4720e0bfd7d1f7792c6180ff20438b35aba771d239e0b646a9
7
+ data.tar.gz: 9f5ae33310059880dda908ad38bb7faf4aebce6763e5df0c04eb0da65cbc4c5c689a213206dc0017eb4ec2e4ecfdec3fc9cd09b088174fe029abf8efa667476d
@@ -16,8 +16,4 @@ WeixinRailsMiddleware.configure do |config|
16
16
  # using to weixin server url to validate the token can be trusted.
17
17
  # config.weixin_secret_string = '<%= WeiXinUniqueToken.generate(generator: :urlsafe_base64, size: 24) %>'
18
18
 
19
- ## Router configure ##
20
- # Default is "/", and recommend you use default directly.
21
- # config.engine_path = "/"
22
-
23
19
  end
@@ -1,7 +1,11 @@
1
+ # encoding: utf-8
2
+ # 1: get weixin xml params
3
+ # @weixin_message
4
+ # 2: public_account_class instance if you setup, otherwise return nil
5
+ # @weixin_public_account
1
6
  WeixinRailsMiddleware::WeixinController.class_eval do
7
+ before_filter :set_keyword, only: :reply
2
8
 
3
- # There are two instance: @weixin_message,
4
- # @weixin_public_account(token_model instance if you setup, otherwise return nil)
5
9
  def reply
6
10
  render xml: send("response_#{@weixin_message.MsgType}_message", {})
7
11
  end
@@ -9,30 +13,92 @@ WeixinRailsMiddleware::WeixinController.class_eval do
9
13
  private
10
14
 
11
15
  def response_text_message(options={})
12
- reply_text_message("Your Message: #{@weixin_message.Content}")
16
+ reply_text_message("Your Message: #{@keyword}")
13
17
  end
14
18
 
19
+ # <Location_X>23.134521</Location_X>
20
+ # <Location_Y>113.358803</Location_Y>
21
+ # <Scale>20</Scale>
22
+ # <Label><![CDATA[位置信息]]></Label>
15
23
  def response_location_message(options={})
16
- reply_text_message("Your Location: #{@weixin_message.Location_X}, #{@weixin_message.Location_Y}")
24
+ @lx = @weixin_message.Location_X
25
+ @ly = @weixin_message.Location_Y
26
+ @scale = @weixin_message.Scale
27
+ @label = @weixin_message.Label
28
+ reply_text_message("Your Location: #{@lx}, #{@ly}, #{@scale}, #{@label}")
17
29
  end
18
30
 
31
+ # <PicUrl><![CDATA[this is a url]]></PicUrl>
32
+ # <MediaId><![CDATA[media_id]]></MediaId>
19
33
  def response_image_message(options={})
20
- # image message handler
34
+ @pic_url = @weixin_message.PicUrl
35
+ @media_id = @weixin_message.MediaId # 可以调用多媒体文件下载接口拉取数据。
36
+ reply_text_message("回复图片信息")
21
37
  end
22
38
 
39
+ # <Title><![CDATA[公众平台官网链接]]></Title>
40
+ # <Description><![CDATA[公众平台官网链接]]></Description>
41
+ # <Url><![CDATA[url]]></Url>
23
42
  def response_link_message(options={})
24
- # link message handler
43
+ @title = @weixin_message.Title
44
+ @desc = @weixin_message.Description
45
+ @url = @weixin_message.Url
46
+ reply_text_message("回复链接信息")
25
47
  end
26
48
 
27
49
  def response_event_message(options={})
28
- # event messge handler
50
+ event_type = @weixin_message.Event
51
+ case event_type
52
+ when "subscribe" # 关注公众账号
53
+ if @keyword.present?
54
+ # 扫描带参数二维码事件: 1. 用户未关注时,进行关注后的事件推送
55
+ reply_text_message("扫描带参数二维码事件: 1. 用户未关注时,进行关注后的事件推送, keyword: #{@keyword}")
56
+ end
57
+ reply_text_message("关注公众账号")
58
+ when "unsubscribe" # 取消关注
59
+ reply_text_message("取消关注")
60
+ when "SCAN" # 扫描带参数二维码事件: 2用户已关注时的事件推送
61
+ reply_text_message("扫描带参数二维码事件: 2用户已关注时的事件推送, keyword: #{@keyword}")
62
+ when "LOCATION" # 上报地理位置事件
63
+ @lat = @weixin_message.Latitude
64
+ @lgt = @weixin_message.Longitude
65
+ @precision = @weixin_message.Precision
66
+ reply_text_message("Your Location: #{@lat}, #{@lgt}, #{@precision}")
67
+ when "CLICK" # 点击菜单拉取消息时的事件推送
68
+ reply_text_message("你点击了: #{@keyword}")
69
+ when "VIEW" # 点击菜单跳转链接时的事件推送
70
+ reply_text_message("你点击了: #{@keyword}")
71
+ else
72
+ reply_text_message("处理无法识别的事件")
73
+ end
74
+
29
75
  end
30
76
 
77
+ # <MediaId><![CDATA[media_id]]></MediaId>
78
+ # <Format><![CDATA[Format]]></Format>
31
79
  def response_voice_message(options={})
32
- # voice message handler
80
+ @media_id = @weixin_message.MediaId # 可以调用多媒体文件下载接口拉取数据。
81
+ @format = @weixin_message.format
82
+ reply_text_message("回复语音信息: #{@keyword}")
33
83
  end
34
84
 
85
+ # <MediaId><![CDATA[media_id]]></MediaId>
86
+ # <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
35
87
  def response_video_message(options={})
36
- # video message handler
88
+ @media_id = @weixin_message.MediaId # 可以调用多媒体文件下载接口拉取数据。
89
+ # 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
90
+ @thumb_media_id = @weixin_message.ThumbMediaId
91
+ reply_text_message("回复视频信息")
92
+ end
93
+
94
+ def set_keyword
95
+ @keyword = @weixin_message.Content || # 文本消息
96
+ @weixin_message.EventKey || # 事件推送
97
+ @weixin_message.Recognition # 接收语音识别结果
98
+ end
99
+
100
+ # http://apidock.com/rails/ActionController/Base/default_url_options
101
+ def default_url_options(options={})
102
+ { weichat_id: @weixin_message.FromUserName }
37
103
  end
38
104
  end
@@ -8,7 +8,7 @@ module WeixinRailsMiddleware
8
8
  desc 'Creates a WeixinRailsMiddleware initializer for your application.'
9
9
 
10
10
  def install
11
- route 'mount WeixinRailsMiddleware::Engine, at: WeixinRailsMiddleware.config.engine_path'
11
+ route 'mount WeixinRailsMiddleware::Engine, at: "/"'
12
12
  end
13
13
 
14
14
  def copy_initializer
@@ -9,7 +9,6 @@ require "weixin_rails_middleware/helpers/weixin_authorize_helper"
9
9
  module WeixinRailsMiddleware
10
10
 
11
11
  DEFAULT_TOKEN_COLUMN_NAME = "weixin_token".freeze
12
- DEFAULT_ENGINE_PATH = "/".freeze
13
12
  DEFAULT_WEIXIN_SECRET_KEY = "weixin_secret_key".freeze
14
13
 
15
14
  end
@@ -18,20 +18,12 @@ module WeixinRailsMiddleware
18
18
  # use 'public_account_class': if the token is saved in SomeModel, then find token by it
19
19
  # use 'weixin_token': if the token is a String, just use it,
20
20
  attr_accessor :public_account_class, :weixin_token_string, :weixin_secret_string
21
- attr_accessor :engine_path
22
-
23
- def initialize
24
- @engine_path = DEFAULT_ENGINE_PATH
25
- end
26
21
 
27
22
  end
28
23
 
29
24
  module ConfigurationHelpers
30
25
  extend ActiveSupport::Concern
31
26
 
32
- def engine_path
33
- @engine_path ||= WeixinRailsMiddleware.config.engine_path
34
- end
35
27
 
36
28
  def weixin_token_string
37
29
  @weixin_token_string ||= WeixinRailsMiddleware.config.weixin_token_string.to_s
@@ -45,10 +37,6 @@ module WeixinRailsMiddleware
45
37
  @weixin_secret_string ||= WeixinRailsMiddleware.config.weixin_secret_string.to_s
46
38
  end
47
39
 
48
- def is_default_engine_path?
49
- engine_path == DEFAULT_ENGINE_PATH # "/"
50
- end
51
-
52
40
  def token_model_class
53
41
  if token_model.blank?
54
42
  raise "You need to config `public_account_class` in 'config/initializers/weixin_rails_middleware.rb'"
@@ -5,34 +5,49 @@ module WeixinRailsMiddleware
5
5
  protected
6
6
 
7
7
  def check_weixin_params
8
- if is_weixin_secret_key_valid? && is_signature_invalid?
9
- render text: "Forbidden", status: 403
10
- end
11
- end
12
8
 
13
- # check the token from Weixin Service is exist in local store.
14
- def is_weixin_secret_key_valid?
15
- if weixin_token_string.blank?
16
- if current_weixin_public_account.blank?
17
- render text: "Forbidden", status: 403
9
+ # if config weixin token string
10
+ if weixin_token_string.present?
11
+ if !is_weixin_secret_string_valid?
12
+ puts "WeixinSecretStringNotMatch"
13
+ render text: "WeixinSecretStringNotMatch", status: 403
18
14
  return false
19
15
  end
16
+ # if use database to store public_account
20
17
  else
21
- if current_weixin_secret_key != weixin_secret_string
22
- render text: "Forbidden", status: 403
18
+ if !is_weixin_secret_key_valid?
19
+ puts "RecordNotFound"
20
+ render text: "RecordNotFound - Couldn't find #{token_model} with weixin_secret_key=#{current_weixin_secret_key} ", status: 404
23
21
  return false
24
22
  end
25
23
  end
24
+
25
+ if !is_signature_valid?
26
+ puts "WeixinSignatureNotMatch"
27
+ render text: "WeixinSignatureNotMatch", status: 403
28
+ return false
29
+ end
26
30
  true
27
31
  end
28
32
 
29
- def is_signature_invalid?
33
+ # check the token from Weixin Service is exist in local store.
34
+ def is_weixin_secret_key_valid?
35
+ if weixin_token_string.blank?
36
+ current_weixin_public_account.present?
37
+ end
38
+ end
39
+
40
+ def is_weixin_secret_string_valid?
41
+ current_weixin_secret_key == weixin_secret_string
42
+ end
43
+
44
+ def is_signature_valid?
30
45
  signature = params[:signature] || ''
31
46
  timestamp = params[:timestamp] || ''
32
47
  nonce = params[:nonce] || ''
33
48
  sort_params = [current_weixin_token, timestamp, nonce].sort.join
34
49
  current_signature = Digest::SHA1.hexdigest(sort_params)
35
- return true if current_signature != signature
50
+ return true if current_signature == signature
36
51
  false
37
52
  end
38
53
 
@@ -1,3 +1,3 @@
1
1
  module WeixinRailsMiddleware
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weixin_rails_middleware
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.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-22 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties