ruby 微信開發篇:驗證消息的確來自微信服務器、解析並得到xml消息的內容

由於微信官方沒有提供相關的代碼Demo,因此使用rails框架開發微信公衆號應用的小夥伴都會遇到一些不可避免的問題,好比消息驗證、加密解密以及微信支付開發的一些坑。

本篇文章就基於個人一些開發經驗,講解:css

  • 微信消息驗證
  • 非加密xml消息的解析

1. 驗證微信服務器消息的真實性

爲何要驗證:避免惡意消息攻擊

微信服務器發送至開發者填寫好的url消息,會攜帶下列參數:服務器

  • signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
  • timestamp 時間戳
  • nonce 隨機數
  • echostr 隨機字符串

官方給出的驗證思路是: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

2. 非加密xml消息的解析

微信服務器會將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

相關文章
相關標籤/搜索