使用ruby on Rails进行微信公众平台开发(4)-基于事件推送开发天气预报功能

基于事件推送开发天气预报功能

在自定义菜单时,天气预报对应的事件是’CLICK’,对应的key是’V1002_TODAY_WEATHER’,处理点击事件对应的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def method_event
  #处理消息之前得判断消息的真实性
  if check_signature?(params["timestamp"],params["signature"],params["nonce"])
      event = params[:xml][:Event]
      event_key = params[:xml][:EventKey]
      if event == "CLICK" && event_key == "V1002_TODAY_WEATHER"
        user = params[:xml]["FromUserName"]
        #从cache中读取该用户的location信息
        location = Rails.cache.read(user)
        if location.nil?
          render partial: "weixin/open_location",layout: false,:formats=>:xml
          else
          #获取天气信息
          @weather = get_weather(location)
          render partial: "weixin/event_click_today_weather",layout: false,:formats=>:xml
        end
      end
      #用户的地理位置信息会保存在cache中
        elsif event == "LOCATION"
        lat = params[:xml][:Latitude]
        lng = params[:xml][:Longitude]
        user = params[:xml]["FromUserName"]
        if Rails.cache.read(user).nil?
          Rails.cache.write(user,"#{lng},#{lat}")
        end
        render nothing: true
  end
end

获取天气预报是基于location获取的,所以启用了地理位置接口,用户得同意上传地理位置才能使用这一功能,用户上传的地理位置会与用户的openid一起存在cache中,可以通过用户的openid从cache中获取location.

获取天气预报方法,基于百度api获取天气预报,得拥有一个百度api ak

1
2
3
4
5
6
7
  def get_weather(location)
    uri = URI("http://api.map.baidu.com/telematics/v3/weather")
    params = {:location=>location,:ak=>"your baidu api ak",:output=>"json"}
    uri.query = URI.encode_www_form(params)
    res = Net::HTTP.get_response(uri)
    @weather = JSON.parse(res.body)
  end

天气预报xml模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<xml>
  <ToUserName><![CDATA[<%= params[:xml][:FromUserName]%>]]></ToUserName>
  <FromUserName><![CDATA[<%= params[:xml][:ToUserName]%>]]></FromUserName>
  <CreateTime><%= Time.now.to_i%></CreateTime>
  <MsgType><![CDATA[news]]></MsgType>
  <ArticleCount>7</ArticleCount>
  <Articles>
    <item>
      <Title><![CDATA[<%= @weather["results"][0]["currentCity"]%>天气预报]]></Title>
      <Description><![CDATA[]]></Description>
      <PicUrl><![CDATA[]]></PicUrl>
      <Url><![CDATA[]]></Url>
    </item>

    <item>
      <Title><![CDATA[pm25:<%= @weather["results"][0]["pm25"]%>]]></Title>
      <Description><![CDATA[]]></Description>
      <PicUrl><![CDATA[]]></PicUrl>
      <Url><![CDATA[]]></Url>
    </item>

    <item>
      <Title><![CDATA[
        <% @weather["results"][0]["index"].each do |w|%>
          <%= w["title"]%>: <%= w["des"]%>
          <%= w["tipt"]%>:<%=w["zs"]%>
        <%end%>
        ]]></Title>
      <Description><![CDATA[]]></Description>
      <PicUrl><![CDATA[]]></PicUrl>
      <Url><![CDATA[]]></Url>
    </item>

        <% @weather["results"][0]["weather_data"].each do |w|%>
    <item>
      <Title><![CDATA[
           <%= w["date"]%>  <%= w["weather"]%>  <%= w["wind"]%>  <%= w["temperature"]%>
        ]]></Title>
      <Description><![CDATA[]]></Description>
      <PicUrl><![CDATA[<%= w["dayPictureUrl"]%>]]></PicUrl>
      <PicUrl><![CDATA[<%= w["nightPictureUrl"]%>]]></PicUrl>
      <Url><![CDATA[]]></Url>
    </item>
       <%end%>
  </Articles>
</xml>

Comments