首先我們要知道微信公眾賬號(hào)分兩種片部,訂閱號(hào)和服務(wù)號(hào)涤姊,它們的區(qū)別如下圖:
從上圖可以看出訂閱號(hào)的功能其實(shí)很弱的暇番,如果沒有認(rèn)證的話,連自定義菜單都沒有思喊,尼瑪認(rèn)證還要出300塊壁酬,還不包過!:蘅巍舆乔!
不過,這對(duì)我們學(xué)習(xí)微信公眾賬號(hào)開發(fā)并沒有什么影響剂公,因?yàn)槲⑿盘峁┮粋€(gè)測(cè)試賬號(hào)供我們調(diào)試希俩。
首先我們先進(jìn)入開發(fā)者模式先,這需要我們有一個(gè)獨(dú)立的服務(wù)器纲辽。
然后進(jìn)行配置
url:www.xxx.com/weixin
token: abcd
然后微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的URL上颜武,GET請(qǐng)求攜帶四個(gè)參數(shù):
signature 微信加密簽名
timestamp 時(shí)間戳
nonce 隨機(jī)數(shù)
echostr
加密/校驗(yàn)流程如下:
將token、timestamp拖吼、nonce三個(gè)參數(shù)進(jìn)行字典序排序
將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
-
開發(fā)者獲得加密后的字符串可與signature對(duì)比鳞上,標(biāo)識(shí)該請(qǐng)求來源于微信
代碼如下: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
然后我們通過這個(gè)www.xxx.com/weixin 接口就可以做很多事情了,根據(jù)你發(fā)送的不同的文字消息可以返回不同的消息绿贞。比如你發(fā)因块,新聞,然后就返回一條圖文信息籍铁,發(fā)音樂涡上,然后就返回一首歌趾断,這個(gè)在方法里面進(jìn)行判斷就好了。
def text_message
content = params[:xml][:Content]
case content
when "音樂"
render xml: music_reply_message
when "新聞"
render xml: news_reply_message
end
end
然后自定義菜單的實(shí)現(xiàn)吩愧,這需要微信提供的APPID 和APPSECRET
接口調(diào)用請(qǐng)求說明
http請(qǐng)求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
由于這里的token有個(gè)憑證有效時(shí)間芋酌,然后我們?nèi)绻看卧L問都去獲取這個(gè)token的話,那實(shí)在是太浪費(fèi)了雁佳,而且微信對(duì)于token的每天的獲取次數(shù)是有限的脐帝。這個(gè)的話用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
未完糖权。堵腹。。