eric_weixin 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +6 -1
- data/app/assets/javascripts/eric_weixin/application.js +1 -0
- data/app/assets/javascripts/eric_weixin/cms/base.js +6 -5
- data/app/controllers/eric_weixin/application_controller.rb +98 -0
- data/app/controllers/eric_weixin/cms/base_controller.rb +1 -1
- data/app/controllers/eric_weixin/cms/weixin/media_articles_controller.rb +73 -0
- data/app/controllers/eric_weixin/cms/weixin/media_news_controller.rb +175 -0
- data/app/controllers/eric_weixin/cms/weixin/media_resources_controller.rb +68 -0
- data/app/controllers/eric_weixin/wz/pays_controller.rb +15 -0
- data/app/controllers/eric_weixin/wz/weixin_controller.rb +2 -2
- data/app/helpers/eric_weixin/application_helper.rb +6 -0
- data/app/helpers/eric_weixin/cms/weixin/public_accounts_helper.rb +3 -3
- data/app/models/eric_weixin/access_token.rb +1 -0
- data/app/models/eric_weixin/media_article.rb +53 -0
- data/app/models/eric_weixin/media_article_news.rb +6 -0
- data/app/models/eric_weixin/media_news.rb +216 -0
- data/app/models/eric_weixin/media_resource.rb +172 -0
- data/app/models/eric_weixin/public_account.rb +9 -0
- data/app/views/eric_weixin/cms/weixin/media_articles/_media_article.html.erb +131 -0
- data/app/views/eric_weixin/cms/weixin/media_articles/_select_pic.html.erb +78 -0
- data/app/views/eric_weixin/cms/weixin/media_articles/edit.html.erb +4 -0
- data/app/views/eric_weixin/cms/weixin/media_articles/index.html.erb +31 -0
- data/app/views/eric_weixin/cms/weixin/media_articles/new.html.erb +15 -0
- data/app/views/eric_weixin/cms/weixin/media_news/_select_article.html.erb +90 -0
- data/app/views/eric_weixin/cms/weixin/media_news/_select_user.html.erb +8 -0
- data/app/views/eric_weixin/cms/weixin/media_news/_will_send_article.html.erb +53 -0
- data/app/views/eric_weixin/cms/weixin/media_news/new.html.erb +284 -0
- data/app/views/eric_weixin/cms/weixin/media_resources/_media_resource.html.erb +62 -0
- data/app/views/eric_weixin/cms/weixin/media_resources/edit.html.erb +20 -0
- data/app/views/eric_weixin/cms/weixin/media_resources/index.html.erb +49 -0
- data/app/views/eric_weixin/cms/weixin/media_resources/new.html.erb +4 -0
- data/app/views/eric_weixin/cms/weixin/url_encodes/_new.html.erb +6 -6
- data/app/views/eric_weixin/wz/pays/pay_fail.html.erb +2 -0
- data/app/views/eric_weixin/wz/pays/pay_ok.html.erb +2 -0
- data/app/views/eric_weixin/wz/pays/prepay.html.erb +49 -0
- data/app/views/layouts/eric_weixin/cms/base.html.erb +1 -1
- data/app/views/layouts/eric_weixin/wz/pays.html.erb +11 -0
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/inflections.rb +19 -0
- data/config/routes.rb +20 -6
- data/config/tinymce.yml +11 -0
- data/db/migrate/20150813080541_add_mch_id_to_weixin_public_accounts.rb +5 -0
- data/db/migrate/20150817105643_alert_weixin_reply_message_rules_s_reply_message_length.rb +5 -0
- data/db/migrate/20150817143407_add_mch_key_to_weixin_public_account.rb +5 -0
- data/db/migrate/20150818090435_create_weixin_media_resources.rb +13 -0
- data/db/migrate/20150818094553_create_weixin_media_articles.rb +17 -0
- data/db/migrate/20150818095654_create_weixin_media_news.rb +18 -0
- data/db/migrate/20150818100348_create_weixin_media_articles_news.rb +11 -0
- data/db/migrate/20150904045253_add_host_name_to_public_account.rb +5 -0
- data/lib/eric_weixin.rb +2 -0
- data/lib/eric_weixin/modules/ip.rb +2 -0
- data/lib/eric_weixin/modules/pay.rb +31 -0
- data/lib/eric_weixin/version.rb +1 -1
- metadata +38 -2
@@ -0,0 +1,15 @@
|
|
1
|
+
class EricWeixin::Wz::PaysController < ApplicationController
|
2
|
+
|
3
|
+
def prepay
|
4
|
+
@prepay_id = ::EricWeixin::Pay.generate_prepay_id params
|
5
|
+
end
|
6
|
+
|
7
|
+
def pay_ok
|
8
|
+
render text: '您支付成功,谢谢。'
|
9
|
+
end
|
10
|
+
|
11
|
+
def pay_fail
|
12
|
+
render text: '您支付失败,请返回重新尝试,谢谢。'
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -12,8 +12,8 @@ module EricWeixin
|
|
12
12
|
def reply
|
13
13
|
request_body = request.body.read
|
14
14
|
public_account = PublicAccount.find_by_weixin_app_id params[:app_id]
|
15
|
-
BusinessException.raise 'ip不正确' unless Ip.is_ip_exist? public_account_id: public_account.id,
|
16
|
-
|
15
|
+
# BusinessException.raise 'ip不正确' unless Ip.is_ip_exist? public_account_id: public_account.id,
|
16
|
+
# ip: get_ip
|
17
17
|
"message from wechat: ".to_logger
|
18
18
|
request_body.to_logger
|
19
19
|
weixin_message = MultiXml.parse(request_body).deep_symbolize_keys[:xml]
|
@@ -1,4 +1,10 @@
|
|
1
1
|
module EricWeixin
|
2
2
|
module ApplicationHelper
|
3
|
+
def get_show_value default_value, options
|
4
|
+
return options[:v1] unless options[:v1].blank?
|
5
|
+
return options[:v2] unless options[:v2].blank?
|
6
|
+
return options[:v3] unless options[:v3].blank?
|
7
|
+
default_value||''
|
8
|
+
end
|
3
9
|
end
|
4
10
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module EricWeixin::Cms::Weixin::PublicAccountsHelper
|
2
2
|
def weixin_menu_show_tag json
|
3
|
-
puts "****"*300
|
4
|
-
puts json.class
|
5
|
-
puts "****"*300
|
3
|
+
# puts "****"*300
|
4
|
+
# puts json.class
|
5
|
+
# puts "****"*300
|
6
6
|
return '<h6>还没有任何菜单哦!</h6>' if json.blank? || json == "null"
|
7
7
|
result = '<table border="1" style="word-break:break-all;"><thead><th width="140">button name</th><th width="140">sub_button name</th><th width="60">type</th><th width="150">key</th><th>url</th></thead><tbody>'
|
8
8
|
obj = JSON.parse json
|
@@ -52,6 +52,7 @@ module EricWeixin
|
|
52
52
|
# * public_account_id #公众账号 ID
|
53
53
|
# ===调用示例
|
54
54
|
# ::EricWeixin::AccessToken.get_new_token '5e3b98ca0000959946657212739fd535'
|
55
|
+
# https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=12&secret=23
|
55
56
|
def self.get_new_token public_account_id
|
56
57
|
account = ::EricWeixin::PublicAccount.find_by_id public_account_id
|
57
58
|
BusinessException.raise 'account 不存在' if account.blank?
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class EricWeixin::MediaArticle < ActiveRecord::Base
|
2
|
+
self.table_name = 'weixin_media_articles'
|
3
|
+
has_many :media_article_news, foreign_key: 'weixin_media_article_id'
|
4
|
+
has_many :media_news, through: :media_article_news
|
5
|
+
|
6
|
+
belongs_to :media_resource, foreign_key: 'thumb_media_id'
|
7
|
+
|
8
|
+
validates_presence_of :thumb_media_id, message: '缩略图必须有。'
|
9
|
+
validates_presence_of :title, message: '标题不能为空。'
|
10
|
+
validates :title, length: { maximum: 64, message: "标题最长为64" }
|
11
|
+
validates :author, length: { maximum: 8, message: "作者字数最大为8"}
|
12
|
+
validates :digest, length: { maximum: 120, message: "摘要字数最大为120" }
|
13
|
+
|
14
|
+
|
15
|
+
def self.create_media_article options
|
16
|
+
options = get_arguments_options options, [:tag, :thumb_media_id, :author, :title,
|
17
|
+
:digest, :show_cover_pic, :is_first_article,
|
18
|
+
:content, :content_source_url, :public_account_id],
|
19
|
+
show_cover_pic: true, is_first_article: false
|
20
|
+
transaction do
|
21
|
+
media_article = ::EricWeixin::MediaArticle.new options
|
22
|
+
media_article.save!
|
23
|
+
media_article
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def update_media_article options
|
28
|
+
options = EricWeixin::MediaArticle.get_arguments_options options, [:tag, :thumb_media_id, :author, :title,
|
29
|
+
:digest, :show_cover_pic, :is_first_article,
|
30
|
+
:content, :content_source_url, :public_account_id]
|
31
|
+
EricWeixin::MediaArticle.transaction do
|
32
|
+
self.update! options
|
33
|
+
self
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.common_query options
|
38
|
+
articles = self.all
|
39
|
+
articles = articles.where(public_account_id: options[:public_account_id]) unless options[:public_account_id].blank?
|
40
|
+
articles = articles.where("weixin_media_articles.tag like ?", "%#{options[:tag]}%") unless options[:tag].blank?
|
41
|
+
unless options[:start_date].blank?
|
42
|
+
start_date = options[:start_date].to_time
|
43
|
+
start_date = start_date.change(hour: 0, min:0, sec:0)
|
44
|
+
articles = articles.where("weixin_media_articles.created_at >= ?", start_date)
|
45
|
+
end
|
46
|
+
unless options[:end_date].blank?
|
47
|
+
end_date = options[:end_date].to_time
|
48
|
+
end_date = end_date.change(hour: 23, min:59, sec:59)
|
49
|
+
articles = articles.where("weixin_media_articles.created_at <= ?", end_date)
|
50
|
+
end
|
51
|
+
articles
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
class EricWeixin::MediaNews < ActiveRecord::Base
|
2
|
+
self.table_name = 'weixin_media_news'
|
3
|
+
has_many :media_article_news, foreign_key: 'weixin_media_news_id'
|
4
|
+
has_many :media_articles, through: :media_article_news
|
5
|
+
# def upload_news_old
|
6
|
+
#
|
7
|
+
# EricWeixin::MediaNews.transaction do
|
8
|
+
# h = {"articles" => []}
|
9
|
+
# pp "************* 图文 **************"
|
10
|
+
# pp self
|
11
|
+
# pp "************** 该图文包含的文章 *******************"
|
12
|
+
# pp self.media_articles
|
13
|
+
# self.media_articles.each do |article|
|
14
|
+
# article_hash = {
|
15
|
+
# "title" => article.title,
|
16
|
+
# "thumb_media_id" => article.media_resource.media_id,
|
17
|
+
# "author" => article.author,
|
18
|
+
# "content_source_url" => article.content_source_url,
|
19
|
+
# "content" => CGI::escape(article.content).force_encoding("UTF-8"),
|
20
|
+
# "digest" => article.digest,
|
21
|
+
# "show_cover_pic" => if article.show_cover_pic then 1 else 0 end
|
22
|
+
# }
|
23
|
+
# pp "*************** 文章内容 **********************"
|
24
|
+
# pp article_hash
|
25
|
+
# h["articles"] << article_hash
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: self.public_account_id
|
29
|
+
# url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=#{token}"
|
30
|
+
# response = RestClient.post url, CGI::unescape(h.to_json)
|
31
|
+
# pp "********************* 上传该图文 **********************"
|
32
|
+
# pp response
|
33
|
+
# response_json = JSON.parse(response)
|
34
|
+
# BusinessException.raise response_json["errmsg"] unless response_json["errmsg"].blank?
|
35
|
+
# self.media_id = response_json["media_id"]
|
36
|
+
# self.save!
|
37
|
+
# self.reload
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
|
41
|
+
def upload_news
|
42
|
+
EricWeixin::MediaNews.transaction do
|
43
|
+
h = {"articles" => []}
|
44
|
+
pp "************* 图文 **************"
|
45
|
+
pp self
|
46
|
+
pp "************** 该图文包含的文章 *******************"
|
47
|
+
pp self.media_articles
|
48
|
+
self.media_articles.each do |article|
|
49
|
+
article_hash = {
|
50
|
+
"title" => article.title,
|
51
|
+
"thumb_media_id" => article.media_resource.media_id,
|
52
|
+
"author" => article.author,
|
53
|
+
"content_source_url" => article.content_source_url,
|
54
|
+
"content" => CGI::escape(article.content.gsub("\"","'")),
|
55
|
+
"digest" => article.digest,
|
56
|
+
"show_cover_pic" => if article.show_cover_pic then 1 else 0 end
|
57
|
+
}
|
58
|
+
pp "*************** 文章内容 **********************"
|
59
|
+
pp article_hash
|
60
|
+
h["articles"] << article_hash
|
61
|
+
end
|
62
|
+
|
63
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: self.public_account_id
|
64
|
+
url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=#{token}"
|
65
|
+
pp "***************************** CGI::unescape(h.to_json) ********************************"
|
66
|
+
pp CGI::unescape(h.to_json)
|
67
|
+
response = RestClient.post url, CGI::unescape(h.to_json)
|
68
|
+
pp "********************* 上传该图文 **********************"
|
69
|
+
pp response
|
70
|
+
response_json = JSON.parse(response)
|
71
|
+
BusinessException.raise response_json.to_s if response_json["media_id"].blank?
|
72
|
+
self.media_id = response_json["media_id"]
|
73
|
+
self.save!
|
74
|
+
self.reload
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def delete_server_news
|
79
|
+
EricWeixin::MediaNews.transaction do
|
80
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: self.public_account_id
|
81
|
+
url = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=#{token}"
|
82
|
+
|
83
|
+
response = RestClient.post url, { "media_id" => self.media_id }.to_json
|
84
|
+
pp "****************** 删除该图文 ***********************"
|
85
|
+
pp response
|
86
|
+
pp JSON.parse(response)["errcode"].class
|
87
|
+
response_json = JSON.parse(response)
|
88
|
+
BusinessException.raise response_json["errmsg"] unless response_json["errcode"] == 0
|
89
|
+
self.media_id = nil
|
90
|
+
self.save!
|
91
|
+
self.reload
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.try_send_media_news
|
96
|
+
not_send_media_news = self.where(status: 0)
|
97
|
+
not_send_media_news.each do |news|
|
98
|
+
next if news.planned_send_time.blank?
|
99
|
+
news.send_to_openids if news.planned_send_time <= Time.now
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def send_to_openids
|
104
|
+
BusinessException.raise '' if self.media_id.blank?
|
105
|
+
EricWeixin::MediaNews.transaction do
|
106
|
+
openids = ::Weixin::Process.__send__ self.user_group_name
|
107
|
+
pp "****************** 将要发送的openids *********************"
|
108
|
+
pp openids
|
109
|
+
1.upto(100000).each do |i|
|
110
|
+
start_number = i*10000 - 10000
|
111
|
+
end_number = i*10000-1
|
112
|
+
needopenids = openids[start_number..end_number]
|
113
|
+
break if needopenids.blank?
|
114
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: self.public_account_id
|
115
|
+
url = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=#{token}"
|
116
|
+
data = {
|
117
|
+
"touser" => needopenids,
|
118
|
+
"mpnews" => {"media_id" => self.media_id},
|
119
|
+
"msgtype" => "mpnews"
|
120
|
+
}
|
121
|
+
pp "************************* 群发的参数 *******************************"
|
122
|
+
pp data
|
123
|
+
response = RestClient.post url, data.to_json
|
124
|
+
pp "******************* 群发的结果 ******************************"
|
125
|
+
pp response
|
126
|
+
response_json = JSON.parse(response)
|
127
|
+
BusinessException.raise response_json["errmsg"] unless response_json["errcode"] == 0
|
128
|
+
end
|
129
|
+
self.status = 1
|
130
|
+
self.save!
|
131
|
+
self.reload
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def preview openid
|
136
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: self.public_account_id
|
137
|
+
url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=#{token}"
|
138
|
+
response = RestClient.post url, {
|
139
|
+
"touser" => openid,
|
140
|
+
"mpnews" => {"media_id" => self.media_id},
|
141
|
+
"msgtype" => "mpnews"
|
142
|
+
}.to_json
|
143
|
+
pp "********************* 预览结果 ****************************"
|
144
|
+
pp response
|
145
|
+
response_json = JSON.parse(response)
|
146
|
+
BusinessException.raise response_json["errmsg"] unless response_json["errcode"] == 0
|
147
|
+
end
|
148
|
+
|
149
|
+
# will_send_article_msg: will_send_article_msg,
|
150
|
+
# user_group_name: user_group_name,
|
151
|
+
# send_at_fixed_time: send_at_fixed_time,
|
152
|
+
# send_fixed_date: send_fixed_date,
|
153
|
+
# send_fixed_time: send_fixed_time,
|
154
|
+
# send_save_to_history: send_save_to_history
|
155
|
+
def self.save_news options
|
156
|
+
options = get_arguments_options options, [:will_send_article_msg, :user_group_name,
|
157
|
+
:send_at_fixed_time, :send_fixed_date,
|
158
|
+
:send_fixed_time, :send_save_to_history,
|
159
|
+
:public_account_id]
|
160
|
+
transaction do
|
161
|
+
news = new
|
162
|
+
if options[:send_at_fixed_time] == 'true'
|
163
|
+
news.planned_send_time = "#{options[:send_fixed_date]} #{options[:send_fixed_time]}"
|
164
|
+
end
|
165
|
+
news.user_group_name = options[:user_group_name]
|
166
|
+
news.status = 0
|
167
|
+
news.public_account_id = options[:public_account_id]
|
168
|
+
news.save!
|
169
|
+
article_ids = options[:will_send_article_msg].split(',')
|
170
|
+
article_ids.each_with_index do |id, index|
|
171
|
+
a_n = ::EricWeixin::MediaArticleNews.new
|
172
|
+
a_n.sort = index
|
173
|
+
article = ::EricWeixin::MediaArticle.find_by_id(id)
|
174
|
+
a_n.media_article = article
|
175
|
+
a_n.media_news = news
|
176
|
+
a_n.save!
|
177
|
+
end
|
178
|
+
news.upload_news
|
179
|
+
news
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def update_news options
|
184
|
+
options = ::EricWeixin::MediaNews.get_arguments_options options, [:will_send_article_msg, :user_group_name,
|
185
|
+
:send_at_fixed_time, :send_fixed_date,
|
186
|
+
:send_fixed_time, :send_save_to_history,
|
187
|
+
:public_account_id]
|
188
|
+
::EricWeixin::MediaNews.transaction do
|
189
|
+
news = self
|
190
|
+
if options[:send_at_fixed_time] == 'true'
|
191
|
+
news.planned_send_time = "#{options[:send_fixed_date]} #{options[:send_fixed_time]}"
|
192
|
+
end
|
193
|
+
news.user_group_name = options[:user_group_name]
|
194
|
+
news.public_account_id = options[:public_account_id]
|
195
|
+
news.save!
|
196
|
+
|
197
|
+
# 清空图文与文章的关联
|
198
|
+
news.media_articles = []
|
199
|
+
|
200
|
+
article_ids = options[:will_send_article_msg].split(',')
|
201
|
+
article_ids.each_with_index do |id, index|
|
202
|
+
a_n = ::EricWeixin::MediaArticleNews.new
|
203
|
+
a_n.sort = index
|
204
|
+
article = ::EricWeixin::MediaArticle.find_by_id(id)
|
205
|
+
a_n.media_article = article
|
206
|
+
a_n.media_news = news
|
207
|
+
a_n.save!
|
208
|
+
end
|
209
|
+
news.reload
|
210
|
+
news.delete_server_news
|
211
|
+
news.upload_news
|
212
|
+
news
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
class EricWeixin::MediaResource < ActiveRecord::Base
|
2
|
+
|
3
|
+
self.table_name = 'weixin_media_resources'
|
4
|
+
|
5
|
+
has_many :media_articles, foreign_key: 'thumb_media_id'
|
6
|
+
|
7
|
+
RESOURCE_TYPE = {
|
8
|
+
'pic_in_article' => '文章内图片',
|
9
|
+
'thumbnail' => '缩略图',
|
10
|
+
'audio' => '音频',
|
11
|
+
'video' => '视频'
|
12
|
+
}
|
13
|
+
|
14
|
+
#保存图文内图片
|
15
|
+
# ===参数说明
|
16
|
+
# * public_account_id 需要处理的公众账号
|
17
|
+
# * pic 图片
|
18
|
+
# * tags 标签
|
19
|
+
# ===调用示例
|
20
|
+
#
|
21
|
+
# ::EricWeixin::MediaResource.save_pic_in_article pic: File.read('/Users/ericliu/Pictures/1.pic.jpg'),
|
22
|
+
# tags: 'test',
|
23
|
+
# public_account_id: 1
|
24
|
+
# #
|
25
|
+
def self.save_pic_in_article options, file
|
26
|
+
pic_in_article_path = '/uploads/wechat_pic/file_in_content/'
|
27
|
+
unless Dir.exist? Rails.root.join("public").to_s + pic_in_article_path
|
28
|
+
BusinessException.raise "请创建目录#{ Rails.root.join("public").to_s + pic_in_article_path}"
|
29
|
+
end
|
30
|
+
EricWeixin::MediaResource.transaction do
|
31
|
+
# pp options[:pic].methods
|
32
|
+
resource = EricWeixin::MediaResource.new tags: options[:tags],
|
33
|
+
category_name: 'pic_in_article',
|
34
|
+
public_account_id: options[:public_account_id]
|
35
|
+
resource.save!
|
36
|
+
|
37
|
+
|
38
|
+
file_name = "#{EricTools.uuid}-#{file.original_filename}"
|
39
|
+
origin_name_with_path = Rails.root.join("public#{pic_in_article_path}", file_name)
|
40
|
+
File.open(origin_name_with_path, 'wb') do |f|
|
41
|
+
f.write(file.read)
|
42
|
+
end
|
43
|
+
|
44
|
+
url = EricWeixin::MediaResource.upload_pic_in_article pic: File.new(origin_name_with_path),
|
45
|
+
public_account_id: options[:public_account_id]
|
46
|
+
|
47
|
+
resource.wechat_link = url
|
48
|
+
resource.local_link = "#{pic_in_article_path}#{file_name}"
|
49
|
+
resource.save!
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# 上传图文内图片.
|
56
|
+
# ===参数说明
|
57
|
+
# * pic 图片文件。
|
58
|
+
# * public_account_id 公众账号id
|
59
|
+
# ===调用示例
|
60
|
+
# ::EricWeixin::MediaResource.upload_pic_in_article pic: File.new('/Users/ericliu/Pictures/1.pic.jpg'),
|
61
|
+
# public_account_id: 1
|
62
|
+
def self.upload_pic_in_article options
|
63
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: options[:public_account_id]
|
64
|
+
url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=#{token}"
|
65
|
+
response = RestClient.post url, :media => options[:pic]
|
66
|
+
response_json = JSON.parse(response)
|
67
|
+
url = response_json["url"]
|
68
|
+
BusinessException.raise response_json["errmsg"] if url.blank?
|
69
|
+
url
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
#保存图文内图片
|
74
|
+
# ===参数说明
|
75
|
+
# * public_account_id 需要处理的公众账号
|
76
|
+
# * media 资源
|
77
|
+
# * tags 标签
|
78
|
+
# * type 资源类型
|
79
|
+
# ===调用示例
|
80
|
+
#
|
81
|
+
# ::EricWeixin::MediaResource.save_media media: File.new('/Users/ericliu/Pictures/1.pic.jpg'),
|
82
|
+
# tags: 'test',
|
83
|
+
# public_account_id: 1,
|
84
|
+
# type: xx
|
85
|
+
# #
|
86
|
+
def self.save_media options, file
|
87
|
+
BusinessException.raise "媒体类型不正确" unless EricWeixin::MediaResource::RESOURCE_TYPE.keys.include?(options[:type])
|
88
|
+
file_path = "/uploads/wechat_pic/#{options[:type]}/"
|
89
|
+
unless Dir.exist? Rails.root.join("public").to_s + file_path
|
90
|
+
BusinessException.raise "请创建目录#{ Rails.root.join("public").to_s + file_path}"
|
91
|
+
end
|
92
|
+
EricWeixin::MediaResource.transaction do
|
93
|
+
resource = EricWeixin::MediaResource.new tags: options[:tags],
|
94
|
+
category_name: options[:type],
|
95
|
+
public_account_id: options[:public_account_id]
|
96
|
+
resource.save!
|
97
|
+
|
98
|
+
file_name = "#{EricTools.uuid}-#{file.original_filename}"
|
99
|
+
origin_name_with_path = Rails.root.join("public#{file_path}", file_name)
|
100
|
+
File.open(origin_name_with_path, 'wb') do |f|
|
101
|
+
f.write(file.read)
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
json = EricWeixin::MediaResource.upload_media media: File.new(origin_name_with_path),
|
106
|
+
type: case options[:type]
|
107
|
+
when 'thumbnail'
|
108
|
+
'thumb'
|
109
|
+
when 'audio'
|
110
|
+
'voice'
|
111
|
+
when 'video'
|
112
|
+
'video'
|
113
|
+
when 'image'
|
114
|
+
'image'
|
115
|
+
end,
|
116
|
+
public_account_id: options[:public_account_id]
|
117
|
+
url = json["url"]
|
118
|
+
media_id = json["media_id"]
|
119
|
+
resource.local_link = "#{file_path}#{file_name}"
|
120
|
+
resource.wechat_link = url
|
121
|
+
resource.media_id = media_id
|
122
|
+
resource.save!
|
123
|
+
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
# 上传永久性素材.
|
130
|
+
# ===参数说明
|
131
|
+
# * media 图片文件。
|
132
|
+
# * type 素材类型:包含以下:image voice video thumb
|
133
|
+
# * public_account_id 公众账号id
|
134
|
+
# ===调用示例
|
135
|
+
# ::EricWeixin::MediaResource.upload_media media: File.new('/Users/ericliu/Pictures/1.pic.jpg'),
|
136
|
+
# public_account_id: 1,
|
137
|
+
# type: 'image'
|
138
|
+
|
139
|
+
def self.upload_media options
|
140
|
+
BusinessException.raise '资源类型不正确,应该是image voice video thumb 的其中一种' unless ["image", "voice", "video", "thumb"].include? options[:type]
|
141
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: options[:public_account_id]
|
142
|
+
url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=#{token}"
|
143
|
+
|
144
|
+
response = RestClient.post url, :media => options[:media], :type => options[:type]
|
145
|
+
pp response
|
146
|
+
response_json = JSON.parse(response)
|
147
|
+
BusinessException.raise response_json["errmsg"] unless response_json["errmsg"].blank?
|
148
|
+
response_json
|
149
|
+
end
|
150
|
+
|
151
|
+
def delete_server_resource
|
152
|
+
EricWeixin::MediaResource.transaction do
|
153
|
+
token = ::EricWeixin::AccessToken.get_valid_access_token public_account_id: self.public_account_id
|
154
|
+
url = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=#{token}"
|
155
|
+
|
156
|
+
response = RestClient.post url, { "media_id" => self.media_id }.to_json
|
157
|
+
pp "****************** 删除该图文 ***********************"
|
158
|
+
pp response
|
159
|
+
response_json = JSON.parse(response)
|
160
|
+
BusinessException.raise response_json["errmsg"] unless response_json["errcode"] == 0
|
161
|
+
self.media_id = nil
|
162
|
+
self.save!
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def delete_self
|
167
|
+
BusinessException.raise '该资源有其他文章素材引用,不能删除。' unless self.media_articles.blank?
|
168
|
+
self.delete_server_resource
|
169
|
+
self.destroy!
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|