weixin_rails_middleware 1.1.0 → 1.1.1

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 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