eric_weixin 0.1.1 → 0.2.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/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
|
+
|