由於微信官方沒有提供相關的代碼Demo,因此使用rails框架開發微信公衆號應用的小夥伴都會遇到一些不可避免的問題,好比消息驗證、加密解密以及微信支付開發的一些坑。
本篇文章就基於個人一些開發經驗,講解:css
爲何要驗證:避免惡意消息攻擊
微信服務器發送至開發者填寫好的url消息,會攜帶下列參數:服務器
官方給出的驗證思路是:1)將token、timestamp、nonce三個參數進行字典序排序 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信微信
這裏給出我用rails框架的消息驗證示例:框架
def check_signature(signature, timestamp, nonce) token = 'xxxxxxxxxxxxxx' # 公衆號後臺配置好的token arr = [token, timestamp, nonce] arr = arr.sort text = '' arr.each {|element| text += element} (Digest::SHA1.hexdigest(text)==signature) ? true : false # 驗證消息 end
微信服務器會將xml格式的消息內容發送至配置好的消息接收url,須要經過如下方法解析對應的xml消息:微信支付
content = Nokogiri::XML(request.body.read)
this
其中,request.body.read
會讀取微信服務器發送過來的消息消息,Nokogiri::XML
則將讀取到的消息轉化爲xml格式的對象。加密
以文本消息爲例,咱們來看看若是和去xml標籤的內容:url
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[this is a test] ]></Content> <MsgId>1234567890123456</MsgId> </xml>
獲取FromUserName
:code
username = content.at_css('FromUserName').children.text
至此,咱們簡單的瞭解了若是在rails框架中驗證微信消息的真實性以及解析對應的xml消息。xml