Rails 记录一次异常的排除

xiaoxiao · 2018年05月11日 · 最后由 xiaoxiao 回复于 2018年05月12日 · 1414 次阅读

之前做过微信开发里面有段微信页面的授权请求,具体代码如下:

if session[:phone_unionid].blank? || session[:phone_unionid].nil?
  code = params[:code]
  # 如果code参数为空,则为认证第一步,重定向到微信认证
  if code.nil?
    redirect_to "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{player_weixin_config.appid}&redirect_uri=#{request.url}&response_type=code&scope=snsapi_userinfo&state=#{request.url}#wechat_redirect" and return
  end
  #如果code参数不为空,则认证到第二步,通过code获取openid,并保存到session中
  begin
    url    = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=#{player_weixin_config.appid}&secret=#{player_weixin_config.appsecret}&code=#{code}&grant_type=authorization_code"
    result=JSON.parse(URI.parse(url).read)
    result=JSON.parse(response_body)
    openid = result["openid"]
    access_token=result["access_token"]
  rescue Exception => e
    Rails.logger.debug("get open id error")
  end
end

之前在 rails4 中这段代码运行的好好的,升级了 rails5 之后,出现了错误 SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed,经过排除最后定位到 URI 问题,但是始终找不到原因,最后只能使用 Typhoeus 库解决了。具体替换代码

result=JSON.parse(URI.parse(url).read)替换成
response=Typhoeus::Request.get(url)
response_body=response.response_body

原因是你发请求的时候使用 SSLv3 协议,这个是不安全的,大部分服务器已经 ban 掉了这个协议

不知道微信的 api 服务器现在是什么情况,以前是有些支持,有些 ban 了,导致问题还不能稳定复现

嗯嗯,请教一下怎么个升级方法,是升级一下服务器的 openssl 版本么还是能在 rails 项目里面强制配置使用更高的协议,现在我只是把这个安全认证屏蔽了 verify_ssl: false。我刚看到一篇文章也是讲这个的,但是里面需要证书,没讲证书哪里下载。 https://makandracards.com/makandra/44445-restclient-net-http-how-to-communicate-with-self-signed-or-misconfigured-https-endpoints

在代码里面设置,根据你用来发起请求的类库不同,设置可能会有一点差别

你可以看下上面那个 PR 的 change

https://github.com/Eric-Guo/wechat/pull/133/files

需要 登录 后方可回复, 如果你还没有账号请 注册新账号