## 微信公众平台后台框架 [![Build Status](https://travis-ci.org/charleyw/weChat-backend.png?branch=master)](https://travis-ci.org/charleyw/weChat-backend) 微信公众平台 后台框架,基于sinatra,使用DSL的思想帮助你以最快的**速度**开启微信公众平台开发. ## 仅需3步,一个文件创建一个微信后台程序 1. 安装Gem gem install 'wei-backend' 1. 创建微信后台主程序**app.rb**, 内容如下: require 'sinatra' require 'wei-backend' token "mytoken" on_text do "你发送了如下内容: #{params[:Content]}!!" end on_subscribe do "感谢您的订阅" end on_unsubscribe do "欢迎您再次订阅" end 1. 启动 ruby app.rb ## 模拟微信请求测试 微信的每一个请求都会带上3个参数,`timestamp`时间戳, `nonce`随机数以及`signature`由token和前两个参数生成的值。因此,模拟测试需要生成token对应的signature: ``` export TIMESTAMP=1388674716 export NONCE=1388564676 export TOKEN=mytoken export SIGNATURE=$(ruby -e 'require "digest/sha1"; puts Digest::SHA1.hexdigest [ENV["TIMESTAMP"], ENV["NONCE"], ENV["TOKEN"]].sort!.join') curl -H 'Content-type:text/xml' -d@- localhost:4567/weixin?signature=$SIGNATURE×tamp=$TIMESTAMP&nonce=$NONCE << EOF 1348831860 1234567890123456 EOF ``` 将会得到一段xml返回值,表示一切OK: ``` ``` ## 与微信接口兼容情况: * 现在可以处理的消息类型(被动接受用户消息类型): | 消息类型 | 接口 | | ------------ | ------------- | | 文本消息 | on_text | | 订阅事件 | on_subscribe | | 取消订阅事件 | on_unsubscribe | | 用户被动分享地理位置 | on_location | 后续还会加入消息类型支持 * 可以发送的消息类型: | 消息类型 | 格式 | | ------------ | ------------- | | 文本消息 | ruby 字符串 | | 图文事件 | ruby hash值 | ## 接口说明: 各个接口只能定义一次,重复定义会覆盖之前定义的接口 * ### token 用来配置你在微信公众平台设置的token,token的作用是用来的验证微信的请求是否合法。请确保你的token和微信公众平台设置的token一致。 * ### on_text 当用户向微信公众发送消息的时候,微信会POST一段XML到公众号的后台服务器,`on_text`方法中定义的代码会处理这个请求,这`on_text`方法中可以访问到的请求参数: * `params[:ToUserName]`: 发送请求的用户 * `params[:FromUserName]`: 公众号用户 * `params[:CreateTime]`: 创建时间 * `params[:MsgType]`: 消息类型,在这里是text * `params[:Content]`: 消息内容 * ### on_subscribe 当用户关注时,处理消息的接口: * `params[:ToUserName]`: 发送请求的用户 * `params[:FromUserName]`: 公众号用户 * `params[:CreateTime]`: 创建时间 * `params[:MsgType]`: 消息类型,在这里是event * `params[:Event]`: 事件类型,_**subscribe**_ * ### on_unsubscribe 当用户取消关注时,处理消息的接口: * `params[:ToUserName]`: 发送请求的用户 * `params[:FromUserName]`: 公众号用户 * `params[:CreateTime]`: 创建时间 * `params[:MsgType]`: 消息类型,在这里是event * `params[:Event]`: 事件类型,_**unsubscribe**_ * ### on_location 当用户向微信公众号分享位置信息时,微信会POST相应的位置信息到公众号后台服务器 * `params[:ToUserName]`: 发送请求的用户 * `params[:FromUserName]`: 公众号用户 * `params[:CreateTime]`: 创建时间 * `params[:MsgType]`: 消息类型,在这里是location * `params[:Location_X]`: 地理位置纬度 * `params[:Location_Y]`: 地理位置经度 * `params[:Scale]`: 地图缩放大小 * `params[:Label]`: 地理位置信息 ## 返回消息 * 返回文本消息: on_text do "Received a text message: #{params[:Content]}!!, and send back a text message!" end * 返回图文消息 on_text do [{ :title => '收到一个文本消息,返回两个图文消息', :description => 'desc', :picture_url => 'pic url', :url => 'url' }, { :title => '这是第二个图文消息', :description => 'desc1', :picture_url => 'pic url1', :url => 'url1' }] end ## Liscense © 2014 Wang Chao. This code is distributed under the MIT license.