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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +6 -1
  3. data/app/assets/javascripts/eric_weixin/application.js +1 -0
  4. data/app/assets/javascripts/eric_weixin/cms/base.js +6 -5
  5. data/app/controllers/eric_weixin/application_controller.rb +98 -0
  6. data/app/controllers/eric_weixin/cms/base_controller.rb +1 -1
  7. data/app/controllers/eric_weixin/cms/weixin/media_articles_controller.rb +73 -0
  8. data/app/controllers/eric_weixin/cms/weixin/media_news_controller.rb +175 -0
  9. data/app/controllers/eric_weixin/cms/weixin/media_resources_controller.rb +68 -0
  10. data/app/controllers/eric_weixin/wz/pays_controller.rb +15 -0
  11. data/app/controllers/eric_weixin/wz/weixin_controller.rb +2 -2
  12. data/app/helpers/eric_weixin/application_helper.rb +6 -0
  13. data/app/helpers/eric_weixin/cms/weixin/public_accounts_helper.rb +3 -3
  14. data/app/models/eric_weixin/access_token.rb +1 -0
  15. data/app/models/eric_weixin/media_article.rb +53 -0
  16. data/app/models/eric_weixin/media_article_news.rb +6 -0
  17. data/app/models/eric_weixin/media_news.rb +216 -0
  18. data/app/models/eric_weixin/media_resource.rb +172 -0
  19. data/app/models/eric_weixin/public_account.rb +9 -0
  20. data/app/views/eric_weixin/cms/weixin/media_articles/_media_article.html.erb +131 -0
  21. data/app/views/eric_weixin/cms/weixin/media_articles/_select_pic.html.erb +78 -0
  22. data/app/views/eric_weixin/cms/weixin/media_articles/edit.html.erb +4 -0
  23. data/app/views/eric_weixin/cms/weixin/media_articles/index.html.erb +31 -0
  24. data/app/views/eric_weixin/cms/weixin/media_articles/new.html.erb +15 -0
  25. data/app/views/eric_weixin/cms/weixin/media_news/_select_article.html.erb +90 -0
  26. data/app/views/eric_weixin/cms/weixin/media_news/_select_user.html.erb +8 -0
  27. data/app/views/eric_weixin/cms/weixin/media_news/_will_send_article.html.erb +53 -0
  28. data/app/views/eric_weixin/cms/weixin/media_news/new.html.erb +284 -0
  29. data/app/views/eric_weixin/cms/weixin/media_resources/_media_resource.html.erb +62 -0
  30. data/app/views/eric_weixin/cms/weixin/media_resources/edit.html.erb +20 -0
  31. data/app/views/eric_weixin/cms/weixin/media_resources/index.html.erb +49 -0
  32. data/app/views/eric_weixin/cms/weixin/media_resources/new.html.erb +4 -0
  33. data/app/views/eric_weixin/cms/weixin/url_encodes/_new.html.erb +6 -6
  34. data/app/views/eric_weixin/wz/pays/pay_fail.html.erb +2 -0
  35. data/app/views/eric_weixin/wz/pays/pay_ok.html.erb +2 -0
  36. data/app/views/eric_weixin/wz/pays/prepay.html.erb +49 -0
  37. data/app/views/layouts/eric_weixin/cms/base.html.erb +1 -1
  38. data/app/views/layouts/eric_weixin/wz/pays.html.erb +11 -0
  39. data/config/initializers/assets.rb +1 -1
  40. data/config/initializers/inflections.rb +19 -0
  41. data/config/routes.rb +20 -6
  42. data/config/tinymce.yml +11 -0
  43. data/db/migrate/20150813080541_add_mch_id_to_weixin_public_accounts.rb +5 -0
  44. data/db/migrate/20150817105643_alert_weixin_reply_message_rules_s_reply_message_length.rb +5 -0
  45. data/db/migrate/20150817143407_add_mch_key_to_weixin_public_account.rb +5 -0
  46. data/db/migrate/20150818090435_create_weixin_media_resources.rb +13 -0
  47. data/db/migrate/20150818094553_create_weixin_media_articles.rb +17 -0
  48. data/db/migrate/20150818095654_create_weixin_media_news.rb +18 -0
  49. data/db/migrate/20150818100348_create_weixin_media_articles_news.rb +11 -0
  50. data/db/migrate/20150904045253_add_host_name_to_public_account.rb +5 -0
  51. data/lib/eric_weixin.rb +2 -0
  52. data/lib/eric_weixin/modules/ip.rb +2 -0
  53. data/lib/eric_weixin/modules/pay.rb +31 -0
  54. data/lib/eric_weixin/version.rb +1 -1
  55. metadata +38 -2
@@ -0,0 +1,62 @@
1
+ <% session_content = get_session_content(params[:session_content_id])[:resource] || {} rescue {} %>
2
+
3
+ <h3 class="text-center">新增素材</h3>
4
+
5
+ <div class="row">
6
+ <div class="columns small-3 text-right">
7
+ <label class="inline">素材标签</label>
8
+ </div>
9
+ <div class="columns small-3">
10
+ <%= text_field_tag "resource[tags]", get_show_value(params[:tags], v1:session_content[:tags], v2:@media_resource.tags) %>
11
+ </div>
12
+
13
+ <div class="columns small-3 text-right">
14
+ <label class="inline">选择公众号</label>
15
+ </div>
16
+ <div class="columns small-3 end">
17
+ <%= select_tag "resource[public_account_id]", options_from_collection_for_select(::EricWeixin::PublicAccount.all, 'id', 'name', get_show_value(params[:public_account_id], v1:session_content[:public_account_id], v2:@media_resource.public_account_id)) %>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="row">
22
+ <div class="columns small-3 text-right">
23
+ <label class="inline">素材类型</label>
24
+ </div>
25
+ <div class="columns small-3">
26
+ <%= select_tag "resource[category_name]", options_from_collection_for_select(::EricWeixin::MediaResource::RESOURCE_TYPE, 'first', 'second', get_show_value(params[:category_name], v1:session_content[:category_name], v2:@media_resource.category_name)) %>
27
+ </div>
28
+ <div class="columns small-3 text-right">
29
+ <label class="inline">请选择图片(jpg\png 小于1M)</label>
30
+ </div>
31
+ <div class="small-3 columns end">
32
+ <input class="fake diff" type="text" value="<%= @media_resource.wechat_link %>" disabled="disabled" style="background-color: white" name="resource[pic]" id="resource_pic"/>
33
+ <input class="file diff" type="file" name="pic" onchange="document.getElementById('resource_pic').value=this.value"/>
34
+ </div>
35
+ </div>
36
+
37
+
38
+
39
+
40
+ <style>
41
+ .diff {
42
+ position: absolute;
43
+ }
44
+ .fake.diff{
45
+ background-color:white;
46
+ /*width:450px;*/
47
+ disabled:disabled;
48
+ z-index: 0
49
+ }
50
+ .upload.diff{
51
+ color: #000;
52
+ top:10px;
53
+ /*left:470px;*/
54
+ z-index: 0
55
+ }
56
+ .file.diff{
57
+ opacity:0;
58
+ /*width:500px;*/
59
+ height: 27px;
60
+ z-index: 1
61
+ }
62
+ </style>
@@ -0,0 +1,20 @@
1
+ <h3 class="text-center"> 编辑素材标签</h3>
2
+ <% session_content = get_session_content(params[:session_content_id])[:resource] || {} rescue {} %>
3
+ <%= form_tag "/eric_weixin/cms/weixin/media_resources/#{@media_resource.id}", method: :patch, :multipart => true do %>
4
+ <div class="row">
5
+ <div class="columns small-3 text-right">
6
+ <label class="inline">素材标签</label>
7
+ </div>
8
+ s<%= session_content[:tags] %>||
9
+ <br/>
10
+ @<%= @media_resource.tags %>||
11
+ <br/>
12
+ p<%= params[:tags] %>||<br/>
13
+ <div class="columns small-3">
14
+ <%= text_field_tag "resource[tags]", get_show_value(params[:tags], v1:session_content[:tags], v2:@media_resource.tags) %>
15
+ </div>
16
+ <div class="columns small-3 text-center end">
17
+ <%= submit_tag '保存', class: 'button tiny' %>
18
+ </div>
19
+ </div>
20
+ <% end %>
@@ -0,0 +1,49 @@
1
+ <h3 class="text-center">微信素材管理</h3>
2
+ <%= form_tag '/eric_weixin/cms/weixin/media_resources/', method: :get do %>
3
+ <div class="row">
4
+ <div class="columns small-2 text-right">
5
+ <label class="inline">标签名称</label>
6
+ </div>
7
+ <div class="columns small-2">
8
+ <%= text_field_tag :tag, params[:tag] %>
9
+ </div>
10
+ <div class="columns small-2 text-right">
11
+ <label class="inline">素材类型</label>
12
+ </div>
13
+ <div class="columns small-2">
14
+ <%= select_tag :category_name, options_from_collection_for_select(::EricWeixin::MediaResource::RESOURCE_TYPE, 'first', 'second', params[:category_name]) %>
15
+ </div>
16
+ <div class="columns small-4">
17
+ <%= submit_tag '查询', class: 'button tiny' %>
18
+ </div>
19
+ </div>
20
+ <% end %>
21
+
22
+ <table>
23
+ <tr>
24
+ <th width="20%">图片预览</th>
25
+ <th width="10%">类型</th>
26
+ <th width="10%">创建时间</th>
27
+
28
+ <th width="30%">链接</th>
29
+ <th width="10%">操作</th>
30
+ </tr>
31
+ <% @media_resources.each do |media_resource| %>
32
+ <tr>
33
+ <td>
34
+ <img src="<%= media_resource.local_link %>" width="100" height="100">
35
+
36
+ </td>
37
+ <td><%= ::EricWeixin::MediaResource::RESOURCE_TYPE[media_resource.category_name] %></td>
38
+ <td><%= media_resource.created_at.chinese_format %></td>
39
+
40
+ <td style="WORD-BREAK: break-all; WORD-WRAP: break-word"><%= media_resource.wechat_link %></td>
41
+ <td>
42
+ <a href="/eric_weixin/cms/weixin/media_resources/<%= media_resource.id %>/edit">编辑标签</a>
43
+ <%= link_to '删除', "/eric_weixin/cms/weixin/media_resources/#{media_resource.id}", method: :delete, data: {confirm: '确定删除?'} %>
44
+ </td>
45
+
46
+ </tr>
47
+ <% end %>
48
+ </table>
49
+ <%= will_paginate @media_resources %>
@@ -0,0 +1,4 @@
1
+ <%= form_tag '/eric_weixin/cms/weixin/media_resources', method: :post, :multipart => true do %>
2
+ <%= render partial: 'media_resource' %>
3
+ <%= submit_tag '上传', class: 'button tiny' %>
4
+ <% end %>
@@ -2,19 +2,19 @@
2
2
 
3
3
  <% unless @details_url.blank? %>
4
4
  <textarea disabled="disabled" readonly="readonly" rows="9">
5
- <%= time_ago_in_words(Time.now) %>生成<br>
6
- 生成能获取用户详细信息的微信 URL 是 <%= @details_url %>
5
+ 生成的url为:
6
+ <%= @details_url %>
7
7
 
8
- 对应的短址为 <%= @short_details_url %>
8
+ 对应的短址: <%= @short_details_url %>
9
9
  </textarea>
10
10
  <% end %>
11
11
 
12
12
  <% unless @only_id_url.blank? %>
13
13
  <textarea disabled="disabled" readonly="readonly" rows="9">
14
- <%= time_ago_in_words(Time.now) %>生成<br>
15
- 仅能获取 ID 的微信 URL 是 <%= @only_id_url %>
14
+ 生成的url为:
15
+ <%= @only_id_url %>
16
16
 
17
- 对应的短址为 <%= @short_only_id_url %>
17
+ 对应的短址: <%= @short_only_id_url %>
18
18
  </textarea>
19
19
  <% end %>
20
20
  <% else %>
@@ -0,0 +1,2 @@
1
+ <br/><br/>
2
+ <h1 style="text-align: center">您支付失败,请返回重新尝试,谢谢。</h1>
@@ -0,0 +1,2 @@
1
+ <br/><br/>
2
+ <h1 style="text-align: center">您支付成功,谢谢。</h1>
@@ -0,0 +1,49 @@
1
+ <%
2
+ timestamp = Time.now.to_i.to_s
3
+ noncestr = SecureRandom.uuid.tr('-', '')
4
+ public_account = ::EricWeixin::PublicAccount.find_by_weixin_app_id(params[:appid])
5
+ options = {}
6
+ options[:appId] = params[:appid]
7
+ options[:timeStamp] = timestamp
8
+ options[:nonceStr] = noncestr
9
+ options[:package] = "prepay_id=#{@prepay_id}"
10
+ options[:signType] = "MD5"
11
+ paySign = ::EricWeixin::Pay.generate_sign options, public_account.mch_key
12
+ %>
13
+
14
+ <script language="javascript">
15
+ function onBridgeReady(){
16
+ WeixinJSBridge.invoke(
17
+ 'getBrandWCPayRequest',{
18
+ "appId": "<%= params[:appid] %>", //公众号名称,由商户传入
19
+ "timeStamp": "<%= timestamp %>", //时间戳,自1970年以来的秒数
20
+ "nonceStr":"<%= noncestr %>", //随机串
21
+ "package":"prepay_id=<%= @prepay_id %>",
22
+ "signType":"MD5", //微信签名方式:
23
+ "paySign":"<%= paySign %>" //微信签名
24
+ },
25
+ function(res){
26
+ if(res.err_msg == "get_brand_wcpay_request:ok" ) {
27
+ document.getElementById('message').innerHTML = '您支付成功,谢谢。';
28
+ } // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
29
+ else {
30
+ document.getElementById('message').innerHTML = '您支付失败,请返回重新尝试,谢谢。';
31
+ }
32
+ }
33
+ );
34
+ }
35
+
36
+
37
+ if (typeof WeixinJSBridge == "undefined"){
38
+ if( document.addEventListener ){
39
+ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
40
+ }else if (document.attachEvent){
41
+ document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
42
+ document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
43
+ }
44
+ }else{
45
+ onBridgeReady();
46
+ }
47
+ </script>
48
+ <br/><br/><br/><br/><br/><br/><br/>
49
+ <h1 id="message" style="text-align: center"></h1>
@@ -4,7 +4,7 @@
4
4
  <meta charset="utf-8"/>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6
6
 
7
- <title><%= content_for?(:title) ? yield(:title) : "小神龙后台管理" %></title>
7
+ <title><%= content_for?(:title) ? yield(:title) : "微信后台" %></title>
8
8
  <%= javascript_include_tag "eric_weixin/cms/base" %>
9
9
  <%= stylesheet_link_tag "eric_weixin/cms/base" %>
10
10
  <%= javascript_include_tag "vendor/modernizr" %>
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title></title>
6
+ <meta name="viewport" content="width=640,user-scalable=no,target-densitydpi=320" />
7
+ </head>
8
+ <body class="Paddmem backeb">
9
+ <%= yield %>
10
+ </body>
11
+ </html>
@@ -7,4 +7,4 @@ Rails.application.config.assets.version = '1.0'
7
7
  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
8
8
  # Rails.application.config.assets.precompile += %w( search.js )
9
9
  Rails.application.config.assets.precompile += %w( eric_weixin/cms/base.js )
10
- Rails.application.config.assets.precompile += %w( eric_weixin/cms/base.css )
10
+ Rails.application.config.assets.precompile += %w( eric_weixin/cms/base.css )
@@ -0,0 +1,19 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format. Inflections
4
+ # are locale specific, and you may define rules for as many different
5
+ # locales as you wish. All of these examples are active by default:
6
+ ActiveSupport::Inflector.inflections(:en) do |inflect|
7
+ # inflect.plural /^(ox)$/i, '\1en'
8
+ # inflect.singular /^(ox)en/i, '\1'
9
+ # inflect.irregular 'person', 'people'
10
+ # inflect.uncountable %w( fish sheep )
11
+ inflect.uncountable %w( media_news )
12
+
13
+ end
14
+
15
+ # These inflection rules are supported but not enabled by default:
16
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
17
+ # inflect.acronym 'RESTful'
18
+ # end
19
+
data/config/routes.rb CHANGED
@@ -4,8 +4,9 @@ EricWeixin::Engine.routes.draw do
4
4
  get "/weixin/service1/ddd" => "wz/weixin#aa"
5
5
  get "/weixin/snsapi" => "wz/weixin#snsapi_api"
6
6
  get "/weixin/snsuserinfo" => "wz/weixin#snsapi_userinfo"
7
- post "/weixin/snsapi" => "wz/weixin#snsapi_api"
8
- post "/weixin/snsuserinfo" => "wz/weixin#snsapi_userinfo"
7
+
8
+ get "/weixin/pay" => "wz/pays#prepay"
9
+
9
10
  namespace :cms do
10
11
  namespace :weixin do
11
12
  resources :public_accounts do
@@ -15,7 +16,6 @@ EricWeixin::Engine.routes.draw do
15
16
  post :create_menu
16
17
  end
17
18
  end
18
-
19
19
  resources :weixin_users do
20
20
  member do
21
21
  post :modify_remark
@@ -30,13 +30,27 @@ EricWeixin::Engine.routes.draw do
30
30
  end
31
31
  end
32
32
  resources :reply_message_rules
33
-
34
33
  resources :two_dimension_codes
35
34
  resources :url_encodes
36
-
37
-
38
35
  resources :customs_service_records
39
36
 
37
+ resources :media_resources
38
+ resources :media_articles do
39
+ collection do
40
+ get :select_pic
41
+ end
42
+ end
43
+
44
+ resources :media_news do
45
+ collection do
46
+ get :query_media_articles
47
+ get :will_send_articles
48
+ post :save_news
49
+ post :preview
50
+ post :send_news_now
51
+ get :query_weixin_users
52
+ end
53
+ end
40
54
  end
41
55
  end
42
56
  end
@@ -0,0 +1,11 @@
1
+ default:
2
+ plugins:
3
+ - image
4
+ - link
5
+ - table
6
+
7
+ alternate:
8
+ selector: textarea.table-editor
9
+ toolbar: styleselect | bold italic | undo redo | table
10
+ plugins:
11
+ - table
@@ -0,0 +1,5 @@
1
+ class AddMchIdToWeixinPublicAccounts < ActiveRecord::Migration
2
+ def change
3
+ add_column :weixin_public_accounts, :mch_id, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AlertWeixinReplyMessageRulesSReplyMessageLength < ActiveRecord::Migration
2
+ def change
3
+ change_column :weixin_reply_message_rules, :reply_message, :text
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddMchKeyToWeixinPublicAccount < ActiveRecord::Migration
2
+ def change
3
+ add_column :weixin_public_accounts, :mch_key, :string
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateWeixinMediaResources < ActiveRecord::Migration
2
+ def change
3
+ create_table :weixin_media_resources do |t|
4
+ t.string :tags
5
+ t.string :category_name
6
+ t.string :local_link
7
+ t.string :wechat_link
8
+ t.string :media_id
9
+ t.integer :public_account_id
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ class CreateWeixinMediaArticles < ActiveRecord::Migration
2
+ def change
3
+ create_table :weixin_media_articles do |t|
4
+ t.string :thumb_media_id
5
+ t.string :author
6
+ t.string :title
7
+ t.string :content_source_url, limit: 2000
8
+ t.text :content
9
+ t.string :digest, limit: 2000
10
+ t.boolean :show_cover_pic
11
+ t.string :tag
12
+ t.boolean :is_first_article
13
+ t.integer :public_account_id
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ class CreateWeixinMediaNews < ActiveRecord::Migration
2
+ def change
3
+ create_table :weixin_media_news do |t|
4
+ t.datetime :planned_send_time
5
+ t.datetime :send_time
6
+ t.string :user_group_name
7
+ t.string :media_id
8
+ t.datetime :upload_time
9
+ t.boolean :is_to_all
10
+ t.integer :sent_count
11
+ t.integer :total_count
12
+ t.integer :filter_count
13
+ t.integer :status
14
+ t.integer :public_account_id
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ class CreateWeixinMediaArticlesNews < ActiveRecord::Migration
2
+ def change
3
+ create_table :weixin_media_articles_news do |t|
4
+ t.integer :weixin_media_article_id
5
+ t.integer :weixin_media_news_id
6
+ t.integer :sort
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddHostNameToPublicAccount < ActiveRecord::Migration
2
+ def change
3
+ add_column :weixin_public_accounts, :host_name_with_schema, :string
4
+ end
5
+ end
data/lib/eric_weixin.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "eric_weixin/version"
2
2
  require "rest-client"
3
+ require "tinymce-rails"
3
4
  require "eric_weixin/engine"
4
5
 
5
6
  require 'eric_weixin/modules/mult_customer'
@@ -7,6 +8,7 @@ require 'eric_weixin/modules/reply_message'
7
8
  require 'eric_weixin/modules/snsapi'
8
9
  require 'eric_weixin/modules/ip'
9
10
  require 'eric_weixin/modules/analyze_data'
11
+ require 'eric_weixin/modules/pay'
10
12
 
11
13
 
12
14
  module EricWeixin