当前位置: 首页 > Linux

Ruby微信开发篇:验证消息确实来自微信服务器,解析获取xml消息内容

时间:2023-04-06 05:08:01 Linux

由于微信官方没有提供相关代码demo,使用rails框架开发微信的小伙伴公众号应用会遇到一些需要避免的问题,比如消息验证、加解密、微信支付开发中的一些陷阱。本文根据自己的一些开发经验,讲解:微信消息验证非加密xml消息的分析1.验证微信服务器消息的真实性为什么要验证:避免恶意消息攻击微信服务器并发送到开发者填写的url消息中,会携带以下参数:signature微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数和nonce参数。timestamptimestampnoncerandomnumberechostrrandomstring官方的验证思路是:1)将token,timestamp,nonce三个参数按字典顺序排序2)将三个参数字符串拼接成一个字符串进行sha1加密3)开发者得到的加密字符串可以与签名进行比对,判断请求来自微信。下面是一个使用rails框架进行消息验证的例子:defcheck_signature(signature,timestamp,nonce)token='xxxxxxxxxxxxxx'#公众号后台配置的tokenarr=[token,timestamp,nonce]arr=arr.sorttext=''arr.each{|元素|text+=element}(Digest::SHA1.hexdigest(text)==signature)?true:false#验证消息end2.非加密xml消息解析微信服务器会将xml格式的消息内容发送到配置的消息接收url,对应的xml消息需要通过以下方法解析:content=Nokogiri::XML(request.body.read)其中request.body.read会读取微信服务器发送的消息,Nokogiri::XML会将读取到的消息转换为xml格式的对象。以短信为例,我们看一下xml标签的内容:13488318601234567890123456获取FromUserName:username=content.at_css('FromUserName').children.text至此,我们对rails框架中如何验证微信消息的真实性以及解析相应的xml消息。