wechat 0.4.0 → 0.4.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: 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