<commit_before># WeixinRailsMiddleware

This project rocks and uses MIT-LICENSE.

PLEASE DO NOT USE MASTER !! It still developing and unstable!

Note: `master` has already supported to Rails 3, Rails 4

https://rubygems.org/gems/weixin_rails_middleware

Example:　https://github.com/lanrion/weixin_rails_middleware_example

Rails 3 Example: https://github.com/lanrion/weixin_rails_3

> If you want to develop weixin mobile app, I recommend [twitter_ratchet_rails](https://github.com/lanrion/twitter_ratchet_rails).

## Functions

  * 自动验证微信请求。

  * 无需拼接XML格式，只需要使用 `ReplyWeixinMessageHelper` 辅助方法，即可快速回复。
    使用方法: ` render xml: reply_text_message("Your Message: #{current_message.Content}") `

  * 支持自定义token，适合一个用户使用。

  * 支持多用户token: 适合多用户注册网站，每个用户有不同的token，通过 `weixin_rails_middleware.rb` 配置好存储token的Model与字段名，即可。

  * 文本回复: `reply_text_message(content)`。

  * 音乐回复: `reply_music_message(music)`, `generate_music(title, desc, music_url, hq_music_url)`。

  * 图文回复: `reply_news_message(articles)`, `generate_article(title, desc, pic_url, link_url)`。

  * 视频回复: `replay_video_message(video)`。

  * 语音回复: `reply_voice_message(voice)`。

  * 图片回复: `reply_imgage_message(image)`。

  * 地理位置回复: 自定义需求。

  * 其他需要access_token的API实现：[weixin_authorize](https://github.com/lanrion/weixin_authorize)
    * 获取用户管理信息
    * 分组管理接口
    * 自定义菜单
    * 发送客服信息

  * 自定义菜单的实现

    * 数据库设计:

    ```ruby
    class CreateDiymenus < ActiveRecord::Migration
      def change
        create_table :diymenus do |t|
          t.integer :public_account_id
          t.integer :parent_id
          t.string :name
          t.string :key
          t.boolean :is_show
          t.string :url

          t.timestamps
        end
        add_index :diymenus, :public_account_id
        add_index :diymenus, :parent_id
        add_index :diymenus, :key

      end
    end

    ```

    * Diymenu model 层设计

    ```ruby
    class Diymenu < ActiveRecord::Base

      CLICK_TYPE = "click" # key
      VIEW_TYPE  = "view"  # url

      belongs_to :public_account

      has_many :sub_menus, ->{where(is_show: true).limit(5)}, class_name: "Diymenu", foreign_key: :parent_id

      def has_sub_menu?
        sub_menus.present?
      end

      # 优先为 click 类型
      def type
        keyword.present? ? CLICK_TYPE : VIEW_TYPE
      end

      def button_type(jbuilder)
        is_view_type? ? (jbuilder.url url) : (jbuilder.key key)
      end

      def is_view_type?
        type == VIEW_TYPE
      end
    end

    ```<commit_msg>renamed keyword to key<commit_after># WeixinRailsMiddleware

This project rocks and uses MIT-LICENSE.

PLEASE DO NOT USE MASTER !! It still developing and unstable!

Note: `master` has already supported to Rails 3, Rails 4

https://rubygems.org/gems/weixin_rails_middleware

Example:　https://github.com/lanrion/weixin_rails_middleware_example

Rails 3 Example: https://github.com/lanrion/weixin_rails_3

> If you want to develop weixin mobile app, I recommend [twitter_ratchet_rails](https://github.com/lanrion/twitter_ratchet_rails).

## Functions

  * 自动验证微信请求。

  * 无需拼接XML格式，只需要使用 `ReplyWeixinMessageHelper` 辅助方法，即可快速回复。
    使用方法: ` render xml: reply_text_message("Your Message: #{current_message.Content}") `

  * 支持自定义token，适合一个用户使用。

  * 支持多用户token: 适合多用户注册网站，每个用户有不同的token，通过 `weixin_rails_middleware.rb` 配置好存储token的Model与字段名，即可。

  * 文本回复: `reply_text_message(content)`。

  * 音乐回复: `reply_music_message(music)`, `generate_music(title, desc, music_url, hq_music_url)`。

  * 图文回复: `reply_news_message(articles)`, `generate_article(title, desc, pic_url, link_url)`。

  * 视频回复: `replay_video_message(video)`。

  * 语音回复: `reply_voice_message(voice)`。

  * 图片回复: `reply_imgage_message(image)`。

  * 地理位置回复: 自定义需求。

  * 其他需要access_token的API实现：[weixin_authorize](https://github.com/lanrion/weixin_authorize)
    * 获取用户管理信息
    * 分组管理接口
    * 自定义菜单
    * 发送客服信息

  * 自定义菜单的实现

    * 数据库设计:

    ```ruby
    class CreateDiymenus < ActiveRecord::Migration
      def change
        create_table :diymenus do |t|
          t.integer :public_account_id
          t.integer :parent_id
          t.string :name
          t.string :key
          t.boolean :is_show
          t.string :url

          t.timestamps
        end
        add_index :diymenus, :public_account_id
        add_index :diymenus, :parent_id
        add_index :diymenus, :key

      end
    end

    ```

    * Diymenu model 层设计

    ```ruby
    class Diymenu < ActiveRecord::Base

      CLICK_TYPE = "click" # key
      VIEW_TYPE  = "view"  # url

      belongs_to :public_account

      has_many :sub_menus, ->{where(is_show: true).limit(5)}, class_name: "Diymenu", foreign_key: :parent_id

      def has_sub_menu?
        sub_menus.present?
      end

      # 优先为 click 类型
      def type
        key.present? ? CLICK_TYPE : VIEW_TYPE
      end

      def button_type(jbuilder)
        is_view_type? ? (jbuilder.url url) : (jbuilder.key key)
      end

      def is_view_type?
        type == VIEW_TYPE
      end
    end

    ```
{'fraction_non_alphanumeric': 0.10234798314268513, 'fraction_numerical': 0.002006823198876179, 'mean_word_length': 3.0586319218241043, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 10, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2381913', 'n_tokens_mistral': 2075, 'n_tokens_neox': 2064, 'n_words': 355}