├── .gitignore
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
├── assets
│ ├── images
│ │ └── .keep
│ ├── javascripts
│ │ └── application.js
│ └── stylesheets
│ │ └── application.css
├── controllers
│ ├── application_controller.rb
│ ├── concerns
│ │ └── .keep
│ └── users_controller.rb
├── decorators
│ └── controllers
│ │ └── weixin_rails_middleware
│ │ └── weixin_controller_decorator.rb
├── helpers
│ ├── application_helper.rb
│ └── users_helper.rb
├── mailers
│ └── .keep
├── models
│ ├── .keep
│ ├── concerns
│ │ └── .keep
│ └── user.rb
└── views
│ ├── layouts
│ └── application.html.erb
│ └── users
│ ├── _form.html.erb
│ ├── edit.html.erb
│ ├── index.html.erb
│ ├── new.html.erb
│ └── show.html.erb
├── bin
├── bundle
├── rails
└── rake
├── config.ru
├── config
├── application.rb
├── boot.rb
├── database.yml
├── environment.rb
├── environments
│ ├── development.rb
│ ├── production.rb
│ └── test.rb
├── initializers
│ ├── backtrace_silencers.rb
│ ├── filter_parameter_logging.rb
│ ├── inflections.rb
│ ├── mime_types.rb
│ ├── secret_token.rb
│ ├── session_store.rb
│ ├── weixin_rails_middleware.rb
│ └── wrap_parameters.rb
├── locales
│ └── en.yml
└── routes.rb
├── db
├── migrate
│ ├── 20140126161007_create_users.rb
│ └── 20140324161308_add_weixin_secret_key_and_weixin_token_to_users.rb
├── schema.rb
└── seeds.rb
├── lib
├── assets
│ └── .keep
└── tasks
│ └── .keep
├── log
└── .keep
├── public
├── 404.html
├── 422.html
├── 500.html
├── favicon.ico
└── robots.txt
├── test
├── controllers
│ ├── .keep
│ └── users_controller_test.rb
├── fixtures
│ ├── .keep
│ └── users.yml
├── helpers
│ ├── .keep
│ └── users_helper_test.rb
├── integration
│ └── .keep
├── mailers
│ └── .keep
├── models
│ ├── .keep
│ └── user_test.rb
└── test_helper.rb
└── vendor
└── assets
├── javascripts
└── .keep
└── stylesheets
└── .keep
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2 | #
3 | # If you find yourself ignoring temporary files generated by your text editor
4 | # or operating system, you probably want to add a global ignore instead:
5 | # git config --global core.excludesfile '~/.gitignore_global'
6 |
7 | # Ignore bundler config.
8 | /.bundle
9 |
10 | # Ignore the default SQLite database.
11 | /db/*.sqlite3
12 | /db/*.sqlite3-journal
13 |
14 | # Ignore all logfiles and tempfiles.
15 | /log/*.log
16 | /tmp
17 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'http://rubygems.org'
2 |
3 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
4 | gem 'rails', '~>4.1'
5 |
6 | # Use sqlite3 as the database for Active Record
7 | gem 'sqlite3'
8 |
9 | # Use SCSS for stylesheets
10 | gem 'sass-rails', '~> 4.0.0'
11 |
12 | # Use Uglifier as compressor for JavaScript assets
13 | gem 'uglifier', '>= 1.3.0'
14 |
15 | # Use CoffeeScript for .js.coffee assets and views
16 | gem 'coffee-rails', '~> 4.0.0'
17 |
18 | # See https://github.com/sstephenson/execjs#readme for more supported runtimes
19 | # gem 'therubyracer', platforms: :ruby
20 |
21 | # Use jquery as the JavaScript library
22 | gem 'jquery-rails'
23 |
24 | # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
25 | gem 'turbolinks'
26 |
27 | gem 'thin'
28 |
29 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
30 | gem 'jbuilder'
31 |
32 | gem 'weixin_rails_middleware', '~> 1.3.0'
33 |
34 | group :development, :test do
35 | # For debugger
36 | gem 'pry-byebug'
37 |
38 | # Quiet assets turn off rails assets log like:
39 | # Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-11-20 17:05:52 +0800
40 | gem "quiet_assets", "~> 1.0.2"
41 |
42 | end
43 |
44 | # Use ActiveModel has_secure_password
45 | # gem 'bcrypt-ruby', '~> 3.1.2'
46 |
47 | # Use unicorn as the app server
48 | # gem 'unicorn'
49 |
50 | # Use Capistrano for deployment
51 | # gem 'capistrano', group: :development
52 |
53 | # Use debugger
54 | # gem 'debugger', group: [:development, :test]
55 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: http://rubygems.org/
3 | specs:
4 | actionmailer (4.2.0)
5 | actionpack (= 4.2.0)
6 | actionview (= 4.2.0)
7 | activejob (= 4.2.0)
8 | mail (~> 2.5, >= 2.5.4)
9 | rails-dom-testing (~> 1.0, >= 1.0.5)
10 | actionpack (4.2.0)
11 | actionview (= 4.2.0)
12 | activesupport (= 4.2.0)
13 | rack (~> 1.6.0)
14 | rack-test (~> 0.6.2)
15 | rails-dom-testing (~> 1.0, >= 1.0.5)
16 | rails-html-sanitizer (~> 1.0, >= 1.0.1)
17 | actionview (4.2.0)
18 | activesupport (= 4.2.0)
19 | builder (~> 3.1)
20 | erubis (~> 2.7.0)
21 | rails-dom-testing (~> 1.0, >= 1.0.5)
22 | rails-html-sanitizer (~> 1.0, >= 1.0.1)
23 | activejob (4.2.0)
24 | activesupport (= 4.2.0)
25 | globalid (>= 0.3.0)
26 | activemodel (4.2.0)
27 | activesupport (= 4.2.0)
28 | builder (~> 3.1)
29 | activerecord (4.2.0)
30 | activemodel (= 4.2.0)
31 | activesupport (= 4.2.0)
32 | arel (~> 6.0)
33 | activesupport (4.2.0)
34 | i18n (~> 0.7)
35 | json (~> 1.7, >= 1.7.7)
36 | minitest (~> 5.1)
37 | thread_safe (~> 0.3, >= 0.3.4)
38 | tzinfo (~> 1.1)
39 | arel (6.0.0)
40 | builder (3.2.2)
41 | byebug (3.5.1)
42 | columnize (~> 0.8)
43 | debugger-linecache (~> 1.2)
44 | slop (~> 3.6)
45 | coderay (1.1.0)
46 | coffee-rails (4.0.1)
47 | coffee-script (>= 2.2.0)
48 | railties (>= 4.0.0, < 5.0)
49 | coffee-script (2.3.0)
50 | coffee-script-source
51 | execjs
52 | coffee-script-source (1.8.0)
53 | columnize (0.9.0)
54 | daemons (1.1.9)
55 | debugger-linecache (1.2.0)
56 | erubis (2.7.0)
57 | eventmachine (1.0.4)
58 | execjs (2.2.2)
59 | globalid (0.3.0)
60 | activesupport (>= 4.1.0)
61 | hike (1.2.3)
62 | i18n (0.7.0)
63 | jbuilder (2.2.6)
64 | activesupport (>= 3.0.0, < 5)
65 | multi_json (~> 1.2)
66 | jquery-rails (4.0.3)
67 | rails-dom-testing (~> 1.0)
68 | railties (>= 4.2.0)
69 | thor (>= 0.14, < 2.0)
70 | json (1.8.2)
71 | loofah (2.0.1)
72 | nokogiri (>= 1.5.9)
73 | mail (2.6.3)
74 | mime-types (>= 1.16, < 3)
75 | method_source (0.8.2)
76 | mime-types (2.4.3)
77 | mini_portile (0.6.2)
78 | minitest (5.5.1)
79 | multi_json (1.10.1)
80 | multi_xml (0.5.5)
81 | nokogiri (1.6.6.2)
82 | mini_portile (~> 0.6.0)
83 | pry (0.10.1)
84 | coderay (~> 1.1.0)
85 | method_source (~> 0.8.1)
86 | slop (~> 3.4)
87 | pry-byebug (2.0.0)
88 | byebug (~> 3.4)
89 | pry (~> 0.10)
90 | quiet_assets (1.0.3)
91 | railties (>= 3.1, < 5.0)
92 | rack (1.6.0)
93 | rack-test (0.6.3)
94 | rack (>= 1.0)
95 | rails (4.2.0)
96 | actionmailer (= 4.2.0)
97 | actionpack (= 4.2.0)
98 | actionview (= 4.2.0)
99 | activejob (= 4.2.0)
100 | activemodel (= 4.2.0)
101 | activerecord (= 4.2.0)
102 | activesupport (= 4.2.0)
103 | bundler (>= 1.3.0, < 2.0)
104 | railties (= 4.2.0)
105 | sprockets-rails
106 | rails-deprecated_sanitizer (1.0.3)
107 | activesupport (>= 4.2.0.alpha)
108 | rails-dom-testing (1.0.5)
109 | activesupport (>= 4.2.0.beta, < 5.0)
110 | nokogiri (~> 1.6.0)
111 | rails-deprecated_sanitizer (>= 1.0.1)
112 | rails-html-sanitizer (1.0.1)
113 | loofah (~> 2.0)
114 | railties (4.2.0)
115 | actionpack (= 4.2.0)
116 | activesupport (= 4.2.0)
117 | rake (>= 0.8.7)
118 | thor (>= 0.18.1, < 2.0)
119 | rake (10.4.2)
120 | roxml (3.3.1)
121 | activesupport (>= 2.3.0)
122 | nokogiri (>= 1.3.3)
123 | sass (3.2.19)
124 | sass-rails (4.0.5)
125 | railties (>= 4.0.0, < 5.0)
126 | sass (~> 3.2.2)
127 | sprockets (~> 2.8, < 3.0)
128 | sprockets-rails (~> 2.0)
129 | slop (3.6.0)
130 | sprockets (2.12.3)
131 | hike (~> 1.2)
132 | multi_json (~> 1.0)
133 | rack (~> 1.0)
134 | tilt (~> 1.1, != 1.3.0)
135 | sprockets-rails (2.2.4)
136 | actionpack (>= 3.0)
137 | activesupport (>= 3.0)
138 | sprockets (>= 2.8, < 4.0)
139 | sqlite3 (1.3.10)
140 | thin (1.6.3)
141 | daemons (~> 1.0, >= 1.0.9)
142 | eventmachine (~> 1.0)
143 | rack (~> 1.0)
144 | thor (0.19.1)
145 | thread_safe (0.3.4)
146 | tilt (1.4.1)
147 | turbolinks (2.5.3)
148 | coffee-rails
149 | tzinfo (1.2.2)
150 | thread_safe (~> 0.1)
151 | uglifier (2.7.0)
152 | execjs (>= 0.3.0)
153 | json (>= 1.8.0)
154 | weixin_rails_middleware (1.3.0)
155 | multi_xml (>= 0.5.2)
156 | nokogiri (>= 1.6.1)
157 | rails (>= 3.1)
158 | railties (>= 3.1)
159 | roxml
160 |
161 | PLATFORMS
162 | ruby
163 |
164 | DEPENDENCIES
165 | coffee-rails (~> 4.0.0)
166 | jbuilder
167 | jquery-rails
168 | pry-byebug
169 | quiet_assets (~> 1.0.2)
170 | rails (~> 4.1)
171 | sass-rails (~> 4.0.0)
172 | sqlite3
173 | thin
174 | turbolinks
175 | uglifier (>= 1.3.0)
176 | weixin_rails_middleware (~> 1.3.0)
177 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # README
2 | For: https://github.com/lanrion/weixin_rails_middleware
3 |
4 | Require Rails 4.1
5 |
6 | ## Usage:
7 |
8 | * `rm Gemfile.lock`
9 |
10 | * `bundle install`
11 |
12 | * `rake db:create`
13 |
14 | * `rake db:migrate`
15 |
16 | * `rails server`
17 |
18 | * Download `ngrok` from https://ngrok.com , register, get your own auth token, such as `bFDybfmIx/Ad6Z5/evE3`, and run `./ngrok -authtoken bFDybfmIx/Ad6Z5/evE3 3000`
19 |
20 | Then, it will generate a Forwarding Url **random** like this:
21 |
22 | ```
23 |
24 | Tunnel Status online
25 | Version 1.6/1.5
26 | Forwarding http://e0ede89.ngrok.com -> 127.0.0.1:3000
27 | Forwarding https://e0ede89.ngrok.com -> 127.0.0.1:3000
28 | Web Interface 127.0.0.1:4040
29 | # Conn 67
30 | Avg Conn Time 839.50ms
31 |
32 | ```
33 |
34 | * Open the link from above: http://e0ede89.ngrok.com , create a user, and back to homepage, two parameters `Weixin Server Url` and `Weixin Token` will be generated and shown on homepage:
35 |
36 | Weixin Server Url: http://e0ede89.ngrok.com/weixin/Mn8HHt0phlqnoCq7dMaJuvPbUi_sAajJ
37 |
38 | Weixin Token: bca5383caa9f70bbc4cde545
39 |
40 | * Edit `config/initializers/weixin_rails_middleware.rb`, uncomment and change the parameters `config.weixin_token_string`, `config.weixin_secret_string`.
41 |
42 | * Save the same parameters also in sandbox: http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login, after submit, you'll ge the success message.
43 |
44 | ## Test Weixin Message
45 |
46 | * Use weixin scan the two-dimension code on [sandbox page](http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index), and test:
47 |
48 | Send a message **hi!** , your will response a message: `Your Message: hi!`
49 |
50 | ## Add `weixin_rails_middleware` to a exist project
51 |
52 | Getting start: https://github.com/lanrion/weixin_rails_middleware/wiki/Getting-Start
53 |
54 | ## Secondary development
55 |
56 | See details in https://github.com/lanrion/weixin_rails_middleware_example/blob/master/app/decorators/controllers/weixin_rails_middleware/weixin_controller_decorator.rb
57 | And orverwirte your function.
58 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | # Add your own tasks in files placed in lib/tasks ending in .rake,
2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3 |
4 | require File.expand_path('../config/application', __FILE__)
5 |
6 | WeixinRailsMiddlewareExample::Application.load_tasks
7 |
--------------------------------------------------------------------------------
/app/assets/images/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/app/assets/images/.keep
--------------------------------------------------------------------------------
/app/assets/javascripts/application.js:
--------------------------------------------------------------------------------
1 | // This is a manifest file that'll be compiled into application.js, which will include all the files
2 | // listed below.
3 | //
4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5 | // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6 | //
7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8 | // compiled file.
9 | //
10 | // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11 | // about supported directives.
12 | //
13 | //= require jquery
14 | //= require jquery_ujs
15 | //= require turbolinks
16 | //= require_tree .
17 |
--------------------------------------------------------------------------------
/app/assets/stylesheets/application.css:
--------------------------------------------------------------------------------
1 | /*
2 | * This is a manifest file that'll be compiled into application.css, which will include all the files
3 | * listed below.
4 | *
5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6 | * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7 | *
8 | * You're free to add application-wide styles to this file and they'll appear at the top of the
9 | * compiled file, but it's generally better to create a new file per style scope.
10 | *
11 | *= require_self
12 | *= require_tree .
13 | */
14 |
--------------------------------------------------------------------------------
/app/controllers/application_controller.rb:
--------------------------------------------------------------------------------
1 | class ApplicationController < ActionController::Base
2 | # Prevent CSRF attacks by raising an exception.
3 | # For APIs, you may want to use :null_session instead.
4 | protect_from_forgery with: :exception
5 | end
6 |
--------------------------------------------------------------------------------
/app/controllers/concerns/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/app/controllers/concerns/.keep
--------------------------------------------------------------------------------
/app/controllers/users_controller.rb:
--------------------------------------------------------------------------------
1 | class UsersController < ApplicationController
2 | before_action :set_user, only: [:show, :edit, :update, :destroy]
3 |
4 | # GET /users
5 | # GET /users.json
6 | def index
7 | @users = User.all
8 | end
9 |
10 | # GET /users/1
11 | # GET /users/1.json
12 | def show
13 | end
14 |
15 | # GET /users/new
16 | def new
17 | @user = User.new
18 | end
19 |
20 | # GET /users/1/edit
21 | def edit
22 | end
23 |
24 | # POST /users
25 | # POST /users.json
26 | def create
27 | @user = User.new(user_params)
28 |
29 | respond_to do |format|
30 | if @user.save
31 | format.html { redirect_to @user, notice: 'User was successfully created.' }
32 | format.json { render action: 'show', status: :created, location: @user }
33 | else
34 | format.html { render action: 'new' }
35 | format.json { render json: @user.errors, status: :unprocessable_entity }
36 | end
37 | end
38 | end
39 |
40 | # PATCH/PUT /users/1
41 | # PATCH/PUT /users/1.json
42 | def update
43 | respond_to do |format|
44 | if @user.update(user_params)
45 | format.html { redirect_to @user, notice: 'User was successfully updated.' }
46 | format.json { head :no_content }
47 | else
48 | format.html { render action: 'edit' }
49 | format.json { render json: @user.errors, status: :unprocessable_entity }
50 | end
51 | end
52 | end
53 |
54 | # DELETE /users/1
55 | # DELETE /users/1.json
56 | def destroy
57 | @user.destroy
58 | respond_to do |format|
59 | format.html { redirect_to users_url }
60 | format.json { head :no_content }
61 | end
62 | end
63 |
64 | private
65 | # Use callbacks to share common setup or constraints between actions.
66 | def set_user
67 | @user = User.find(params[:id])
68 | end
69 |
70 | # Never trust parameters from the scary internet, only allow the white list through.
71 | def user_params
72 | params[:user].permit(:name, :password)
73 | end
74 | end
75 |
--------------------------------------------------------------------------------
/app/decorators/controllers/weixin_rails_middleware/weixin_controller_decorator.rb:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 | # 1, @weixin_message: 获取微信所有参数.
3 | # 2, @weixin_public_account: 如果配置了public_account_class选项,则会返回当前实例,否则返回nil.
4 | # 3, @keyword: 目前微信只有这三种情况存在关键字: 文本消息, 事件推送, 接收语音识别结果
5 | WeixinRailsMiddleware::WeixinController.class_eval do
6 |
7 | def reply
8 | render xml: send("response_#{@weixin_message.MsgType}_message", {})
9 | end
10 |
11 | private
12 |
13 | def response_text_message(options={})
14 | reply_text_message("Your Message: #{@keyword}")
15 | end
16 |
17 | #
Name | 7 |Weixin Server Url | 8 |Weixin Token | 9 ||||
---|---|---|---|---|---|
<%= user.name %> | 16 |<%= weixin_engine.weixin_server_url(user.weixin_secret_key) %> | 17 | 18 |<%= user.weixin_token %> | 19 |<%= link_to 'Show', user %> | 20 |<%= link_to 'Edit', edit_user_path(user) %> | 21 |<%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %> | 22 |
<%= notice %>
2 | 3 | <%= link_to 'Edit', edit_user_path(@user) %> | 4 | <%= link_to 'Back', users_path %> 5 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path('../../config/application', __FILE__) 3 | require_relative '../config/boot' 4 | require 'rails/commands' 5 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative '../config/boot' 3 | require 'rake' 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Rails.application 5 | -------------------------------------------------------------------------------- /config/application.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../boot', __FILE__) 2 | 3 | require 'rails/all' 4 | 5 | # Require the gems listed in Gemfile, including any gems 6 | # you've limited to :test, :development, or :production. 7 | Bundler.require(:default, Rails.env) 8 | 9 | module WeixinRailsMiddlewareExample 10 | class Application < Rails::Application 11 | config.to_prepare do 12 | # Load application's model / class decorators 13 | Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c| 14 | Rails.configuration.cache_classes ? require(c) : load(c) 15 | end 16 | end 17 | 18 | 19 | # Settings in config/environments/* take precedence over those specified here. 20 | # Application configuration should go into files in config/initializers 21 | # -- all .rb files in that directory are automatically loaded. 22 | 23 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 24 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 25 | # config.time_zone = 'Central Time (US & Canada)' 26 | 27 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 28 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 29 | # config.i18n.default_locale = :de 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | # Set up gems listed in the Gemfile. 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | 4 | require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) 5 | -------------------------------------------------------------------------------- /config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite version 3.x 2 | # gem install sqlite3 3 | # 4 | # Ensure the SQLite 3 gem is defined in your Gemfile 5 | # gem 'sqlite3' 6 | development: 7 | adapter: sqlite3 8 | database: db/weixin_rails_middleware_example.sqlite3 9 | pool: 5 10 | timeout: 5000 11 | 12 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the Rails application. 5 | WeixinRailsMiddlewareExample::Application.initialize! 6 | -------------------------------------------------------------------------------- /config/environments/development.rb: -------------------------------------------------------------------------------- 1 | WeixinRailsMiddlewareExample::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the web server when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Do not eager load code on boot. 10 | config.eager_load = false 11 | 12 | # Show full error reports and disable caching. 13 | config.consider_all_requests_local = true 14 | config.action_controller.perform_caching = false 15 | 16 | # Don't care if the mailer can't send. 17 | config.action_mailer.raise_delivery_errors = false 18 | 19 | # Print deprecation notices to the Rails logger. 20 | config.active_support.deprecation = :log 21 | 22 | # Raise an error on page load if there are pending migrations 23 | config.active_record.migration_error = :page_load 24 | 25 | # Debug mode disables concatenation and preprocessing of assets. 26 | # This option may cause significant delays in view rendering with a large 27 | # number of complex assets. 28 | config.assets.debug = true 29 | end 30 | -------------------------------------------------------------------------------- /config/environments/production.rb: -------------------------------------------------------------------------------- 1 | WeixinRailsMiddlewareExample::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # Code is not reloaded between requests. 5 | config.cache_classes = true 6 | 7 | # Eager load code on boot. This eager loads most of Rails and 8 | # your application in memory, allowing both thread web servers 9 | # and those relying on copy on write to perform better. 10 | # Rake tasks automatically ignore this option for performance. 11 | config.eager_load = true 12 | 13 | # Full error reports are disabled and caching is turned on. 14 | config.consider_all_requests_local = false 15 | config.action_controller.perform_caching = true 16 | 17 | # Enable Rack::Cache to put a simple HTTP cache in front of your application 18 | # Add `rack-cache` to your Gemfile before enabling this. 19 | # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. 20 | # config.action_dispatch.rack_cache = true 21 | 22 | # Disable Rails's static asset server (Apache or nginx will already do this). 23 | config.serve_static_assets = false 24 | 25 | # Compress JavaScripts and CSS. 26 | config.assets.js_compressor = :uglifier 27 | # config.assets.css_compressor = :sass 28 | 29 | # Do not fallback to assets pipeline if a precompiled asset is missed. 30 | config.assets.compile = false 31 | 32 | # Generate digests for assets URLs. 33 | config.assets.digest = true 34 | 35 | # Version of your assets, change this if you want to expire all your assets. 36 | config.assets.version = '1.0' 37 | 38 | # Specifies the header that your server uses for sending files. 39 | # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 40 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 41 | 42 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 43 | # config.force_ssl = true 44 | 45 | # Set to :debug to see everything in the log. 46 | config.log_level = :info 47 | 48 | # Prepend all log lines with the following tags. 49 | # config.log_tags = [ :subdomain, :uuid ] 50 | 51 | # Use a different logger for distributed setups. 52 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 53 | 54 | # Use a different cache store in production. 55 | # config.cache_store = :mem_cache_store 56 | 57 | # Enable serving of images, stylesheets, and JavaScripts from an asset server. 58 | # config.action_controller.asset_host = "http://assets.example.com" 59 | 60 | # Precompile additional assets. 61 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. 62 | # config.assets.precompile += %w( search.js ) 63 | 64 | # Ignore bad email addresses and do not raise email delivery errors. 65 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. 66 | # config.action_mailer.raise_delivery_errors = false 67 | 68 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 69 | # the I18n.default_locale when a translation can not be found). 70 | config.i18n.fallbacks = true 71 | 72 | # Send deprecation notices to registered listeners. 73 | config.active_support.deprecation = :notify 74 | 75 | # Disable automatic flushing of the log to improve performance. 76 | # config.autoflush_log = false 77 | 78 | # Use default logging formatter so that PID and timestamp are not suppressed. 79 | config.log_formatter = ::Logger::Formatter.new 80 | end 81 | -------------------------------------------------------------------------------- /config/environments/test.rb: -------------------------------------------------------------------------------- 1 | WeixinRailsMiddlewareExample::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = true 9 | 10 | # Do not eager load code on boot. This avoids loading your whole application 11 | # just for the purpose of running a single test. If you are using a tool that 12 | # preloads Rails for running tests, you may have to set it to true. 13 | config.eager_load = false 14 | 15 | # Configure static asset server for tests with Cache-Control for performance. 16 | config.serve_static_assets = true 17 | config.static_cache_control = "public, max-age=3600" 18 | 19 | # Show full error reports and disable caching. 20 | config.consider_all_requests_local = true 21 | config.action_controller.perform_caching = false 22 | 23 | # Raise exceptions instead of rendering exception templates. 24 | config.action_dispatch.show_exceptions = false 25 | 26 | # Disable request forgery protection in test environment. 27 | config.action_controller.allow_forgery_protection = false 28 | 29 | # Tell Action Mailer not to deliver emails to the real world. 30 | # The :test delivery method accumulates sent emails in the 31 | # ActionMailer::Base.deliveries array. 32 | config.action_mailer.delivery_method = :test 33 | 34 | # Print deprecation notices to the stderr. 35 | config.active_support.deprecation = :stderr 36 | end 37 | -------------------------------------------------------------------------------- /config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure sensitive parameters which will be filtered from the log file. 4 | Rails.application.config.filter_parameters += [:password] 5 | -------------------------------------------------------------------------------- /config/initializers/inflections.rb: -------------------------------------------------------------------------------- 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 | # end 12 | 13 | # These inflection rules are supported but not enabled by default: 14 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 15 | # inflect.acronym 'RESTful' 16 | # end 17 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | # Mime::Type.register_alias "text/html", :iphone 6 | -------------------------------------------------------------------------------- /config/initializers/secret_token.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key is used for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | 6 | # Make sure the secret is at least 30 characters and all random, 7 | # no regular words or you'll be exposed to dictionary attacks. 8 | # You can use `rake secret` to generate a secure secret key. 9 | 10 | # Make sure your secret_key_base is kept private 11 | # if you're sharing your code publicly. 12 | WeixinRailsMiddlewareExample::Application.config.secret_key_base = 'c481893f91cee271f58dc5614da9571e88206a5ae7b39db27ace7eeeadaad3d6a555d8c33fbaf46e37b28f55b0be70ccf73d7db23b3251ca3dbb44d4669dc54a' 13 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | WeixinRailsMiddlewareExample::Application.config.session_store :cookie_store, key: '_weixin_rails_middleware_example_session' 4 | -------------------------------------------------------------------------------- /config/initializers/weixin_rails_middleware.rb: -------------------------------------------------------------------------------- 1 | # Use this hook to configure WeixinRailsMiddleware bahaviors. 2 | WeixinRailsMiddleware.configure do |config| 3 | 4 | ## NOTE: 5 | ## If you config all them, it will use `weixin_token_string` default 6 | 7 | ## Config public_account_class if you SAVE public_account into database ## 8 | # Th first configure is fit for your weixin public_account is saved in database. 9 | # +public_account_class+ The class name that to save your public_account 10 | config.public_account_class = "User" 11 | 12 | ## Here configure is for you DON'T WANT TO SAVE your public account into database ## 13 | # Or the other configure is fit for only one weixin public_account 14 | # If you config `weixin_token_string`, so it will directly use it 15 | # config.weixin_token_string = 'bca5383caa9f70bbc4cde545' 16 | # using to weixin server url to validate the token can be trusted. 17 | # config.weixin_secret_string = 'Mn8HHt0phlqnoCq7dMaJuvPbUi_sAajJ' 18 | # config.encoding_aes_key = '825f5d4db45fa6c64270e0277e9824495deff200b5e' 19 | # config.app_id = "wxbef8dcd47b830012" 20 | 21 | end 22 | -------------------------------------------------------------------------------- /config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters) 9 | end 10 | 11 | # To enable root element in JSON for ActiveRecord objects. 12 | # ActiveSupport.on_load(:active_record) do 13 | # self.include_root_in_json = true 14 | # end 15 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # To learn more, please read the Rails Internationalization guide 20 | # available at http://guides.rubyonrails.org/i18n.html. 21 | 22 | en: 23 | hello: "Hello world" 24 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | WeixinRailsMiddlewareExample::Application.routes.draw do 2 | mount WeixinRailsMiddleware::Engine, at: "/" 3 | # The priority is based upon order of creation: first created -> highest priority. 4 | # See how all your routes lay out with "rake routes". 5 | 6 | # You can have the root of your site routed with "root" 7 | root 'users#index' 8 | 9 | # Example of regular route: 10 | # get 'products/:id' => 'catalog#view' 11 | 12 | # Example of named route that can be invoked with purchase_url(id: product.id) 13 | # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase 14 | 15 | # Example resource route (maps HTTP verbs to controller actions automatically): 16 | resources :users 17 | 18 | # Example resource route with options: 19 | # resources :products do 20 | # member do 21 | # get 'short' 22 | # post 'toggle' 23 | # end 24 | # 25 | # collection do 26 | # get 'sold' 27 | # end 28 | # end 29 | 30 | # Example resource route with sub-resources: 31 | # resources :products do 32 | # resources :comments, :sales 33 | # resource :seller 34 | # end 35 | 36 | # Example resource route with more complex sub-resources: 37 | # resources :products do 38 | # resources :comments 39 | # resources :sales do 40 | # get 'recent', on: :collection 41 | # end 42 | # end 43 | 44 | # Example resource route with concerns: 45 | # concern :toggleable do 46 | # post 'toggle' 47 | # end 48 | # resources :posts, concerns: :toggleable 49 | # resources :photos, concerns: :toggleable 50 | 51 | # Example resource route within a namespace: 52 | # namespace :admin do 53 | # # Directs /admin/products/* to Admin::ProductsController 54 | # # (app/controllers/admin/products_controller.rb) 55 | # resources :products 56 | # end 57 | end 58 | -------------------------------------------------------------------------------- /db/migrate/20140126161007_create_users.rb: -------------------------------------------------------------------------------- 1 | class CreateUsers < ActiveRecord::Migration 2 | def change 3 | create_table :users do |t| 4 | t.string :name 5 | 6 | t.timestamps 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20140324161308_add_weixin_secret_key_and_weixin_token_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddWeixinSecretKeyAndWeixinTokenToUsers < ActiveRecord::Migration 2 | def self.up 3 | change_table(:users) do |t| 4 | t.string :weixin_secret_key 5 | t.string :weixin_token 6 | end 7 | add_index :users, :weixin_secret_key 8 | add_index :users, :weixin_token 9 | end 10 | 11 | def self.down 12 | # By default, we don't want to make any assumption about how to roll back a migration when your 13 | # model already existed. Please edit below which fields you would like to remove in this migration. 14 | raise ActiveRecord::IrreversibleMigration 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/schema.rb: -------------------------------------------------------------------------------- 1 | # encoding: UTF-8 2 | # This file is auto-generated from the current state of the database. Instead 3 | # of editing this file, please use the migrations feature of Active Record to 4 | # incrementally modify your database, and then regenerate this schema definition. 5 | # 6 | # Note that this schema.rb definition is the authoritative source for your 7 | # database schema. If you need to create the application database on another 8 | # system, you should be using db:schema:load, not running all the migrations 9 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations 10 | # you'll amass, the slower it'll run and the greater likelihood for issues). 11 | # 12 | # It's strongly recommended that you check this file into your version control system. 13 | 14 | ActiveRecord::Schema.define(version: 20140324161308) do 15 | 16 | create_table "users", force: true do |t| 17 | t.string "name" 18 | t.datetime "created_at" 19 | t.datetime "updated_at" 20 | t.string "weixin_secret_key" 21 | t.string "weixin_token" 22 | end 23 | 24 | add_index "users", ["weixin_secret_key"], name: "index_users_on_weixin_secret_key" 25 | add_index "users", ["weixin_token"], name: "index_users_on_weixin_token" 26 | 27 | end 28 | -------------------------------------------------------------------------------- /db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 7 | # Mayor.create(name: 'Emanuel', city: cities.first) 8 | -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/lib/assets/.keep -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/lib/tasks/.keep -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/log/.keep -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |You may have mistyped the address or the page may have moved.
55 |If you are the application owner check the logs for more information.
57 | 58 | 59 | -------------------------------------------------------------------------------- /public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |Maybe you tried to change something you didn't have access to.
55 |If you are the application owner check the logs for more information.
57 | 58 | 59 | -------------------------------------------------------------------------------- /public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |If you are the application owner check the logs for more information.
56 | 57 | 58 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/public/favicon.ico -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /test/controllers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/test/controllers/.keep -------------------------------------------------------------------------------- /test/controllers/users_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class UsersControllerTest < ActionController::TestCase 4 | setup do 5 | @user = users(:one) 6 | end 7 | 8 | test "should get index" do 9 | get :index 10 | assert_response :success 11 | assert_not_nil assigns(:users) 12 | end 13 | 14 | test "should get new" do 15 | get :new 16 | assert_response :success 17 | end 18 | 19 | test "should create user" do 20 | assert_difference('User.count') do 21 | post :create, user: { } 22 | end 23 | 24 | assert_redirected_to user_path(assigns(:user)) 25 | end 26 | 27 | test "should show user" do 28 | get :show, id: @user 29 | assert_response :success 30 | end 31 | 32 | test "should get edit" do 33 | get :edit, id: @user 34 | assert_response :success 35 | end 36 | 37 | test "should update user" do 38 | patch :update, id: @user, user: { } 39 | assert_redirected_to user_path(assigns(:user)) 40 | end 41 | 42 | test "should destroy user" do 43 | assert_difference('User.count', -1) do 44 | delete :destroy, id: @user 45 | end 46 | 47 | assert_redirected_to users_path 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /test/fixtures/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/test/fixtures/.keep -------------------------------------------------------------------------------- /test/fixtures/users.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | name: MyString 5 | password: MyString 6 | weixin_token: MyString 7 | 8 | two: 9 | name: MyString 10 | password: MyString 11 | weixin_token: MyString 12 | -------------------------------------------------------------------------------- /test/helpers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/test/helpers/.keep -------------------------------------------------------------------------------- /test/helpers/users_helper_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class UsersHelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /test/integration/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/test/integration/.keep -------------------------------------------------------------------------------- /test/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/test/mailers/.keep -------------------------------------------------------------------------------- /test/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/test/models/.keep -------------------------------------------------------------------------------- /test/models/user_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class UserTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | ENV["RAILS_ENV"] ||= "test" 2 | require File.expand_path('../../config/environment', __FILE__) 3 | require 'rails/test_help' 4 | 5 | class ActiveSupport::TestCase 6 | ActiveRecord::Migration.check_pending! 7 | 8 | # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 9 | # 10 | # Note: You'll currently still have to declare fixtures explicitly in integration tests 11 | # -- they do not yet inherit this setting 12 | fixtures :all 13 | 14 | # Add more helper methods to be used by all tests here... 15 | end 16 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/vendor/assets/javascripts/.keep -------------------------------------------------------------------------------- /vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lanrion/weixin_rails_middleware_example/282a7ae8a9e4114b98444c96c6ee228b2bbf1562/vendor/assets/stylesheets/.keep --------------------------------------------------------------------------------