qy_wechat 1.0.0.beta1 → 1.0.0
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 +4 -4
- data/app/controllers/qy_wechat/qy_wechat_controller.rb +26 -19
- data/lib/generators/templates/add_qy_wechat_columns.rb +1 -1
- data/lib/generators/templates/qy_wechat_config.rb +5 -2
- data/lib/generators/templates/qy_wechat_controller.rb +5 -0
- data/lib/qy_wechat/configuration.rb +3 -3
- data/lib/qy_wechat/helpers/pkcs7_encoder.rb +2 -0
- data/lib/qy_wechat/helpers/prpcrypt.rb +14 -9
- data/lib/qy_wechat/helpers/reply_message_helper.rb +3 -18
- data/lib/qy_wechat/message/message.rb +0 -5
- data/lib/qy_wechat/message/response_message.rb +0 -2
- data/lib/qy_wechat/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 505125c4235efd523f2774164afcc1c7b7521fc9
|
4
|
+
data.tar.gz: f2dc205a51ea586bc357e90f3df2a7c5bee7b444
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51c856d400d5bdd48e2a62a34f889837ccfb401fba7b27c52f9c177bd128cefa2e60dd87c485431d3284fce9eb4453a943a992b400aa20cc53804ec715132be6
|
7
|
+
data.tar.gz: 71d41f3170e57de76cab0d64a63dff263850e9688b66b5fff27adf06946a47e24b041b5a874b8ff6a57b352dcd7efafb7345fb13942fd5f7c0d3868402f7c1cf
|
@@ -5,15 +5,19 @@ module QyWechat
|
|
5
5
|
include ReplyMessageHelper
|
6
6
|
|
7
7
|
skip_before_filter :verify_authenticity_token, only: :reply
|
8
|
-
|
9
|
-
|
8
|
+
before_filter :setup_qy_app, only: [:verify_url, :reply]
|
9
|
+
before_filter :setup_wechat_message, only: :reply
|
10
10
|
|
11
11
|
# 验证URL有效性
|
12
|
+
# TODO: refactor
|
12
13
|
def verify_url
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
if not valid_msg_signature(params)
|
15
|
+
Rails.logger.debug("#{__FILE__}:#{__LINE__} Failure because signature is invalid")
|
16
|
+
render text: "", status: 401
|
17
|
+
return
|
18
|
+
end
|
19
|
+
content, status = Prpcrypt.decrypt(aes_key, params[:echostr], corp_id)
|
20
|
+
render text: content, status: status
|
17
21
|
end
|
18
22
|
|
19
23
|
def reply;end
|
@@ -21,31 +25,33 @@ module QyWechat
|
|
21
25
|
private
|
22
26
|
|
23
27
|
def setup_wechat_message
|
24
|
-
param_xml
|
25
|
-
hash
|
26
|
-
@body_xml
|
27
|
-
|
28
|
+
param_xml = request.body.read
|
29
|
+
hash = MultiXml.parse(param_xml)['xml']
|
30
|
+
@body_xml = OpenStruct.new(hash)
|
31
|
+
content = Prpcrypt.decrypt(aes_key, @body_xml.Encrypt, corp_id)[0]
|
32
|
+
hash = MultiXml.parse(content)["xml"]
|
28
33
|
@weixin_message = Message.factory(hash)
|
29
|
-
@keyword
|
34
|
+
@keyword = @weixin_message.Content
|
30
35
|
end
|
31
36
|
|
32
37
|
def encoding_aes_key
|
33
|
-
@
|
38
|
+
key = @qy_app.encoding_aes_key
|
39
|
+
raise "长度固定为43个字符" if key.length != 43
|
40
|
+
key
|
34
41
|
end
|
35
42
|
|
36
43
|
def qy_token
|
37
|
-
@
|
44
|
+
@qy_app.qy_token
|
38
45
|
end
|
39
46
|
|
40
47
|
def aes_key
|
41
|
-
Base64.decode64(@
|
48
|
+
Base64.decode64(@qy_app.encoding_aes_key + "=")
|
42
49
|
end
|
43
50
|
|
44
51
|
def corp_id
|
45
|
-
@
|
52
|
+
@qy_app.corp_id
|
46
53
|
end
|
47
54
|
|
48
|
-
# String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
|
49
55
|
def valid_msg_signature(params)
|
50
56
|
timestamp = params[:timestamp]
|
51
57
|
nonce = params[:nonce]
|
@@ -53,12 +59,13 @@ module QyWechat
|
|
53
59
|
msg_signature = params[:msg_signature]
|
54
60
|
sort_params = [qy_token, timestamp, nonce, echo_str].sort.join
|
55
61
|
current_signature = Digest::SHA1.hexdigest(sort_params)
|
56
|
-
Rails.logger.info("current_signature: #{current_signature} "
|
62
|
+
Rails.logger.info("current_signature: #{current_signature} ")
|
57
63
|
current_signature == msg_signature
|
58
64
|
end
|
59
65
|
|
60
|
-
def
|
61
|
-
|
66
|
+
def setup_qy_app
|
67
|
+
qy_secret_key = params.delete(:qy_secret_key)
|
68
|
+
@qy_app ||= QyWechat.qy_model.find_by_qy_secret_key!(qy_secret_key: qy_secret_key)
|
62
69
|
end
|
63
70
|
end
|
64
71
|
end
|
@@ -13,12 +13,12 @@ module QyWechat
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def qy_model_name
|
16
|
-
@qy_model_name ||= QyWechat.config.
|
16
|
+
@qy_model_name ||= QyWechat.config.qy_app
|
17
17
|
end
|
18
18
|
|
19
19
|
def qy_model
|
20
20
|
if qy_model_name.blank?
|
21
|
-
raise "You need to config `
|
21
|
+
raise "You need to config `qy_app` in 'config/initializers/qy_wechat_config.rb'"
|
22
22
|
end
|
23
23
|
@qy_model ||= qy_model_name.to_s.constantize
|
24
24
|
end
|
@@ -26,6 +26,6 @@ module QyWechat
|
|
26
26
|
end
|
27
27
|
|
28
28
|
class Configuration
|
29
|
-
attr_accessor :
|
29
|
+
attr_accessor :qy_app
|
30
30
|
end
|
31
31
|
end
|
@@ -6,16 +6,21 @@ module QyWechat
|
|
6
6
|
# 对密文进行解密.
|
7
7
|
# text 需要解密的密文
|
8
8
|
def decrypt(aes_key, text, corpid)
|
9
|
-
|
10
|
-
text
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
status = 200
|
10
|
+
text = Base64.decode64(text)
|
11
|
+
text = handle_cipher(:decrypt, aes_key, text)
|
12
|
+
result = PKCS7Encoder.decode(text)
|
13
|
+
content = result[16...result.length]
|
14
|
+
len_list = content[0...4].unpack("N")
|
15
|
+
xml_len = len_list[0]
|
16
|
+
xml_content = content[4...4 + xml_len]
|
16
17
|
from_corpid = content[xml_len+4...content.size]
|
17
|
-
|
18
|
-
|
18
|
+
# TODO: refactor
|
19
|
+
if corpid != from_corpid
|
20
|
+
Rails.logger.debug("#{__FILE__}:#{__LINE__} Failure because corpid != from_corpid")
|
21
|
+
status = 401
|
22
|
+
end
|
23
|
+
[xml_content, status]
|
19
24
|
end
|
20
25
|
|
21
26
|
# 加密
|
@@ -1,9 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module QyWechat
|
2
4
|
module ReplyMessageHelper
|
3
5
|
|
4
|
-
# e.g.
|
5
|
-
# generate_text_message(@weixin_message.ToUserName, @weixin_message.FromUserName, "Your Message: #{@weixin_message.Content}")
|
6
|
-
# Or generate_text_message("Your Message: #{@weixin_message.Content}")
|
7
6
|
def generate_text_message(from=nil, to=nil, content)
|
8
7
|
message = TextResponseMessage.new
|
9
8
|
message.FromUserName = from || @weixin_message.ToUserName
|
@@ -21,7 +20,6 @@ module QyWechat
|
|
21
20
|
item
|
22
21
|
end
|
23
22
|
|
24
|
-
# articles = [new_article]
|
25
23
|
def generate_news_message(from=nil, to=nil, articles)
|
26
24
|
message = NewsResponseMessage.new
|
27
25
|
message.FromUserName = from || @weixin_message.ToUserName
|
@@ -39,18 +37,6 @@ module QyWechat
|
|
39
37
|
video
|
40
38
|
end
|
41
39
|
|
42
|
-
# <xml>
|
43
|
-
# <ToUserName><![CDATA[toUser]]></ToUserName>
|
44
|
-
# <FromUserName><![CDATA[fromUser]]></FromUserName>
|
45
|
-
# <CreateTime>12345678</CreateTime>
|
46
|
-
# <MsgType><![CDATA[video]]></MsgType>
|
47
|
-
# <Video>
|
48
|
-
# <MediaId><![CDATA[media_id]]></MediaId>
|
49
|
-
# <Title><![CDATA[title]]></Title>
|
50
|
-
# <Description><![CDATA[description]]></Description>
|
51
|
-
# </Video>
|
52
|
-
# </xml>
|
53
|
-
|
54
40
|
def generate_video_message(from=nil, to=nil, video)
|
55
41
|
message = VideoResponseMessage.new
|
56
42
|
message.FromUserName = from || @weixin_message.ToUserName
|
@@ -100,14 +86,13 @@ module QyWechat
|
|
100
86
|
msg = EncryptMessage.new
|
101
87
|
msg.Encrypt = encrypt_xml
|
102
88
|
msg.TimeStamp = Time.now.to_i.to_s
|
103
|
-
msg.Nonce =
|
89
|
+
msg.Nonce = SecureRandom.hex(8)
|
104
90
|
msg.MsgSignature = generate_msg_signature(encrypt_xml, msg)
|
105
91
|
msg.to_xml
|
106
92
|
end
|
107
93
|
|
108
94
|
# dev_msg_signature=sha1(sort(token、timestamp、nonce、msg_encrypt))
|
109
95
|
# 生成企业签名
|
110
|
-
# $array = array($encrypt_msg, $token, $timestamp, $nonce);
|
111
96
|
def generate_msg_signature(encrypt_msg, msg)
|
112
97
|
sort_params = [encrypt_msg, qy_token, msg.TimeStamp, msg.Nonce].sort.join
|
113
98
|
Digest::SHA1.hexdigest(sort_params)
|
data/lib/qy_wechat/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qy_wechat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lanrion
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
description:
|
83
|
+
description: Ruby on Rails 微信企业版本,应答API集成
|
84
84
|
email:
|
85
85
|
- huaitao-deng@foxmail.com
|
86
86
|
executables: []
|
@@ -121,14 +121,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
121
|
version: '0'
|
122
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
123
|
requirements:
|
124
|
-
- - "
|
124
|
+
- - ">="
|
125
125
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
126
|
+
version: '0'
|
127
127
|
requirements: []
|
128
128
|
rubyforge_project:
|
129
129
|
rubygems_version: 2.2.2
|
130
130
|
signing_key:
|
131
131
|
specification_version: 4
|
132
|
-
summary:
|
132
|
+
summary: Ruby on Rails 微信企业版本
|
133
133
|
test_files: []
|
134
134
|
has_rdoc:
|