首先我们要知道微信公众账号分两种,订阅号和服务号,它们的区别如下图:
从上图可以看出订阅号的功能其实很弱的,如果没有认证的话,连自定义菜单都没有,尼玛认证还要出300块,还不包过!!!
不过,这对我们学习微信公众账号开发并没有什么影响,因为微信提供一个测试账号供我们调试。
首先我们先进入开发者模式先,这需要我们有一个独立的服务器。
然后进行配置
url:www.xxx.com/weixin
token: abcd
然后微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:
signature 微信加密签名
timestamp 时间戳
nonce 随机数
echostr
加密/校验流程如下:
将token、timestamp、nonce三个参数进行字典序排序
将三个参数字符串拼接成一个字符串进行sha1加密
-
开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
代码如下:def check_weixin_legality
array = [Rails.configuration.weixin_token, params[:timestamp], params[:nonce]].sort
render :text => "Forbidden", :status => 403 if params[:signature] != Digest::SHA1.hexdigest(array.join)
end
然后我们通过这个www.xxx.com/weixin 接口就可以做很多事情了,根据你发送的不同的文字消息可以返回不同的消息。比如你发,新闻,然后就返回一条图文信息,发音乐,然后就返回一首歌,这个在方法里面进行判断就好了。
def text_message
content = params[:xml][:Content]
case content
when "音乐"
render xml: music_reply_message
when "新闻"
render xml: news_reply_message
end
end
然后自定义菜单的实现,这需要微信提供的APPID 和APPSECRET
接口调用请求说明
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
由于这里的token有个凭证有效时间,然后我们如果每次访问都去获取这个token的话,那实在是太浪费了,而且微信对于token的每天的获取次数是有限的。这个的话用cache来解决。
def get_access_token
if Rails.cache.read("access_token").nil?
params = {grant_type: "client_credential", appid:Rails.configuration.weixin_appid, secret: Rails.configuration.weixin_secret}
response = RestClient.get 'https://api.weixin.qq.com/cgi-bin/token', {params: params}
errcode = (JSON.parse response)["errcode"]
@access_token = (JSON.parse response)["access_token"]
Rails.cache.write("access_token", @access_token, expires_in: 5.minutes)
else
@access_token = Rails.cache.read("access_token")
end
end
未完。。。