使用ruby on Rails 进行微信公众平台开发(2)—–消息的接收与发送

基于ruby on rails 的微信公众平台消息的接收与发送

接受消息之前,得验证消息的正确性,验证算法看官方文档,ruby接受消息分为几种,文本,图片,语音,视频等,这里只介绍收文本与发送文本消息

由于消息的类型不同,为了不在同一个action中判断消息的类型,以免让代码显得臃肿,可以根据请求的类型,对应不同的action,发送消息用的是post请求

对应的路由如下:

1
2
3
4
5
6
  scope :path => "/weixin", :via => :post do
     match "/", :to => 'weixin#method_text', :constraints => lambda { |request| request.params[:xml][:MsgType] == 'text' }
     match "/", :to => 'weixin#method_image', :constraints => lambda { |request| request.params[:xml][:MsgType] == 'image' }
     match "/", :to => "weixin#method_location",:constraints => lambda { |request| request.params[:xml][:MsgType] == 'location' }
     match "/", :to => "weixin#method_event",:constraints => lambda { |request| request.params[:xml][:MsgType] == 'event'}
  end

接受文本信息并处理之后发送消息的代码如下,验证消息正确性与验证token的算法一样,在服务器配置那篇里有写

1
2
3
4
5
 def method_text
    if check_signature?(params["timestamp"],params["signature"],params["nonce"])
      render partial: "weixin/echo",layout: false,:formats=>:xml
    end
  end

在rails4中移除了params[:xml]方法,所以得安装对应的gem,并进行相应的配置

gem ‘actionpack-xml_parser’, ‘~> 1.0.1’

在config/application.rb文件中加入这句话

config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser

上面的代码发送文本消息,render了一个xml模板,app/views/weixin/_echo.xml.erb,模板内容如下所示:

1
2
3
4
5
6
7
8
<xml>
    <ToUserName><![CDATA[<%= params[:xml][:FromUserName] %>]]></ToUserName>
    <FromUserName><![CDATA[<%= params[:xml][:ToUserName] %>]]></FromUserName>
    <CreateTime><%= Time.now.to_i %></CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你说的是:<%= params[:xml][:Content] %>]]></Content>
    <FuncFlag>0</FuncFlag>
</xml>

这样就实现了一个简单的,将发送的消息,原样返回的最基本的功能

Comments