wechat 0.4.0 → 0.4.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: d8fc6b062fba978416473332b7eeb0ebe89a6bfd
4
- data.tar.gz: 5b7c50450e9ca878520825678580aec7f2e7b4f0
3
+ metadata.gz: 15c91eb2d65ed9645ca79ace9245f8b37951dd04
4
+ data.tar.gz: ce52424a06ecbd344c18f4a2113dbf7af9507a9f
5
5
  SHA512:
6
- metadata.gz: 0131981fbcfa43e241ec4151a004ec702185f41641e9a67ad8cf45adf59f9372586409ee0a34f5cc9f3141dd3c44a056fd6c13d906ae3abe8bdb5c171d08bda5
7
- data.tar.gz: 40b6edfe0146f00d27cb41ce14c5dc612892d59569fc1469355ce52245e560893c936ec43b0a159e0838435968720f4f6b00750259c6b940c9b7c998f7383dca
6
+ metadata.gz: 7d7c44d220b7467482271b757dddc50e71f19df8a2d2bde28d6e2d3a3c8f9eaf2cebb70adaa6df73ad9b86c34314f013c0803d3def5cd47dd933e82d1d86408b
7
+ data.tar.gz: 988540c451e81e64e44c2959d46197e420bfe1ed32756e4a15b33b68ad523abf9a32afb50fd9ddeb3e117c98fd6bf16c83eb77b750161976fec40b0dec0f309a
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.4.1 (released at 9/6/2015)
4
+
5
+ * Limit news articles collection to 10, close #5
6
+ * Resolve the conflict with gem "responders" by @seamon #45
7
+
3
8
  ## v0.4.0 (released at 9/5/2015)
4
9
 
5
10
  * Enable the verify SSL for enterprise mode by default, as security is more importent than speed, but still can switch off by configure
data/README.md CHANGED
@@ -154,6 +154,8 @@ Wechat commands:
154
154
  wechat invite_user [USER_ID] # 邀请成员关注
155
155
  wechat material [MEDIA_ID, PATH] # 永久媒体下载
156
156
  wechat material_add [MEDIA_TYPE, PATH] # 永久媒体上传
157
+ wechat material_count # 获取素材总数
158
+ wechat material_delete [MEDIA_ID] # 删除永久素材
157
159
  wechat media [MEDIA_ID, PATH] # 媒体下载
158
160
  wechat media_create [MEDIA_TYPE, PATH] # 媒体上传
159
161
  wechat menu # 当前菜单
@@ -343,9 +345,10 @@ class WechatsController < ApplicationController
343
345
 
344
346
  # 当请求的文字信息内容为'<n>条新闻'时, 使用这个responder处理, 并将n作为第二个参数
345
347
  on :text, with: /^(\d+)条新闻$/ do |request, count|
346
- articles_range = (0... [count.to_i, 10].min)
347
- request.reply.news(articles_range) do |article, i| #回复"articles"
348
- article.item title: "标题#{i}", description:"内容描述#{i}", pic_url: "http://www.baidu.com/img/bdlogo.gif", url:"http://www.baidu.com/"
348
+ # 微信最多显示10条新闻,大于10条将只取前10条
349
+ news = (1..count.to_i).each_with_object([]) { |n, memo| memo << {title: "新闻标题", content: "第#{n}条新闻的内容#{n.hash}"} }
350
+ request.reply.news(news) do |article, n, index| # 回复"articles"
351
+ article.item title: "#{index} #{n[:title]}", description: n[:content], pic_url: "http://www.baidu.com/img/bdlogo.gif", url:"http://www.baidu.com/"
349
352
  end
350
353
  end
351
354
 
data/bin/wechat CHANGED
@@ -165,6 +165,16 @@ HELP
165
165
  puts Helper.with(options).material_add(type, file)
166
166
  end
167
167
 
168
+ desc 'material_delete [MEDIA_ID]', '删除永久素材'
169
+ def material_delete(media_id)
170
+ puts Helper.with(options).material_delete(media_id)
171
+ end
172
+
173
+ desc 'material_count', '获取素材总数'
174
+ def material_count
175
+ puts Helper.with(options).material_count
176
+ end
177
+
168
178
  desc 'message_send [OPENID, TEXT_MESSAGE]', '发送文字消息(仅企业号)'
169
179
  def message_send(openid, text_message)
170
180
  puts Helper.with(options).message_send openid, text_message
@@ -4,7 +4,7 @@ require 'action_controller/wechat_responder'
4
4
 
5
5
  module Wechat
6
6
  autoload :Message, 'wechat/message'
7
- autoload :Responder, 'action_controller/responder'
7
+ autoload :Responder, 'wechat/responder'
8
8
  autoload :Cipher, 'wechat/cipher'
9
9
 
10
10
  class AccessTokenExpiredError < StandardError; end
@@ -75,10 +75,18 @@ module Wechat
75
75
  get 'material/get', params: { media_id: media_id }, base: FILE_BASE, as: :file
76
76
  end
77
77
 
78
+ def material_count
79
+ get 'material/get_materialcount'
80
+ end
81
+
78
82
  def material_add(type, file)
79
83
  post 'material/add_material', { upload: { media: file } }, params: { type: type }, base: FILE_BASE
80
84
  end
81
85
 
86
+ def material_delete(media_id)
87
+ post 'material/del_material', media_id: media_id
88
+ end
89
+
82
90
  def custom_message_send(message)
83
91
  post 'message/custom/send', message.to_json, content_type: :json
84
92
  end
@@ -60,6 +60,10 @@ module Wechat
60
60
  get 'media/get', params: { media_id: media_id }, as: :file
61
61
  end
62
62
 
63
+ def material_count
64
+ get 'material/get_count', params: { agentid: agentid }
65
+ end
66
+
63
67
  def media_create(type, file)
64
68
  post 'media/upload', { upload: { media: file } }, params: { type: type }
65
69
  end
@@ -72,6 +76,10 @@ module Wechat
72
76
  post 'material/add_material', { upload: { media: file } }, params: { type: type, agentid: agentid }
73
77
  end
74
78
 
79
+ def material_delete(media_id)
80
+ get 'material/del', params: { media_id: media_id, agentid: agentid }
81
+ end
82
+
75
83
  def message_send(openid, message)
76
84
  post 'message/send', Message.to(openid).text(message).agent_id(agentid).to_json, content_type: :json
77
85
  end
@@ -94,7 +94,7 @@ module Wechat
94
94
  def news(collection, &block)
95
95
  if block_given?
96
96
  article = ArticleBuilder.new
97
- collection.each { |item| yield(article, item) }
97
+ collection.take(10).each_with_index { |item, index| yield(article, item, index) }
98
98
  items = article.items
99
99
  else
100
100
  items = collection.collect do |item|
@@ -1,4 +1,5 @@
1
1
  require 'English'
2
+ require 'wechat/signature'
2
3
 
3
4
  module Wechat
4
5
  module Responder
@@ -14,11 +15,11 @@ module Wechat
14
15
  attr_accessor :wechat, :token, :corpid, :agentid, :encrypt_mode, :skip_verify_ssl, :encoding_aes_key
15
16
 
16
17
  def on(message_type, with: nil, respond: nil, &block)
17
- fail 'Unknow message type' unless message_type.in? [:text, :image, :voice, :video, :location, :link, :event, :fallback]
18
+ fail 'Unknow message type' unless [:text, :image, :voice, :video, :location, :link, :event, :fallback].include?(message_type)
18
19
  config = respond.nil? ? {} : { respond: respond }
19
20
  config.merge!(proc: block) if block_given?
20
21
 
21
- if with.present? && !message_type.in?([:text, :event])
22
+ if with.present? && ![:text, :event].include?(message_type)
22
23
  fail 'Only text and event message can take :with parameters'
23
24
  else
24
25
  config.merge!(with: with) if with.present?
@@ -104,22 +105,14 @@ module Wechat
104
105
  def verify_signature
105
106
  signature = params[:signature] || params[:msg_signature]
106
107
 
107
- render text: 'Forbidden', status: 403 if signature != Digest::SHA1.hexdigest(content_to_verify)
108
- end
109
-
110
- def content_to_verify
111
- array = [self.class.token, params[:timestamp], params[:nonce]]
108
+ msg_encrypt = params[:echostr] if self.class.corpid.present?
112
109
 
113
- # 默认使用明文方式验证, 企业号验证加密签名
114
- if params[:signature].blank? && params[:msg_signature]
115
- if params[:echostr].present?
116
- array << params[:echostr]
117
- else
118
- array << request_encrypt_content
119
- end
120
- end
110
+ msg_encrypt ||= request_encrypt_content if self.class.encrypt_mode
121
111
 
122
- array.compact.collect(&:to_s).sort.join
112
+ render text: 'Forbidden', status: 403 if signature != Signature.hexdigest(self.class.token,
113
+ params[:timestamp],
114
+ params[:nonce],
115
+ msg_encrypt)
123
116
  end
124
117
 
125
118
  def post_xml
@@ -155,7 +148,7 @@ module Wechat
155
148
  def process_response(response)
156
149
  msg = response.to_xml
157
150
 
158
- if self.class.encrypt_mode && request_encrypt_content.present?
151
+ if self.class.encrypt_mode
159
152
  encrypt = Base64.strict_encode64(encrypt(pack(msg, @app_id), self.class.encoding_aes_key))
160
153
  msg = gen_msg(encrypt, params[:timestamp], params[:nonce])
161
154
  end
@@ -164,7 +157,7 @@ module Wechat
164
157
  end
165
158
 
166
159
  def gen_msg(encrypt, timestamp, nonce)
167
- msg_sign = Digest::SHA1.hexdigest [self.class.token, encrypt, timestamp, nonce].compact.collect(&:to_s).sort.join
160
+ msg_sign = Signature.hexdigest(self.class.token, timestamp, nonce, encrypt)
168
161
 
169
162
  { Encrypt: encrypt,
170
163
  MsgSignature: msg_sign,
@@ -0,0 +1,10 @@
1
+ module Wechat
2
+ module Signature
3
+ def self.hexdigest(token, timestamp, nonce, msg_encrypt)
4
+ array = [token, timestamp, nonce]
5
+ array << msg_encrypt unless msg_encrypt.nil?
6
+ dev_msg_signature = array.compact.collect(&:to_s).sort.join
7
+ Digest::SHA1.hexdigest(dev_msg_signature)
8
+ end
9
+ end
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wechat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Skinnyworm
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-09-05 00:00:00.000000000 Z
12
+ date: 2015-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -79,7 +79,6 @@ files:
79
79
  - README.md
80
80
  - Rakefile
81
81
  - bin/wechat
82
- - lib/action_controller/responder.rb
83
82
  - lib/action_controller/wechat_responder.rb
84
83
  - lib/wechat.rb
85
84
  - lib/wechat/access_token.rb
@@ -90,6 +89,8 @@ files:
90
89
  - lib/wechat/corp_api.rb
91
90
  - lib/wechat/jsapi_ticket.rb
92
91
  - lib/wechat/message.rb
92
+ - lib/wechat/responder.rb
93
+ - lib/wechat/signature.rb
93
94
  homepage: https://github.com/Eric-Guo/wechat
94
95
  licenses:
95
96
  - MIT